执行 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 包含对Execute
和Query
之间区别的更详细说明。
【讨论】:
这是一个 INSERT 语句,而不是一个 SELECT(尽管 Oracle 的“insert many”语法包括一个 SELECT 子查询)。无论如何,使用 QueryAsync 会引发相同的异常。以上是关于执行 Oracle INSERT ALL 时如何在 Dapper 中执行异步的主要内容,如果未能解决你的问题,请参考以下文章
多行插入:在 Oracle 8i 上工作的 INSERT ALL 语句的最佳替代方案