C# 带有布尔对象的odp net oracle参数构造函数
我正在使用odp OracleParameter构造函数:C# 带有布尔对象的odp net oracle参数构造函数,c#,oracle,odp.net,C#,Oracle,Odp.net,我正在使用odp OracleParameter构造函数: public OracleParameter(string parameterName, object obj); 当我将不同的类型作为int或DateTime之类的对象传递时,效果很好。 但是,当我像这样使用bool时: new OracleParameter("paramName", true) 它因“System.ArgumentException”而崩溃 为什么这不适用于布尔值? 是否有已知的类型不起作用 我正在使用Orac
public OracleParameter(string parameterName, object obj);
当我将不同的类型作为int或DateTime之类的对象传递时,效果很好。
但是,当我像这样使用bool时:
new OracleParameter("paramName", true)
它因“System.ArgumentException”而崩溃
为什么这不适用于布尔值?
是否有已知的类型不起作用
我正在使用Oracle ManagedDataAccess.dll v4.121.2.0Oracle不支持将
bool
值作为其列的数据类型。PL/SQL是另一回事
首先必须检查Oracle中bool
字段/参数的数据类型
如果是类似于NUMBER
的代码,请使用以下代码:
new OracleParameter("paramName", OracleDbType.Int16, 1);
这里第三个参数是数值的大小
正如您在评论中提到的,您可以使用:
这允许您跳过定义大小
否则,我会将其转换为NUMBER
,因为OracleDbType
enum不包含BOOLEAN
的值
创建新Oracle参数时,我始终指定OracleDbType。它使事情更加明确,并防止出现类似的错误。我不打算讨论Oracle DB。但我想让您了解Oracle类型与Sql Server类型不匹配
例如,要将int
值放入Oracle,需要创建列NUMBER(10)
。但是,此大小大于int
,当您选择列时代码>返回long
。因此,您需要执行Convert.ToInt32(读卡器[“col1”])
以将数据“适配”到应用程序中的int
这里的布尔值也是一样。没有确切的类型。有时人们在Number(1)
中存储假布尔值,甚至在Varchar2(1)
中存储假布尔值为“Y”/“N”(例如)。因此,如果您的数据库有一些数字数据类型,只需执行以下操作
bool val = GetVal();
var p = new OracleParameter("paramName", Convert.ToInt32(val))
对于true
它将为您提供1
,对于false它将为您提供0
您在构造函数中使用输入值做什么?它不是我自己的构造函数。感谢你,这是我需要的信息的一部分。我从哪里得到这些信息,而不是绊倒在他们身上?还有其他类型的不起作用吗?@DanF至于其他类型的不起作用,我现在想不出任何类型。顺便说一句,为所有参数指定类型是一个很好的实践,除了bool类型之外,大多数参数都是自解释的。如果这解决了您的问题,请将答案标记为已接受。谢谢。你贴错了构造器。所需的是this one@DanF,我当前仅在使用Out参数时才使用带方向参数的构造函数。否则,我将使用我在回答中为in参数发布的参数,尽管将带有direction参数的参数也用于in参数也没有坏处。我尝试了您发布的参数,但oracle文档将第三个int参数标记为size。这就是我使用另一个的原因。您发布的内容不适用于我的项目。也许我们使用不同的图书馆?
bool val = GetVal();
var p = new OracleParameter("paramName", Convert.ToInt32(val))