带有布尔对象的odp net oracle参数构造函数

odp net oracle parameter constructor with boolean object

我正在使用 odp OracleParameter 构造函数:

public OracleParameter(string parameterName, object obj);

当我将不同类型作为对象(如 int 或 DateTime)传递时,它工作正常。 但是当我像这样使用 bool 时:

new OracleParameter("paramName", true)

它因 "System.ArgumentException" 而崩溃。

为什么这不适用于 bool 值? 是否存在这不起作用的已知类型?

我正在使用 Oracle ManagedDataAccess.dll v4.121.2.0

Oracle 不支持将 bool 值作为其列的数据类型。 PL/SQL另当别论。

您首先必须在 Oracle 中检查 bool field/parameter 的数据类型。

如果它类似于 NUMBER,请使用以下代码:

new OracleParameter("paramName", OracleDbType.Int16, 1);  

这里第三个参数是NUMBER值的大小。

正如您在评论中提到的那样,您可以使用此 constructor:

public OracleParameter(string parameterName, OracleDbType type, object obj, 
   ParameterDirection direction);

这允许您跳过定义大小。


否则我会将其转换为 NUMBER,因为 OracleDbType 枚举不包含 BOOLEAN.

的值

我在创建新的 Oracle 参数时总是指定 OracleDbType。它使事情更加明确并防止出现此类错误。

我不打算冗长地解释 Oracle DB。但是希望您了解 Oracle 类型不匹配 .NET 类型,例如 Sql 服务器类型确实匹配。

例如,要将 int 值放入 Oracle,您需要创建列 NUMBER(10)。但是,此大小大于 int,当您执行 Select col1. . . 时,它会 returns long。因此,您需要在您的应用程序中将 Convert.ToInt32(reader["col1"]) 到 "fit" 数据转换为 int

这里的布尔值也一样。没有确切的类型。有时人们将假布尔值存储在 Number(1) 中,甚至在 Varchar2(1) 中存储为 "Y"/"N"(例如)。所以,如果你的数据库有一些数字数据类型,就做

bool val = GetVal();
var p = new OracleParameter("paramName", Convert.ToInt32(val))

它会给你 1 true0 false