1
    public void test2(String[] users)
    {
        Stopwatch stopwatch = new Stopwatch();
        stopwatch.Start();
        using (var myTransaction = myDB.BeginTransaction())
        {
            using (cmd = myDB.CreateCommand())
            {
                cmd.Transaction = myTransaction;
                cmd.CommandText = "UPDATE myTable SET counter = counter + 1 WHERE user = @user";
                cmd.Parameters.AddWithValue("@user", "");
                foreach (string person in users)
                {
                    cmd.Parameters["@user"].Value = person;
                    cmd.ExecuteNonQuery();
                } 
            }
            myTransaction.Commit();
            stopwatch.Stop();
            Console.WriteLine("Updating existing users took: " + stopwatch.Elapsed);
        }
    }

我很想弄清楚这个问题。我查看了大量的 c# 事务示例,我的代码看起来与所有这些示例都非常相似,除了具有 foreach 循环。但是我在一个事务中看到了多个 ExecCuteNonQuery,所以我不知道问题是什么。有什么帮助吗?

编辑:猜猜我应该解释这个问题:P

得到:

"System.ObjectDisposedException: Cannot access a disposed object. Object name: 'SQLiteCommand'."

cmd.Parameters["@user"].Value = person;线。

4

2 回答 2

4

我的猜测是该命令在执行后会被处理掉。尝试将foreach循环放在外面:

foreach (string person in users)
{
    using (cmd = myDB.CreateCommand())
    {
        cmd.Transaction = myTransaction;
        cmd.CommandText = "UPDATE myTable SET counter = counter + 1 WHERE user = @user";
        cmd.Parameters.AddWithValue("@user", person);
        cmd.ExecuteNonQuery();
    } 
}
于 2013-08-31T04:23:38.080 回答
1

看起来变量 cmd 是一个字段。这可以解释为什么可以在 foreach 循环期间处理该命令。如果 test2 在并行运行另一个测试的同时运行,则另一个测试可以处理 cmd 字段中的任何内容。要解决此问题,请从类中删除 cmd 并将其转换为方法的局部变量。例如,使用(var cmd = myDB.CreateCommand())

于 2016-05-17T08:07:21.610 回答