【问题标题】:Cannot insert Boolean into Oracle using Dapper无法使用 Dapper 将布尔值插入 Oracle
【发布时间】:2017-09-13 08:29:41
【问题描述】:

我在使用 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 方法,而不是作为实际的域类型或匿名类型。

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

【问题讨论】:

    标签: oracle dapper


    【解决方案1】:

    如果我们谈论 .NET Core 使用 Dapper 连接到 Oracle DB。 我将它与程序一起使用,它可以工作。 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;
    

    数据库过程:

    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】:

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

      IsBroker 被定义为NUMBER(1)

      您需要将布尔值转换为数值,因为 Oracle 不知道您打算如何执行转换(false/true => 0/1-1/+1-7/3)。

      【讨论】:

      • 是的,我有点期待 Dapper 为我做这件事,你是说它没有,我需要编写自己的 TypeHandler?
      • @John 我没有使用 Dapper,所以只能告诉你甲骨文方面发生了什么。但是,this answerthis documentation page 会建议,是的,类型处理程序就是答案。
      • @John:根据这个答案:stackoverflow.com/questions/42365865/…,TypeHandler 仅适用于查询,不适用于参数。您可以尝试该答案的解决方案。
      【解决方案3】:

      如果你想避免 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;
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2011-11-01
        • 1970-01-01
        • 1970-01-01
        • 2018-12-07
        • 2011-08-28
        • 2011-11-11
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多