我使用的ODP的OracleParameter构造函数:
public OracleParameter(string parameterName, object obj);
当我通过不同类型的像int或datetime对象,它工作正常。然而,当我使用布尔是这样的:
new OracleParameter("paramName", true)
它有一个“System.ArgumentException”崩溃。
为什么这不是布尔值工作?是否有已知类型的地方,这并不工作?
我使用的是Oracle ManagedDataAccess.dll v4.121.2.0
Oracle不支持bool
值作为它的列的数据类型。 PL / SQL是另一回事。
你首先要检查你的Oracle场bool
/参数的数据类型。
如果是像NUMBER
使用下面的代码:
new OracleParameter("paramName", OracleDbType.Int16, 1);
这里的第三个参数是NUMBER
值的大小。
正如你在评论中提到,您可以使用此qazxsw POI:
constructor
它允许你跳过定义大小。
否则,我将它转换为public OracleParameter(string parameterName, OracleDbType type, object obj,
ParameterDirection direction);
因为NUMBER
枚举不包含OracleDbType
值。
创建一个新的Oracle参数时,我总是指定OracleDbType。这使事情变得更加明确和防止的那种错误。
我不打算进入冗余解释Oracle数据库。但是希望你明白,Oracle类型不natch .NET类型如SQL Server类型做匹配。
例如,为了适应BOOLEAN
值到Oracle,您需要创建列int
。然而,这种尺寸比NUMBER(10)
更大,当你做int
返回Select col1. . .
。所以,你需要做的long
“适合”你的数据到Convert.ToInt32(reader["col1"])
在应用程序中。
布尔这里同样的事情。目前还没有确切的类型。有时,人们储存假布尔在int
,甚至Number(1)
为“Y” /“N”(例如)。所以,如果你的数据库有一些数字数据类型,只是做
Varchar2(1)
它会给你bool val = GetVal();
var p = new OracleParameter("paramName", Convert.ToInt32(val))
为1
和true
为0