13

我正在尝试使用参数化查询进行批量删除。目前,我有以下代码:

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

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

pendingDeletions.ExecuteNonQuery();

但是,参数的值似乎每次都被覆盖,我最终只是删除了最后一个中心。使用值列表执行参数化查询的正确方法是什么?

4

3 回答 3

13

只完成一次创建和映射参数的工作,而不是每次循环返回,作者建议使用事务来提高性能https://www.sqlite.org/faq.html#q19

using(SQLiteTransaction trans=conn.BeginTransaction())
{
    pendingDeletions = new SQLiteCommand(@"DELETE FROM [centres] WHERE [name] = '$name'", conn);
    p=pendingDeletions.Parameters.AddWithValue("$name", "");  <--

    foreach (string name in selected) 
    {
        p.Value = name;
        pendingDeletions.ExecuteNonQuery(); 
    }
    trans.Commit();
}
于 2010-04-18T16:39:29.257 回答
8

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();
}
于 2010-04-18T16:46:48.160 回答
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();
于 2013-08-01T15:43:06.120 回答