[英]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.