【问题标题】:System.Data.SQLite parameterized queries with multiple values?System.Data.SQLite 具有多个值的参数化查询?
【发布时间】:2011-02-09 10:01:43
【问题描述】:

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

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

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

pendingDeletions.ExecuteNonQuery();

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

【问题讨论】:

    标签: c# parameters system.data.sqlite


    【解决方案1】:

    只完成一次创建和映射出参数的工作,而不是每次循环返回,作者建议使用事务来提高性能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();
    }
    

    【讨论】:

    • 谢谢。我已经重构了我的代码以存储替换列表而不是“准备好的”参数列表,并在根据您的回答遍历队列时将值分配给参数。
    【解决方案2】:

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

    【讨论】:

    • 附注我有没有提到 ALWAYS 包含条件和循环? ;-)
    • 是的,我意识到执行在循环之外 - 我(错误地)假设我正在构建命令的替换列表,而实际上我只是重复覆盖单个替换.
    【解决方案3】:

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

    【讨论】:

    • '$' 可能对你不起作用,因为它看起来不像你在使用 SQLite 类库:)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-02-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多