如何使用Dapper向oracle clob类型中插入字符串?

问题描述 投票:0回答:5

我有一个关于 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

我应该改变什么才能使其正常工作?

oracle dapper
5个回答
3
投票

它对我有用...

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);

您可以在 https://gist.github.com/vijaysg/3096151

获取 OracleDynamicParameters 类

1
投票

此线程的解决方案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)");

1
投票

对于我们的软件,我们只是将大字符串转换为一个对象,Dapper 根据需要将其保存到 CLOB 列中:

await _dbContext.ExecuteAsync(OurInsertSqlStatement,
    new {
           record.Id,
           record.Name,
           record.CategoryId,
           LargeString = record.LargeString as object
});

0
投票
  • 您可以使用更轻松地解决您的问题 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(); 
    

0
投票

刚刚检查了 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);
                }
© www.soinside.com 2019 - 2024. All rights reserved.