2010-04-18 1 views
9

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

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

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

pendingDeletions.ExecuteNonQuery(); 

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

ответ

9
foreach (string name in selected) 
{ 
    pendingDeletions.Parameters.AddWithValue("$name", name); <-- 
    pendingDeletions.ExecuteNonQuery(); 
} 
+0

Спасибо. Я переработал свой код, чтобы сохранить список замещений, а не список «подготовленных» параметров, и присваиваю значения параметрам, итерации по очереди в соответствии с вашим ответом. – Rezzie

4

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(); 
} 
+4

p.s. я упомянул, что ** ВСЕГДА ** заключают условные обозначения и циклы? ;-) –

+2

Да, я понял, что выполнение было вне цикла - я (ошибочно) предположил, что я строю список подстановок для команды, когда я на самом деле просто перезаписывал одну подстановку несколько раз. – Rezzie

1

Я взял этот пример из http://rosettacode.org/wiki/Parametrized_SQL_statement б/с синтаксисом здесь (с '$' не работает для меня)

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();