-1

I'm trying to execute multiple inserts at once like this

var mydict =  new Dictionary<int, int> { { 1, 2 }, { 3, 4 } };

var query = string.Join("; ", mydict.Select(x => $"insert into myTable (colA, colB) values ({x.Key},{x.Value})"));

using(var connection = new new OracleConnection(dbConnectionString))
{
    var command = connection.CreateCommand();
    command.CommandText = query;
    command.ExecuteNonQuery();
}     

but i got Oracle.ManagedDataAccess.Client.OracleException: 'ORA-00911: invalid character' even I can manually execute the generated query from sqldeveloper with no issues.

I alreay did this in the past with sqlserver and sqlite, and i had no issues.

why this happens? is there a cleaner way?


here is the generated sql:

insert into myTable (colA, colB) values (72520,2452); insert into myTable (colA, colB) values (73293,2453)
4

3 回答 3

3

如果是Oracle,您应该生成匿名块,例如:

 begin -- wrap in begin .. end
   insert into myTable (colA, colB) values (72520, 2452); 
   insert into myTable (colA, colB) values (73293, 2453); -- do not forget last ;
 end;

在你的情况下

var query = 
  "begin " + 
     string.Join("; ", mydict
       .Select(x => $"insert into myTable (colA, colB) values ({x.Key},{x.Value})")) + 
  "; end;";

免责声明:不要这样做(但实施bulk insert,请参阅MT0答案)如果

  1. 您必须插入字符串(SQL 注入
  2. 您有很多记录要插入(批量操作工作得更快
  3. 您经常执行调用(硬解析,请参阅https://blogs.oracle.com/sql/improve-sql-query-performance-by-using-bind-variables
于 2018-04-10T12:49:31.617 回答
1

为什么会这样?

Oracle 不允许在一个命令中执行多个语句。

SQL 开发人员会将您的字符串拆分为多个语句并依次执行每个语句,并将它们作为多个命令运行,

有更清洁的方法吗?

使用批量/批量插入:

这样您就可以使用绑定值,而不是将插入语句构建为一个巨大的字符串。

于 2018-04-10T12:52:29.763 回答
1

这不是你应该这样做的方式。首选方式是这样的:

var command = connection.CreateCommand();
command.CommandText = "insert into myTable (colA, colB) values (:ColA, :ColB)";
command.Parameters.Add("ColA", OracleDbType.Int64, ParameterDirection.Input);
command.Parameters.Add("ColB", OracleDbType.Int64, ParameterDirection.Input);

foreach ( var entry in mydict ) {
   command.Parameters["ColA"].Value = entry.Key;
   command.Parameters["ColA"].Value = entry.Value;
   command.ExecuteNonQuery();
}
于 2018-04-10T13:21:09.743 回答