带有布尔对象的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
true
和 0
false
我正在使用 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
true
和 0
false