System.Data.SQLite параметризованные запросы с несколькими значениями? - PullRequest
12 голосов
/ 18 апреля 2010

Я пытаюсь выполнить массовое удаление с помощью параметризованных запросов. В настоящее время у меня есть следующий код:

pendingDeletions = new SQLiteCommand(@"DELETE FROM [centres] WHERE [name] = $name", conn);

foreach (string name in selected)
    pendingDeletions.Parameters.AddWithValue("$name", name);

pendingDeletions.ExecuteNonQuery();

Однако значение параметра, кажется, каждый раз перезаписывается, и в итоге я просто удаляю последний центр. Как правильно выполнить параметризованный запрос со списком значений?

Ответы [ 3 ]

13 голосов
/ 18 апреля 2010
foreach (string name in selected) 
{
    pendingDeletions.Parameters.AddWithValue("$name", name);  <--
    pendingDeletions.ExecuteNonQuery(); 
}
6 голосов
/ 18 апреля 2010

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();
}
2 голосов
/ 01 августа 2013

Я взял этот пример из 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();
...