使用uint数据类型的ODP .NET参数问题

从本机.NET oracle数据提供程序更新到Oracles ODP.NET后,我遇到了以下问题。

我有一个存储过程是包的一部分,它接受32个参数,所有IN只有一个,指定为OUT参数。 无论如何,这是我遇到的问题。 我有一个日期参数作为varchar2传入,然后3个其他参数也是varchar2。 至于其余部分,它们都是NUMBER类型。

在我的.NET代码中,传递给存储过程的所有值都是字符串或int,有4个例外。 我有4项UInt32类型的数据。 它们持有的值对于int来说太大了,因此使用了uint。

这是问题所在。 当我们使用本机.NET oracle数据提供程序时,参数构造函数包含OracleType.Number的数据类型,现在oracle参数构造函数具有OracleDbType.Int32和OracleDbType.Int64。 当设置为数据类型OracleType.Number的参数值时,uint数据类型没有问题,但现在使用新客户端,根据我使用的数据类型,我会得到不同的错误。

(顺便说一句,当我传入的值调用时,存储过程运行正常。这些exception都发生在Oracle Command对象实例的ExecuteNonQuery语句中。)

我使用以下组合更改了保存我的值以及参数的数据类型的数据类型。 以下是各自的结果。

.NET数据类型‘uint’ODP .NET参数数据类型‘OracleDbType.Int32’ * System.OverflowException:对于Int32,值太大或太小。 在Oracle.DataAccess的Oracle.DataAccess.Client.OracleParameter.PreBind_Int32()的System.Convert.ToInt32(对象值)的System.UInt32.System.IConvertible.ToInt32(IFormatProvider提供程序)的System.Convert.ToInt32(UInt32值)处ScoutLoaderService.EventLoader.Load()*中的Oracle.DataAccess.Client.OracleCommand.ExecuteNonQuery()中的.Client.OracleParameter.PreBind(OracleConnection conn,IntPtr errCtx,Int32 arraySize)

.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) ,在ScoutLoaderService.EventLoader.Load()*的Oracle.DataAccess.Client.OracleCommand.ExecuteNonQuery(),IntPtr opsErrCtx,OpoSqlValCtx * pOpoSqlValCtx,Object src,Boolean bCheck)

.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) ,在ScoutLoaderService.EventLoader.Load()*的Oracle.DataAccess.Client.OracleCommand.ExecuteNonQuery(),IntPtr opsErrCtx,OpoSqlValCtx * pOpoSqlValCtx,Object src,Boolean bCheck)

结果certificate问题与数据类型无关。 我在Oracle参数中使用了Int64并且它工作正常,但只有在我的Command对象上设置BindByName属性为true之后。

显然是.NET System.Data.OracleClient提供程序’BINDING BY NAME’的默认值,而Oracle.DataAccess的默认值是“BIND BY POSITION”。

如果捕获的Oracleexception会包含更多信息,例如哪个参数抛出exception,那就太好了。 这可能帮助我更快地发现了这个问题。

我认为OracleDecimal是去这里检查数据类型转换的方法 ; 甚至在这里他们将int34映射到BINARY_INTEGER。

顺便说一句,OracleDecimal是巨大的,你不应该遇到任何问题

这是另一个非常好的参考: OracleParameterClass 。 对于返回参数, OracleDbTypeEx可能非常有用。