Я пытаюсь сделать выполненный объемное удаление с помощью параметризированных запросов. В настоящее время у меня есть следующий код:
pendingDeletions = new SQLiteCommand(@"DELETE FROM [centres] WHERE [name] = $name", conn);
foreach (string name in selected)
pendingDeletions.Parameters.AddWithValue("$name", name);
pendingDeletions.ExecuteNonQuery();
Однако значение параметра, кажется, перезаписывается каждый раз, когда и я заканчиваю тем просто, что удалил последний центр. Что корректный путь состоит в том, чтобы выполнить параметризированный запрос со списком значений?
foreach (string name in selected)
{
pendingDeletions.Parameters.AddWithValue("$name", name); <--
pendingDeletions.ExecuteNonQuery();
}
Rezzie, ваш текущий код эквивалентен:
pendingDeletions = new SQLiteCommand(@"DELETE FROM [centres] WHERE [name] = $name", conn);
foreach (string name in selected)
{
pendingDeletions.Parameters.AddWithValue("$name", centre.Name);
}
pendingDeletions.ExecuteNonQuery();
Это означает, что вы выполняете запрос только один раз, с последним значением в вашем 'selected' перечислении.
Это основная причина, по которой я ВСЕГДА ВСЕГДА ВСЕГДА использую разделители блоков в условных выражениях и циклах ВСЕГДА.
Итак, если вы заключите назначение параметров и выполнение запроса в цикл, все будет в порядке.
pendingDeletions = new SQLiteCommand(@"DELETE FROM [centres] WHERE [name] = $name", conn);
foreach (string name in selected)
{
pendingDeletions.Parameters.AddWithValue("$name", centre.Name);
pendingDeletions.ExecuteNonQuery();
}