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

时间:2017-04-27 11:25:57

标签: c# oracle odp.net

我正在使用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

2 个答案:

答案 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}}