我正在使用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
答案 0 :(得分:1)
Oracle不支持将bool
值作为其列的DataType。 PL / SQL是另一回事。
首先,您必须检查Oracle中bool
字段/参数的数据类型。
如果类似于NUMBER
,请使用以下代码:
new OracleParameter("paramName", OracleDbType.Int16, 1);
此处第三个参数是NUMBER
值的大小。
正如您在评论中提到的,您可以使用此constructor:
public OracleParameter(string parameterName, OracleDbType type, object obj,
ParameterDirection direction);
允许您跳过定义尺寸。
否则我会将其转换为NUMBER
,因为OracleDbType
枚举不包含BOOLEAN
的值。
我在创建新的Oracle参数时总是指定OracleDbType。它使事情更加明确,并防止排序错误。
答案 1 :(得分:0)
我不会再赘述Oracle DB。但是要让您了解Oracle类型不会像SQL Server类型那样匹配.NET类型。
例如,要使int
的值适合Oracle,您需要创建列NUMBER(10)
。但是,此大小大于int
,当您执行Select col1. . .
时,它将返回long
。因此,您需要执行Convert.ToInt32(reader["col1"])
才能将数据“适配”到应用程序中的int
中。
与boolean相同。没有确切的类型。有时人们在Number(1)
中甚至在Varchar2(1)
中将假布尔存储为“ Y” /“ N”(例如)。因此,如果您的数据库具有某种数字数据类型,则只需
bool val = GetVal();
var p = new OracleParameter("paramName", Convert.ToInt32(val))
它将为您提供1
的{{1}}和true
的{{1}}