Sql Compact随机生成AccessViolationException

Ser*_*gel 5 access-violation sql-server-ce

我在多线程应用程序中运行Sql Server Compact Edition 3.5.1.0 SP1.应用程序在事务中随机运行插入查询.随着短交易,它工作正常.但是当事务变得更长并且执行之间的延迟变得更短或者我在调试模式下运行应用程序时,SqlCE开始随机抛出以下异常:

AccessViolationException尝试读取或写入受保护的内存.这通常表明其他内存已损坏.

System.Data.SqlServerCe.SqlCeCommand.CompileQueryPlan()位于SqlCompactTest.TransactedCommandGroupExecutionTest.Test的System.Data.SqlServerCe.SqlCeCommand.ExecuteNonQuery()的System.Data.SqlServerCe.SqlCmandCommand.ExecuteCommand(CommandBehavior behavior,String method,ResultSetOptions options)中的System.Data.SqlServerCe.SqlCeCommand.CompileQueryPlan() ()在D:\ Projects\PlayGround\SqlCompactTest\SqlCompactTest\TransactedCommandGroupExecutionTest.cs:第53行,位于D:\ Projects\PlayGround\SqlCompactTest\SqlCompactTest\ExecutionTest.cs中的SqlCompactTest.ExecutionTest.RunTest():第60行,位于SqlCompactTest.ExecutionTest .TimerElapsed(Object sender,ElapsedEventArgs e)位于D:\ Projects\PlayGround\SqlCompactTest\SqlCompactTest\ExecutionTest.cs:第68行,位于System.Timers.Timer.MyTimerCallback(对象状态)

我正在运行的代码是:

IDbConnection connection = m_connectionProvider.GetConnection(); // Just returns new connection

connection.Open();
IDbTransaction transaction = connection.BeginTransaction();

foreach (IDbCommand command in m_commands)
{
    command.Connection = connection;
    command.ExecuteNonQuery(); // This line throws exception
    Thread.Sleep((int)m_delayBetweenExecutions);
}

transaction.Commit();
connection.Close();
Run Code Online (Sandbox Code Playgroud)

此代码在两个线程中同时运行.连接字符串是:

"Data Source=testDB.sdf;Encrypt Database=True;Password=test;File Mode=Read Write;Persist Security Info=False;Max Database Size=1024"
Run Code Online (Sandbox Code Playgroud)

我在互联网上找到了荒谬的解决方案,比如回归到Framework 1.1,更改方法参数的顺序,启用/禁用优化等等,但它们都不适用于我.我还在微软网站上迭代了可能的解决方案,但我找不到适合我的解决方案.我的数据库文件版本是3.5.0.0.

我怎么解决这个问题?

Ser*_*gel 6

仅仅因为您设置了与command.Connection的连接并不意味着它已设置.

command.Connection = connection;
command.Connection.GetHashCode() == connection.GetHashCode(); // may return false.
Run Code Online (Sandbox Code Playgroud)

这是问题的原因.可以使用connection.CreateCommand();


kol*_*ild 5

SQL CE 对象不是线程安全的。此外,同一篇文章列出了版本不匹配的情况(在我的情况下发生过)。

  • 我有同样的异常,正是这样,调用一个后台工作者,当其他进程正在使用它时访问我的上下文。 (2认同)