使用uint数据类型的ODP .NET参数问题
从本地.NET数据提供程序更新到Oracles ODP.NET之后,我遇到了以下问题。
我有一个存储过程,它是包的一部分,它接受32个参数,除IN之外的所有IN都被指定为OUT参数。 无论如何,这是我遇到的问题。 我有一个日期参数作为varchar2传入,然后是3个其他参数也是varchar2。 至于其余的,他们都是NUMBER类型。
在我的.NET代码中,所有传递给存储过程的值都是字符串或int,有4个例外。 我有4种类型的UInt32数据。 它们的值对于int来说太大,所以使用uint。
这是问题。 当我们使用本地.NET数据提供者时,参数构造函数包含一个OracleType.Number数据类型,现在oracle参数构造函数具有OracleDbType.Int32和OracleDbType.Int64。 uint数据类型在设置为数据类型OracleType.Number的参数值时没有问题,但现在使用新客户端时,根据我使用的数据类型,我得到了不同的错误。
(顺便说一下,当我传入的值调用时,存储过程运行良好。这些异常都发生在Oracle Command对象实例的ExecuteNonQuery语句中。)
我已经使用以下组合改变了保存我的值的数据类型以及参数的数据类型。 这是每个的结果。
.NET数据类型“UINT” ODP .NET参数数据类型“OracleDbType.Int32” * System.OverflowException:值是太大或太小,一个Int32。 System.UInt32.System.IConvertible.ToInt32(IFormatProvider provider)在System.Convert.ToInt32(UInt32值)在System.Convert.ToInt32(对象值)在Oracle.DataAccess.Client.OracleParameter.PreBind_Int32()在Oracle.DataAccess .Client.OracleParameter.PreBind(OracleConnection conn,IntPtr errCtx,Int32 arraySize)at Oracle.DataAccess.Client.OracleCommand.ExecuteNonQuery()at ScoutLoaderService.EventLoader.Load()*
.NET数据类型'UINT' ODP .NET参数数据类型'OracleDbType.Int64' Oracle.DataAccess.Client.OracleException ORA-06502:PL / SQL:数字或值错误:字符数转换错误ORA-06512:在第1行的Oracle.DataAccess.Client.OracleException.HandleError(Int32 errCode,OracleConnection conn,String procedure)中的Oracle.DataAccess.Client.OracleException.HandleErrorHelper(Int32 errCode,OracleConnection conn,IntPtr opsErrCtx,OpoSqlValCtx pOpoSqlValCtx,Object src,String procedure,Boolean bCheck) ,IntPtr opsErrCtx,OpoSqlValCtx * pOpoSqlValCtx,Object src,Boolean bCheck)at Oracle.DataAccess.Client.OracleCommand.ExecuteNonQuery()at ScoutLoaderService.EventLoader.Load()*
.NET数据类型' 的Int64' ODP .NET参数数据类型'OracleDbType.Int64' Oracle.DataAccess.Client.OracleException ORA-06502:PL / SQL:数字或值错误:字符数转换错误ORA-06512:在第1行的Oracle.DataAccess.Client.OracleException.HandleError(Int32 errCode,OracleConnection conn,String procedure)中的Oracle.DataAccess.Client.OracleException.HandleErrorHelper(Int32 errCode,OracleConnection conn,IntPtr opsErrCtx,OpoSqlValCtx pOpoSqlValCtx,Object src,String procedure,Boolean bCheck) ,IntPtr opsErrCtx,OpoSqlValCtx * pOpoSqlValCtx,Object src,Boolean bCheck)at Oracle.DataAccess.Client.OracleCommand.ExecuteNonQuery()at ScoutLoaderService.EventLoader.Load()*
事实证明这个问题与数据类型无关。 我在Oracle参数中使用了Int64,并且它工作正常,但是只有在将Command对象上的BindByName属性设置为true之后才起作用。
显然是.NET System.Data.OracleClient提供程序'BINDING BY NAME'的默认值,而Oracle.DataAccess的默认值是'BIND BY POSITION'。
如果捕获到的Oracle异常会包含更多信息,比如哪个参数抛出异常,那本来就不错。 这可能帮助我尽早发现问题。
我认为OracleDecimal是去这里检查数据类型转换的方式; 甚至在这里他们将int34映射到BINARY_INTEGER。
顺便说一句,OracleDecimal是巨大的,你不应该遇到任何问题
这是另一个非常好的参考:OracleParameterClass。 对于返回参数,OracleDbTypeEx可以非常有帮助。
链接地址: http://www.djcxy.com/p/67179.html