2010-04-18 35 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 2010-04-18 16:57:32

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.我提到**总是**附上条件和循环? ;-) – 2010-04-18 16:48:15

+2

是的,我意识到执行是在循环之外的 - 我会(错误地)认为我正在为命令创建一个替换列表,当时我实际上只是重复覆盖了一个替换。 – Rezzie 2010-04-18 16:58:59

1

我把这个例子从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();