我有一个关于 Oracle 数据库 dapper 的简单问题,当我尝试将大尺寸字符串插入 Oracle Clob 时,它抛出异常:
Specified argument was out of the range of valid values.
然后我尝试修改这部分
param.Add(name: "body", value: obj.BODY, direction: ParameterDirection.Input);
我无法指定
OracleDbType.Clob
我应该改变什么才能使其正常工作?
它对我有用...
byte[] newvalue = System.Text.Encoding.Unicode.GetBytes(mystring);
var clob = new OracleClob(db);
clob.Write(newvalue, 0, newvalue.Length);
var parameter = new OracleDynamicParameters();
parameter.Add("PCLOB", clob);
var command = @"Insert into MYTABLE(CLOBFIELD) values (:PCLOB)";
var t = db.Execute(command, parameter);
获取 OracleDynamicParameters 类
此线程的解决方案https://github.com/DapperLib/Dapper/issues/142:
// Install-Package Dapper.Oracle
string longString = "...";
byte[] longStringBytes = Encoding.Unicode.GetBytes(longString);
OracleClob clob = new OracleClob(this.conn);
clob.Write(longStringBytes, 0, longStringBytes.Length);
OracleDynamicParameters dynamicParams = new OracleDynamicParameters();
dynamicParams.Add("fileContent", clob, OracleMappingType.Clob, ParameterDirection.Input);
this.conn.Execute("insert into someTable (fileContent) values (:fileContent)");
对于我们的软件,我们只是将大字符串转换为一个对象,Dapper 根据需要将其保存到 CLOB 列中:
await _dbContext.ExecuteAsync(OurInsertSqlStatement,
new {
record.Id,
record.Name,
record.CategoryId,
LargeString = record.LargeString as object
});
您可以使用更轻松地解决您的问题 Oracle.DataAccess.Client.OracleCommand 而不是 Dapper。
本节需要注意的重点;什么时候 创建查询时,您必须按照查询的顺序放置参数 数据库中的列。
var sql = "insert into Sample_Table (col_1, col_2, col_3, col_clob) values (:col_1_param, :col_2_param, :col_3_param, :col_clob)";
conn.Open();
OracleCommand cmd = new OracleCommand(sql, (OracleConnection)conn);
cmd.Parameters.Add("col_1_param", col_1_value);
cmd.Parameters.Add("col_2_param", col_2_value);
cmd.Parameters.Add("col_3_param", col_3_value);
cmd.Parameters.Add(new OracleParameter("col_clob", col_clob_value) {
OracleDbType = OracleDbType.Clob, Size = col_clob_value.Length });
var result = cmd.ExecuteNonQuery();
conn.Close();
刚刚检查了 Dapper 2.1.35,下面通过提及参数的大小(例如 65563 来保存 64 kb 的电子邮件内容)来使用动态参数
using (IDbConnection connection = new OracleConnection(_connStrBuilder.ConnectionString))
{
var p = new DynamicParameters();
p.Add("EMAILTO", emailInfo.EMAIL_TO, direction: ParameterDirection.Input, dbType: DbType.String);
p.Add("EMAILCC", emailInfo.EMAIL_CC, direction: ParameterDirection.Input, dbType: DbType.String);
p.Add("EMAILSUBJECT", emailInfo.EMAIL_SUBJECT, direction: ParameterDirection.Input, dbType: DbType.String);
p.Add("EMAILCONTENT", emailInfo.EMAIL_CONTENT, direction: ParameterDirection.Input, dbType: DbType.String, size:65563); //Very Large string greater than 4KB
string query = @"INSERT INTO TBL_EMAIL_INFO(EMAIL_TO,EMAIL_CC,EMAIL_SUBJECT,EMAIL_CONTENT)
VALUES
(:EMAILTO,:EMAILCC,:EMAILSUBJECT,:EMAILCONTENT)";
await connection.ExecuteAsync(query, param:p);
}