执行 Oracle INSERT ALL 时如何在 Dapper 中执行异步

Posted

技术标签:

【中文标题】执行 Oracle INSERT ALL 时如何在 Dapper 中执行异步【英文标题】:How to ExecuteAsync in Dapper when doing an Oracle INSERT ALL 【发布时间】: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 命令未正确结束”。

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

【问题讨论】:

【参考方案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 会引发相同的异常。

以上是关于执行 Oracle INSERT ALL 时如何在 Dapper 中执行异步的主要内容,如果未能解决你的问题,请参考以下文章

Oracle insert all用法简介

oracle中的insert all写法

多行插入:在 Oracle 8i 上工作的 INSERT ALL 语句的最佳替代方案

oracle如何批量执行某个文件夹下面的多个.sql脚本

在Oracle中,通过一个INSERT ALL语句批量插入数据

oracle导入