从本机.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数据类型没有问题,但现在使用新客户端,根据我使用的数据类型,我会得到不同的错误。
(顺便说一下,当我传入的值调用时,存储过程运行正常。这些异常都发生在Oracle Command对象实例的ExecuteNonQuery语句中。)
我使用以下组合更改了保存我的值以及参数的数据类型的数据类型。以下是各自的结果。
.NET数据类型' uint ' ODP .NET参数数据类型'OracleDbType.Int32' * System.OverflowException:对于Int32,值太大或太小。 在System.Convert.ToInt32(UInt32值) 在System.UInt32.System.IConvertible.ToInt32(IFormatProvider提供程序) 在System.Convert.ToInt32(对象值) 在Oracle.DataAccess.Client.OracleParameter.PreBind_Int32() 在Oracle.DataAccess.Client.OracleParameter.PreBind(OracleConnection conn,IntPtr errCtx,Int32 arraySize) 在Oracle.DataAccess.Client.OracleCommand.ExecuteNonQuery() 在ScoutLoaderService.EventLoader.Load()*
.NET数据类型' uint ' ODP .NET参数数据类型'OracleDbType.Int64' Oracle.DataAccess.Client.OracleException ORA-06502:PL / SQL:数字或值错误:字符到数字转换错误 ORA-06512:在第1行 Oracle.DataAccess.Client.OracleException.HandleErrorHelper(Int32 errCode,OracleConnection conn,IntPtr opsErrCtx,OpoSqlValCtx pOpoSqlValCtx,Object src,String procedure,Boolean bCheck) at Oracle.DataAccess.Client.OracleException.HandleError(Int32 errCode,OracleConnection conn,String procedure,IntPtr opsErrCtx,OpoSqlValCtx * pOpoSqlValCtx,Object src,Boolean bCheck) 在Oracle.DataAccess.Client.OracleCommand.ExecuteNonQuery() 在ScoutLoaderService.EventLoader.Load()*
.NET数据类型' Int64 ' ODP .NET参数数据类型'OracleDbType.Int64' Oracle.DataAccess.Client.OracleException ORA-06502:PL / SQL:数字或值错误:字符到数字转换错误 ORA-06512:在Oracle.DataAccess.Client.OracleException.HandleErrorHelper的第1行(Int32 errCode,OracleConnection conn,IntPtr opsErrCtx,OpoSqlValCtx pOpoSqlValCtx,Object src,String procedure,Boolean bCheck) at Oracle.DataAccess.Client.OracleException.HandleError(Int32 errCode,OracleConnection conn,String procedure,IntPtr opsErrCtx,OpoSqlValCtx * pOpoSqlValCtx,Object src,Boolean bCheck) 在Oracle.DataAccess.Client.OracleCommand.ExecuteNonQuery() 在ScoutLoaderService.EventLoader.Load()*
答案 0 :(得分:3)
结果表明问题与数据类型无关。我在Oracle参数中使用了Int64并且它工作正常,但只有在我的Command对象上设置BindByName属性为true之后。
显然是.NET System.Data.OracleClient提供程序的'BINDING BY NAME'的默认值,而Oracle.DataAccess的默认值是“BIND BY POSITION”。
如果捕获的Oracle异常会包含更多信息,例如哪个参数抛出异常,那就太好了。这可能帮助我更快地发现了这个问题。
答案 1 :(得分:0)
我认为OracleDecimal是走到这里的方式 看看Data Type Conversion;偶数here他们将int34映射到BINARY_INTEGER。
顺便说一句,OracleDecimal是巨大的,你不应该遇到任何问题这是另一个非常好的参考:OracleParameterClass。对于返回参数,OracleDbTypeEx可能非常有用。