Как использовать список параметров целых чисел для 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;
}
Есть следующие отличия:
- Использование "
:ids
" вместо "@ids
" Я сильно подозреваю, что это проблема, потому что Oracle ожидает:
вместо@
для параметров. - Использование
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)
, Я полагаю, что вы уже разделили их - теперь попробуйте добавить ()
и посмотрим, что получится.