执行Oracle INSERT ALL时如何在Dapper中执行ExecuteAsync

时间:2019-05-10 17:19:04

标签: c# oracle dapper

我将以下SQL命令(简体)分配给var sql

INSERT ALL
    INTO ORACLETBL (COL_A,COL_B) VALUES ('A','B')
    INTO ORACLETBL (COL_A,COL_B) VALUES ('C','D')
SELECT * FROM dual;

当我在conn.Execute(sql);方法中执行void时,该命令可以正常工作。

当我对完全相同的SQL命令在await conn.ExecuteAsync(sql);方法中执行async Task时,出现异常“ ORA-00933:SQL命令未正确结束”。

每个人都明显知道我在做什么错吗?

2 个答案:

答案 0 :(得分:0)

我不确定为什么在一种情况下会引发异常,而在另一种情况下不会引发异常,但是当您打算使用ExecuteAsync时,它可能与您使用QueryAsync有关。

Execute不适用于selects,而是在执行操作时返回受影响的行数。

ExecuteAsync documentation中,您会注意到他们使用ExecuteAsync并仅收到受影响的行数,但是当他们想检索实际行时使用Query。

This stack post包含对ExecuteQuery之间区别的更详细说明。

答案 1 :(得分:0)

在语句末尾删除分号。

编辑:

也许这也是解决方案。

  string sql = "INSERT INTO Customers (CustomerName) Values (@CustomerName);";

  using (var connection = new SqlConnection("")) {
    connection.Open();

    var affectedRows = await connection.ExecuteAsync(sql,
      new[] {
        new {CustomerName = "John"},
        new {CustomerName = "Andy"},
        new {CustomerName = "Allan"}
      }
    );

  }

或尝试

SELECT 1 FROM DUAL

代替

SELECT * FROM DUAL