Система.Данные.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();