Как выполнить Async в Dapper при выполнении Oracle INSERT ALL - PullRequest
1 голос
/ 10 мая 2019

У меня следующая команда SQL (упрощенная), назначенная для переменной 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, команда работает правильно.

Когда я выполняю await conn.ExecuteAsync(sql); в методе async Task, против той же самой команды SQL, я получаю исключение "ORA-00933: Команда SQL не завершена должным образом".

Для кого-то очевидно, что я делаю неправильно?

Ответы [ 2 ]

0 голосов
/ 10 мая 2019

Удалите точку с запятой в конце оператора.

Редактировать:

Возможно, это тоже решение.

  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
0 голосов
/ 10 мая 2019

Я не уверен, почему он вызывает исключение в одной ситуации, но не в другой, но это может быть связано с вашим использованием ExecuteAsync, когда вы собираетесь использовать QueryAsync.

Выполнение не предназначено для использования с выборками, но вместо этого возвращает число затронутых строк при выполнении операции.

В документации ExecuteAsync вы заметите, что онииспользуйте ExecuteAsync и получите обратно только количество затронутых строк, но они используют Query, когда хотят получить фактические строки.

Эта запись стека содержит более подробное объяснение разницы между Execute и Query.

...