C# 在执行Oracle全部插入时,如何在Dapper中执行同步

C# 在执行Oracle全部插入时,如何在Dapper中执行同步,c#,oracle,dapper,C#,Oracle,Dapper,我将以下SQL命令(简化)分配给varSQL: 全部插入 转换为ORACLETBL(COL_A,COL_B)值('A','B')) 转换为ORACLETBL(COL_A,COL_B)值('C','D')) 从双重选择中选择*; 当我执行conn.Execute(sql)时在void方法中,命令工作正常 当我执行时,等待conn.ExecuteAsync(sql)在异步任务方法中,针对完全相同的SQL命令,我得到异常“ORA-00933:SQL命令未正确结束” 有人知道我做错了什么吗?我不知道为

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

全部插入
转换为ORACLETBL(COL_A,COL_B)值('A','B'))
转换为ORACLETBL(COL_A,COL_B)值('C','D'))
从双重选择中选择*;
当我执行
conn.Execute(sql)时
void
方法中,命令工作正常

当我执行
时,等待conn.ExecuteAsync(sql)
异步任务
方法中,针对完全相同的SQL命令,我得到异常“ORA-00933:SQL命令未正确结束”


有人知道我做错了什么吗?

我不知道为什么它会在一种情况下抛出异常,而在另一种情况下却不会,但这可能与您打算使用
querysync
时使用
executesync
有关

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

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


包含对
Execute
Query
之间区别的更详细解释。我不确定为什么它在一种情况下引发异常,但在另一种情况下却不会引发异常,但这可能与您打算使用
querysync
时使用
executesync
有关

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

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


包含有关
Execute
Query

之间差异的更详细说明。请删除语句末尾的分号

编辑:

也许这也是一个解决办法

  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

删除语句末尾的分号

编辑:

也许这也是一个解决办法

  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

这是一个INSERT语句,而不是SELECT语句(尽管“INSERT many”的Oracle语法包含一个SELECT子查询)。无论如何,使用QueryAsync也会引发相同的异常。这是一个INSERT语句,而不是SELECT语句(尽管“INSERT many”的Oracle语法包含一个SELECT子查询)。无论如何,使用QueryAsync会引发相同的异常。如果没有分号,即使是以同步方式也无法工作。但它的行为异常(似乎在没有执行操作或引发异常的情况下结束)。可能在VS2019中存在调试问题。这个问题被证明是在表上有锁的情况下执行SQL命令的愚蠢尝试,这导致了各种不必要的兔子跟踪。一旦基本问题得到解决(“重新启动计算机!”),命令正常工作,分号被删除;无需进一步更改。如果没有分号,即使以同步方式,也无法工作。但它的行为异常(似乎在没有执行操作或引发异常的情况下结束)。可能在VS2019中存在调试问题。这个问题被证明是在表上有锁的情况下执行SQL命令的愚蠢尝试,这导致了各种不必要的兔子跟踪。一旦基本问题得到解决(“重新启动计算机!”),命令正常工作,分号被删除;无需进一步修改。