我无法使用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方法,而不是实际的域类型或匿名类型。
我是否需要为此编写自定义类型处理程序,或者我错过了其他明显的东西?
答案 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;