Как использовать список параметров целых чисел для Oracle с Dapper?

Я пытаюсь переписать некоторый код для использования Dapper, чтобы я мог легко использовать параметры. Я пытаюсь выполнить инструкцию UPDATE для базы данных Oracle. Список IDs ОБНОВЛЕНИЕ передается как List<int> в качестве параметра. Я хочу обновить поле для каждого из IDs прошло. Вот что у меня есть:

OracleConnection connection = ... // set earlier

public int IncreaseProcessCount(List<int> ids)
{
    var rowsAffected = connection.Execute(@"UPDATE TABLE SET PROCESSED_COUNT = PROCESSED_COUNT + 1 WHERE ID IN @ids", new { ids });
    return rowsAffected;
}

До использования Dapper оператор выполнения работал просто отлично. Теперь я получаю следующую ошибку:

ORA-00936: отсутствует выражение.

Мое текущее решение основано на следующих постах:

Dapper запрос со списком параметров и выполнением вставок и обновлений с Dapper

3 ответа

Я не уверен, является ли это специфической проблемой Oracle, поскольку я никогда не работал с комбинацией Oracle + Dapper. Но я сильно подозреваю, что способ передачи параметров является проблемой. Исключение "отсутствующее выражение" говорит то же самое.

Обратитесь к модификации вашего кода ниже:

public int IncreaseProcessCount(int[] ids)
{
    var rowsAffected = connection.Execute(@"UPDATE TABLE SET PROCESSED_COUNT = PROCESSED_COUNT + 1 WHERE ID IN :ids", new { ids });
    return rowsAffected;
}

Есть следующие отличия:

  1. Использование " :ids " вместо " @ids " Я сильно подозреваю, что это проблема, потому что Oracle ожидает : вместо @ для параметров.
  2. Использование int[] вместо List<int>, Это не должно быть проблемой, потому что Dapper поддерживает IEnumerable для списка параметров; так List должно быть хорошо. Вы уже попробовали это (как вы упомянули в комментариях) без успеха.

Пошлите этот вопрос для Dapper с IN предложение с использованием списка параметров. Вот еще один ресурс.

Изменить (для комментариев):

Суть проблемы заключалась в использовании " :ids ", который был правильно включен в мой ответ. Я только что исправил синтаксическую ошибку в коде выше.

Также я вообще пользуюсь DynamicParameters, На самом деле, это не было проблемой в этом случае, поэтому я удалил ту часть, которая присутствовала в первой версии моего ответа. Во всяком случае, следующий код с DynamicParameters который должен работать одинаково.

public int IncreaseProcessCount(int[] ids)
{
    var param = new DynamicParameters();
    param.Add(":ids", ids);

    var rowsAffected = connection.Execute(@"UPDATE TABLE SET PROCESSED_COUNT = PROCESSED_COUNT + 1 WHERE ID IN :ids", param);
    return rowsAffected;
}

Исходя из ответа Амита, ниже я наконец получил работу. Я должен был обернуть передаваемую коллекцию анонимным объектом.

connection.Execute("UPDATE TABLE SET PROCESSED_COUNT = PROCESSED_COUNT+ 1 WHERE ID IN :ids",
                    new { ids });

Я не знаю Даппера (даже никогда не слышал об этом), поэтому прошу прощения, если это чепуха; однако в этом:

WHERE ID IN @ids

IN предполагает, что Oracle ожидает список элементов, заключенных в скобки. Итак, что же @ids действительно? Если это одно значение, скобки не нужны. Но если их два или более (хотя и до 1000), они должны быть разделены запятой и, как я уже сказал, заключены в круглые скобки, такие как (1, 2, 8), Я полагаю, что вы уже разделили их - теперь попробуйте добавить () и посмотрим, что получится.

Другие вопросы по тегам