无法使用Dapper将Boolean插入Oracle

时间:2017-09-13 08:29:41

标签: oracle dapper

我无法使用Dapper将布尔值插入Oracle 12数据库。

我得到的例外是 ORA-00932: inconsistent datatypes: expected NUMBER got BOOLEAN

CommandText是

INSERT INTO crossqueryb.counterparty (Id,Name,IsBroker,DefaultPortfolioId) VALUES (:Id,:Name,:IsBroker,:DefaultPortfolioId)

IsBroker被定义为NUMBER(1)

当我检查OracleParameter时,DbType和OracleDbType属性设置为Boolean。值为false,值的类型为object {bool}

参数作为IDictionary<string,object>传递给Query方法,而不是实际的域类型或匿名类型。

我是否需要为此编写自定义类型处理程序,或者我错过了其他明显的东西?

3 个答案:

答案 0 :(得分:1)

Oracle SQL does not have a BOOLEAN数据类型(PL/SQL does但不是SQL)。

  

IsBroker被定义为NUMBER(1)

您需要将布尔值转换为数值,因为Oracle不知道您打算如何执行转换(false/true =&gt; 0/1-1/+1或{{ 1}})。

答案 1 :(得分:1)

如果我们谈论使用Dapper连接到Oracle DB的.NET Core。 我将此与程序一起使用,并且可以正常工作。 Nuget安装Dapper.Oracle。

示例:

在您的C#模型中:

public bool someBoolValue { get; set; }

在您的C#存储库中:

using Dapper;
using Dapper.Oracle;

//in your method
var parameters = new OracleDynamicParameters();
parameters.Add("SOMESQLVARIABLE", yourModel.someBoolValue, OracleMappingType.Int32, ParameterDirection.Input);
parameters.Add("OUT_REFCURSOR", dbType: OracleMappingType.RefCursor, direction: ParameterDirection.Output);
var result = await _dbConnection.ExecuteAsync("my_proc",
                                              parameters,
                                              commandType: CommandType.StoredProcedure);
return result;

DB过程:

PROCEDURE my_proc(
    SOMESQLVARIABLE IN    NUMBER,
    out_refcursor   OUT   SYS_REFCURSOR
)AS
BEGIN
    OPEN out_refcursor FOR SELECT
                               some_column
                           FROM
                               my_table
                           WHERE 
                               my_col = SOMESQLVARIABLE; -- my_col is NUMBER(1,0)

END my_proc;

答案 2 :(得分:0)

如果要避免使用Dapper类型转换器,可以创建一个简单的Oracle函数:

create or replace function bool_to_num(value boolean) return number is
begin
    if (value is null) then
        return null;
    elsif (value) then
        return 1;
    else
        return 0;
    end if;
end;