繁体   English   中英

我无法弄清的SQLite Transaction抛出异常

[英]SQLite Transaction throwing exception that I can't figure out

    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循环外,我的代码与所有其他代码都非常相似。 但是我已经在一个事务中看到了多个ExeCuteNonQuery,所以我不知道问题出在哪里。 有什么帮助吗?

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

获得:

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

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

我的猜测是该命令在执行后将被销毁。 尝试将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();
    } 
}

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM