C # Параметризованный запрос MySQL с предложением `in` - PullRequest
6 голосов
/ 16 марта 2009

Я нахожусь в процессе преобразования нескольких запросов, которые были жестко запрограммированы в приложении и на лету построены для параметризованных запросов. У меня проблемы с одним конкретным запросом, который имеет предложение in:

UPDATE TABLE_1 SET STATUS = 4 WHERE ID IN (1, 14, 145, 43);

Первый параметр прост, так как это обычный параметр:

MySqlCommand m = new MySqlCommand("UPDATE TABLE_1 SET STATUS = ? WHERE ID IN (?);");
m.Parameters.Add(new MySqlParameter("", 2));

Однако вторым параметром является список целых чисел, представляющих идентификаторы строк, которые необходимо обновить. Как передать список целых чисел для одного параметра? В качестве альтернативы, как бы вы настроили этот запрос, чтобы вам не приходилось полностью его создавать каждый раз, когда вы вызываете его, и чтобы предотвратить атаки с использованием SQL-инъекций?

Ответы [ 6 ]

5 голосов
/ 16 марта 2009

Это невозможно в MySQL. Вы можете создать необходимое количество параметров и выполнить UPDATE ... IN (?,?,?,?). Это предотвращает инъекционные атаки (но все же требует перестройки запроса для каждого числа параметров).

Другой способ - передать строку через запятую и проанализировать ее.

4 голосов
/ 16 марта 2009

Вы можете создать параметризованный запрос «на лету» на основе (предположительно) переменного количества параметров и выполнить итерацию по нему, чтобы передать их.

Итак, что-то вроде:

List foo; // assuming you have a List of items, in reality, it may be a List<int> or a List<myObject> with an id property, etc.

StringBuilder query = new StringBuilder( "UPDATE TABLE_1 SET STATUS = ? WHERE ID IN ( ?")
for( int i = 1; i++; i < foo.Count )
{   // Bit naive 
    query.Append( ", ?" );
}

query.Append( " );" );

MySqlCommand m = new MySqlCommand(query.ToString());
for( int i = 1; i++; i < foo.Count )
{
    m.Parameters.Add(new MySqlParameter(...));
}
2 голосов
/ 25 декабря 2015

Старый вопрос, но в случае, если кто-нибудь сталкивается с этим через Google, вот что я использую:

int status = 4;  
string ids = "1,14,145,43";      

m.Parameters.AddWithValue("@Status", status);
m.Parameters.AddWithValue("@IDs", ids);

UPDATE TABLE_1 SET STATUS = @Status WHERE FIND_IN_SET(ID, @IDs) > 0;

Примечание. FIND_IN_SET - это функция, специфичная для mySQL.

Кредит, где кредит должен: См. Этот вопрос: Добавить список к параметру mysql

2 голосов
/ 16 марта 2009

Нельзя использовать параметры для предложения IN.

0 голосов
/ 16 марта 2009

Зациклите свой список целых чисел и выполните отдельные обновления.

MSSQL 2008 предлагает табличные параметры, чтобы избежать этой проблемы, я не знаю ни о какой подобной функциональности в MySQL.

0 голосов
/ 16 марта 2009

Я бы предложил создать функцию (при условии, что mysql поддерживает пользовательские функции), чтобы разбить параметр на части и вернуть таблицу.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...