Система.Данные.SQLite параметризованные запросы с несколькими значениями?
Я пытаюсь выполнить массовое удаление с помощью параметризованных запросов. В настоящее время у меня есть следующий код:
pendingDeletions = new SQLiteCommand(@"DELETE FROM [centres] WHERE [name] = $name", conn);
foreach (string name in selected)
pendingDeletions.Parameters.AddWithValue("$name", name);
pendingDeletions.ExecuteNonQuery();
однако значение параметра, похоже, перезаписывается каждый раз, и я в конечном итоге просто удаляю последний центр. Как правильно выполнить параметризованный запрос со списком значений?
3 ответов
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();
что означает, что вы выполняете запрос только один раз, с последним значением в вашем "выбранном" перечислимом.
это главная причина, по которой я всегда всегда всегда всегда используйте разделители блоков для условных обозначений и циклов.
Итак, если вы заключаете назначение параметра и выполнение запроса в цикл, вам должно быть хорошо идти.
pendingDeletions = new SQLiteCommand(@"DELETE FROM [centres] WHERE [name] = $name", conn);
foreach (string name in selected)
{
pendingDeletions.Parameters.AddWithValue("$name", centre.Name);
pendingDeletions.ExecuteNonQuery();
}
Я взял этот пример из http://rosettacode.org/wiki/Parametrized_SQL_statement b / c синтаксис здесь (с " $ " не работал для меня)
SqlConnection tConn = new SqlConnection("ConnectionString");
SqlCommand tCommand = new SqlCommand();
tCommand.Connection = tConn;
tCommand.CommandText = "UPDATE players SET name = @name, score = @score, active = @active WHERE jerseyNum = @jerseyNum";
tCommand.Parameters.Add(new SqlParameter("@name", System.Data.SqlDbType.VarChar).Value = "Smith, Steve");
tCommand.Parameters.Add(new SqlParameter("@score", System.Data.SqlDbType.Int).Value = "42");
tCommand.Parameters.Add(new SqlParameter("@active", System.Data.SqlDbType.Bit).Value = true);
tCommand.Parameters.Add(new SqlParameter("@jerseyNum", System.Data.SqlDbType.Int).Value = "99");
tCommand.ExecuteNonQuery();