EnterpriseLibiary 5.0 调用存储过程,”ORA-01460: 转换请求无法实现或不合理“的解决
项目在做异常日志记录时出现“ORA-01460: 转换请求无法实现或不合理“,因为项目使用的是EL5.0做数据持久层的操作,网上资料很少,自己摸索解决的。
/// <summary> /// 将异常日志保存到数据库中 /// </summary> public static void saveExceptionLog(XtYcrz xy) { try { Database db = DatabaseFactory.CreateDatabase(); DbCommand command = db.GetStoredProcCommand("SaveExceptionLog"); db.AddInParameter(command, "pYcxx", DbType.String, xy.Ycxx); db.AddInParameter(command, "pYcct", DbType.String, xy.Ycct); db.AddInParameter(command, "pYcmc", DbType.String, xy.Ycmc); db.AddInParameter(command, "pYcms", DbType.String, xy.Ycms); db.AddInParameter(command, "pYhid", DbType.String, xy.Yhid); db.AddInParameter(command, "pYclx", DbType.String, xy.Yclx); db.AddOutParameter(command, "pOutPut", DbType.String, 50); //输出 db.ExecuteNonQuery(command); /**////执行存储过程 string result = db.GetParameterValue(command,"pOutPut").ToString(); //得到输出参数的值 } catch (System.Exception ex) { DevExpress.XtraEditors.XtraMessageBox.Show("异常信息数据库保存失败,请联系系统管理员处理:\r\n"+ex.Message, "错误信息", MessageBoxButtons.OK, MessageBoxIcon.Error); } }
存储过程的代码:
CREATE OR REPLACE procedure HMS.SaveExceptionLog( pYcxx in Varchar2, pYcct in Varchar2, pYcmc in Varchar2, pYcms in Varchar2, pYhid in Varchar2, pYclx in Varchar2, pOutPut Out Varchar2) is PRAGMA AUTONOMOUS_TRANSACTION; pid NUMBER(10) := 0; begin select SEQ_XT_YCRZ.NEXTVAL INTO pid From Dual; Insert into Xt_Ycrz (Id,Ycrq,Ycxx,Ycct,Ycmc,Ycms,Yhid,Yclx,Ycrqsy) values (pid,sysdate,pYcxx,pYcct,pYcmc,pYcms,pYhid,pYclx,to_char(sysdate,'YYYYMMDD')); pOutPut:= '1'; commit; EXCEPTION WHEN OTHERS THEN pOutPut := '-1'; ROLLBACK; end SaveExceptionLog; /
CREATE TABLE HMS.XT_YCRZ ( ID NUMBER(10) NOT NULL, YCRQ DATE, YCXX VARCHAR2(500 BYTE), YCCT VARCHAR2(200 BYTE), YCMC VARCHAR2(200 BYTE), YHID VARCHAR2(20 BYTE), YCLX VARCHAR2(10 BYTE), YCRQSY VARCHAR2(20 BYTE), YCMS CLOB );
使用以上代码保存异常时。如果异常超过信息描述的太长时就会抛出错误:ORA-01460: 转换请求无法实现或不合理
由于EL5.0的参数使用的是DbType,于是考虑DbType与Oracle的数据类型对应关系。
有如下类型的映射对照:
System.Data.SqlClient.SqlDbType
System.Data.OleDb.OleDbType
System.Data.Odbc.OdbcType
System.Data.OracleClient.OracleType
格式:
DbType.枚举名(枚举值) = DbType.枚举名(枚举值)
=========== System.Data.SqlClient.SqlDbType =========
System.Data.SqlClient.SqlDbType.BigInt(0) = System.Data.DbType.Int64(12)
System.Data.SqlClient.SqlDbType.Binary(1) = System.Data.DbType.Binary(1)
System.Data.SqlClient.SqlDbType.Bit(2) = System.Data.DbType.Boolean(3)
System.Data.SqlClient.SqlDbType.Char(3) = System.Data.DbType.AnsiStringFixedLength(22)
System.Data.SqlClient.SqlDbType.DateTime(4) = System.Data.DbType.DateTime(6)
System.Data.SqlClient.SqlDbType.Decimal(5) = System.Data.DbType.Decimal(7)
System.Data.SqlClient.SqlDbType.Float(6) = System.Data.DbType.Double(8)
System.Data.SqlClient.SqlDbType.Image(7) = System.Data.DbType.Binary(1)
System.Data.SqlClient.SqlDbType.Int(8) = System.Data.DbType.Int32(11)
System.Data.SqlClient.SqlDbType.Money(9) = System.Data.DbType.Currency(4)
System.Data.SqlClient.SqlDbType.NChar(10) = System.Data.DbType.StringFixedLength(23)
System.Data.SqlClient.SqlDbType.NText(11) = System.Data.DbType.String(16)
System.Data.SqlClient.SqlDbType.NVarChar(12) = System.Data.DbType.String(16)
System.Data.SqlClient.SqlDbType.Real(13) = System.Data.DbType.Single(15)
System.Data.SqlClient.SqlDbType.UniqueIdentifier(14) = System.Data.DbType.Guid(9)
System.Data.SqlClient.SqlDbType.SmallDateTime(15) = System.Data.DbType.DateTime(6)
System.Data.SqlClient.SqlDbType.SmallInt(16) = System.Data.DbType.Int16(10)
System.Data.SqlClient.SqlDbType.SmallMoney(17) = System.Data.DbType.Currency(4)
System.Data.SqlClient.SqlDbType.Text(18) = System.Data.DbType.AnsiString(0)
System.Data.SqlClient.SqlDbType.Timestamp(19) = System.Data.DbType.Binary(1)
System.Data.SqlClient.SqlDbType.TinyInt(20) = System.Data.DbType.Byte(2)
System.Data.SqlClient.SqlDbType.VarBinary(21) = System.Data.DbType.Binary(1)
System.Data.SqlClient.SqlDbType.VarChar(22) = System.Data.DbType.AnsiString(0)
System.Data.SqlClient.SqlDbType.Variant(23) = System.Data.DbType.Object(13)
System.Data.SqlClient.SqlDbType.Xml(25) = System.Data.DbType.Xml(25)
System.Data.SqlClient.SqlDbType.Udt(29) = System.Data.DbType.Object(13)
System.Data.SqlClient.SqlDbType.Structured(30) = System.Data.DbType.Object(13)
System.Data.SqlClient.SqlDbType.Date(31) = System.Data.DbType.Date(5)
System.Data.SqlClient.SqlDbType.Time(32) = System.Data.DbType.Time(17)
System.Data.SqlClient.SqlDbType.DateTime2(33) = System.Data.DbType.DateTime2(26)
System.Data.SqlClient.SqlDbType.DateTimeOffset(34) = System.Data.DbType.DateTimeOffset(27)
===========System.Data.OleDb.OleDbType=========
System.Data.OleDb.OleDbType.Empty(0) = System.Data.DbType.Object(13)
System.Data.OleDb.OleDbType.SmallInt(2) = System.Data.DbType.Int16(10)
System.Data.OleDb.OleDbType.Integer(3) = System.Data.DbType.Int32(11)
System.Data.OleDb.OleDbType.Single(4) = System.Data.DbType.Single(15)
System.Data.OleDb.OleDbType.Double(5) = System.Data.DbType.Double(8)
System.Data.OleDb.OleDbType.Currency(6) = System.Data.DbType.Currency(4)
System.Data.OleDb.OleDbType.Date(7) = System.Data.DbType.DateTime(6)
System.Data.OleDb.OleDbType.BSTR(8) = System.Data.DbType.String(16)
System.Data.OleDb.OleDbType.IDispatch(9) = System.Data.DbType.Object(13)
System.Data.OleDb.OleDbType.Error(10) = System.Data.DbType.Int32(11)
System.Data.OleDb.OleDbType.Boolean(11) = System.Data.DbType.Boolean(3)
System.Data.OleDb.OleDbType.Variant(12) = System.Data.DbType.Object(13)
System.Data.OleDb.OleDbType.IUnknown(13) = System.Data.DbType.Object(13)
System.Data.OleDb.OleDbType.Decimal(14) = System.Data.DbType.Decimal(7)
System.Data.OleDb.OleDbType.TinyInt(16) = System.Data.DbType.SByte(14)
System.Data.OleDb.OleDbType.UnsignedTinyInt(17) = System.Data.DbType.Byte(2)
System.Data.OleDb.OleDbType.UnsignedSmallInt(18) = System.Data.DbType.UInt16(18)
System.Data.OleDb.OleDbType.UnsignedInt(19) = System.Data.DbType.UInt32(19)
System.Data.OleDb.OleDbType.BigInt(20) = System.Data.DbType.Int64(12)
System.Data.OleDb.OleDbType.UnsignedBigInt(21) = System.Data.DbType.UInt64(20)
System.Data.OleDb.OleDbType.Filetime(64) = System.Data.DbType.DateTime(6)
System.Data.OleDb.OleDbType.Guid(72) = System.Data.DbType.Guid(9)
System.Data.OleDb.OleDbType.Binary(128) = System.Data.DbType.Binary(1)
System.Data.OleDb.OleDbType.Char(129) = System.Data.DbType.AnsiStringFixedLength(22)
System.Data.OleDb.OleDbType.WChar(130) = System.Data.DbType.StringFixedLength(23)
System.Data.OleDb.OleDbType.Numeric(131) = System.Data.DbType.Decimal(7)
System.Data.OleDb.OleDbType.DBDate(133) = System.Data.DbType.Date(5)
System.Data.OleDb.OleDbType.DBTime(134) = System.Data.DbType.Time(17)
System.Data.OleDb.OleDbType.DBTimeStamp(135) = System.Data.DbType.DateTime(6)
System.Data.OleDb.OleDbType.PropVariant(138) = System.Data.DbType.Object(13)
System.Data.OleDb.OleDbType.VarNumeric(139) = System.Data.DbType.VarNumeric(21)
System.Data.OleDb.OleDbType.VarChar(200) = System.Data.DbType.AnsiString(0)
System.Data.OleDb.OleDbType.LongVarChar(201) = System.Data.DbType.AnsiString(0)
System.Data.OleDb.OleDbType.VarWChar(202) = System.Data.DbType.String(16)
System.Data.OleDb.OleDbType.LongVarWChar(203) = System.Data.DbType.String(16)
System.Data.OleDb.OleDbType.VarBinary(204) = System.Data.DbType.Binary(1)
System.Data.OleDb.OleDbType.LongVarBinary(205) = System.Data.DbType.Binary(1)
=========System.Data.Odbc.OdbcType===========
System.Data.Odbc.OdbcType.BigInt(1) = System.Data.DbType.Int64(12)
System.Data.Odbc.OdbcType.Binary(2) = System.Data.DbType.Binary(1)
System.Data.Odbc.OdbcType.Bit(3) = System.Data.DbType.Boolean(3)
System.Data.Odbc.OdbcType.Char(4) = System.Data.DbType.AnsiStringFixedLength(22)
System.Data.Odbc.OdbcType.DateTime(5) = System.Data.DbType.DateTime(6)
System.Data.Odbc.OdbcType.Decimal(6) = System.Data.DbType.Decimal(7)
System.Data.Odbc.OdbcType.Numeric(7) = System.Data.DbType.Decimal(7)
System.Data.Odbc.OdbcType.Double(8) = System.Data.DbType.Double(8)
System.Data.Odbc.OdbcType.Image(9) = System.Data.DbType.Binary(1)
System.Data.Odbc.OdbcType.Int(10) = System.Data.DbType.Int32(11)
System.Data.Odbc.OdbcType.NChar(11) = System.Data.DbType.StringFixedLength(23)
System.Data.Odbc.OdbcType.NText(12) = System.Data.DbType.String(16)
System.Data.Odbc.OdbcType.NVarChar(13) = System.Data.DbType.String(16)
System.Data.Odbc.OdbcType.Real(14) = System.Data.DbType.Single(15)
System.Data.Odbc.OdbcType.UniqueIdentifier(15) = System.Data.DbType.Guid(9)
System.Data.Odbc.OdbcType.SmallDateTime(16) = System.Data.DbType.DateTime(6)
System.Data.Odbc.OdbcType.SmallInt(17) = System.Data.DbType.Int16(10)
System.Data.Odbc.OdbcType.Text(18) = System.Data.DbType.AnsiString(0)
System.Data.Odbc.OdbcType.Timestamp(19) = System.Data.DbType.Binary(1)
System.Data.Odbc.OdbcType.TinyInt(20) = System.Data.DbType.Byte(2)
System.Data.Odbc.OdbcType.VarBinary(21) = System.Data.DbType.Binary(1)
System.Data.Odbc.OdbcType.VarChar(22) = System.Data.DbType.AnsiString(0)
System.Data.Odbc.OdbcType.Date(23) = System.Data.DbType.Date(5)
System.Data.Odbc.OdbcType.Time(24) = System.Data.DbType.Time(17)
=========System.Data.OracleClient.OracleType===========
System.Data.OracleClient.OracleType.BFile(1) = System.Data.DbType.Binary(1)
System.Data.OracleClient.OracleType.Blob(2) = System.Data.DbType.Binary(1)
System.Data.OracleClient.OracleType.Char(3) = System.Data.DbType.AnsiStringFixedLength(22)
System.Data.OracleClient.OracleType.Clob(4) = System.Data.DbType.AnsiString(0)
System.Data.OracleClient.OracleType.Cursor(5) = System.Data.DbType.Object(13)
System.Data.OracleClient.OracleType.DateTime(6) = System.Data.DbType.DateTime(6)
System.Data.OracleClient.OracleType.IntervalDayToSecond(7) = System.Data.DbType.Object(13)
System.Data.OracleClient.OracleType.IntervalYearToMonth(8) = System.Data.DbType.Int32(11)
System.Data.OracleClient.OracleType.LongRaw(9) = System.Data.DbType.Binary(1)
System.Data.OracleClient.OracleType.LongVarChar(10) = System.Data.DbType.AnsiString(0)
System.Data.OracleClient.OracleType.NChar(11) = System.Data.DbType.StringFixedLength(23)
System.Data.OracleClient.OracleType.NClob(12) = System.Data.DbType.String(16)
System.Data.OracleClient.OracleType.Number(13) = System.Data.DbType.VarNumeric(21)
System.Data.OracleClient.OracleType.NVarChar(14) = System.Data.DbType.String(16)
System.Data.OracleClient.OracleType.Raw(15) = System.Data.DbType.Binary(1)
System.Data.OracleClient.OracleType.RowId(16) = System.Data.DbType.AnsiString(0)
System.Data.OracleClient.OracleType.Timestamp(18) = System.Data.DbType.DateTime(6)
System.Data.OracleClient.OracleType.TimestampLocal(19) = System.Data.DbType.DateTime(6)
System.Data.OracleClient.OracleType.TimestampWithTZ(20) = System.Data.DbType.DateTime(6)
System.Data.OracleClient.OracleType.VarChar(22) = System.Data.DbType.AnsiString(0)
System.Data.OracleClient.OracleType.Byte(23) = System.Data.DbType.Byte(2)
System.Data.OracleClient.OracleType.UInt16(24) = System.Data.DbType.UInt16(18)
System.Data.OracleClient.OracleType.UInt32(25) = System.Data.DbType.UInt32(19)
System.Data.OracleClient.OracleType.SByte(26) = System.Data.DbType.SByte(14)
System.Data.OracleClient.OracleType.Int16(27) = System.Data.DbType.Int16(10)
System.Data.OracleClient.OracleType.Int32(28) = System.Data.DbType.Int32(11)
System.Data.OracleClient.OracleType.Float(29) = System.Data.DbType.Single(15)
System.Data.OracleClient.OracleType.Double(30) = System.Data.DbType.Double(8)
于是将调用的代码修改下。将
db.AddInParameter(command, "pYcms", DbType.String, xy.Ycms);
修改为
db.AddInParameter(command, "pYcms", DbType.AnsiString, xy.Ycms);
OK,到此异常太长的也能够保存成功了。
第一次写博客,大家不要见笑。写的不对的地方还希望大家一起讨论。