c# - uint 数据类型的 ODP .NET 参数问题

标签 c# oracle odp.net

从 native .NET Oracle 数据提供程序更新到 Oracle ODP.NET 后,我遇到了以下问题。

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

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

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

(顺便说一句,当使用我传入的值调用时,存储过程运行良好。这些异常都发生在 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、对象 src、字符串过程、 bool bCheck) 在 Oracle.DataAccess.Client.OracleException.HandleError(Int32 errCode、OracleConnection conn、字符串过程、IntPtr opsErrCtx、OpoSqlValCtx* pOpoSqlValCtx、对象 src、 bool 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、对象 src、字符串过程、 bool bCheck) 在 Oracle.DataAccess.Client.OracleException.HandleError(Int32 errCode、OracleConnection conn、字符串过程、IntPtr opsErrCtx、OpoSqlValCtx* pOpoSqlValCtx、对象 src、 bool bCheck) 在 Oracle.DataAccess.Client.OracleCommand.ExecuteNonQuery() 在 ScoutLoaderService.EventLoader.Load()*

最佳答案

事实证明这个问题与数据类型无关。我在 Oracle 参数中使用了 Int64 并且它有效,但只有在将 Command 对象上的 BindByName 属性设置为 true 后才有效。

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

如果捕获的 Oracle 异常包含更多信息(例如哪个参数引发异常),那就太好了。这可能帮助我更快地发现问题。

关于c# - uint 数据类型的 ODP .NET 参数问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4098668/

相关文章:

c# - MVC 是特定于 Web 应用程序的吗?

c# - 根据连续调用之间耗时优化批量大小

c# - 如何使用 dapper 将多对多关系映射到列表

Oracle CLOB 与 BLOB

deployment - 无需安装即可部署ODP.NET

c# - 使用 EF Core 脚手架 Oracle 数据库失败并出现登录被拒绝错误

C# 代码卡住形式,我错过了一个中断的循环吗?

java - JSP 中的 Oracle 数据库连接

oracle - EF + ODP.NET : The specified value is not an instance of type 'Edm.Decimal'

c# - 在 C# 中将 HTTP 流保存到文件