【问题标题】:How to ExecuteAsync in Dapper when doing an Oracle INSERT ALL执行 Oracle INSERT ALL 时如何在 Dapper 中执行异步
【发布时间】:2019-05-10 17:19:03
【问题描述】:

我将以下 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;

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

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

我做错了什么对任何人都很明显吗?

【问题讨论】:

    标签: c# oracle dapper


    【解决方案1】:

    删除语句末尾的分号。

    编辑:

    也许这也是一个解决方案。

      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
    

    【讨论】:

    • 没有分号它不起作用,即使是同步方式。但它的行为很奇怪(似乎在没有执行操作 的情况下结束并抛出异常)。在 VS2019 中可能存在调试问题。
    • 这个问题原来是在表被锁的情况下执行SQL命令的愚蠢尝试,导致各种不必要的兔子踪迹。一旦解决了根本问题(“重新启动计算机!”),该命令在删除分号的情况下正常运行;无需进一步更改。
    【解决方案2】:

    我不确定为什么它会在一种情况下引发异常,但在另一种情况下却没有,但这可能与您使用ExecuteAsync 有关,而您的意思是使用QueryAsync

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

    ExecuteAsync documentation 中,您会注意到他们使用 ExecuteAsync 并且只接收受影响的行数,但他们在想要检索实际行时使用 Query。

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

    【讨论】:

    • 这是一个 INSERT 语句,而不是一个 SELECT(尽管 Oracle 的“insert many”语法包括一个 SELECT 子查询)。无论如何,使用 QueryAsync 会引发相同的异常。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-01-17
    • 1970-01-01
    • 2016-11-09
    • 1970-01-01
    • 1970-01-01
    • 2010-11-21
    相关资源
    最近更新 更多