6

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

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

在 System.Data.SqlServerCe.SqlCeCommand.CompileQueryPlan() 在 System.Data.SqlServerCe.SqlCeCommand.ExecuteCommand(CommandBehavior 行为,字符串方法,ResultSetOptions 选项) 在 System.Data.SqlServerCe.SqlCeCommand.ExecuteNonQuery() 在 SqlCompactTest.TransactedCommandGroupExecutionTest.Test () 在 D:\Projects\PlayGround\SqlCompactTest\SqlCompactTest\TransactedCommandGroupExecutionTest.cs: SqlCompactTest.ExecutionTest.RunTest 的第 53 行 D:\Projects\PlayGround\SqlCompactTest\SqlCompactTest\ExecutionTest.cs: SqlCompactTest.ExecutionTest 的第 60 行D:\Projects\PlayGround\SqlCompactTest\SqlCompactTest\ExecutionTest.cs 中的 .TimerElapsed(Object sender, ElapsedEventArgs e):System.Timers.Timer.MyTimerCallback(Object state) 的第 68 行

我正在运行的代码是:

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

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

"Data Source=testDB.sdf;Encrypt Database=True;Password=test;File Mode=Read Write;Persist Security Info=False;Max Database Size=1024"

我在 Internet 上发现了一些荒谬的解决方案,例如恢复到 Framework 1.1、更改方法参数的顺序、启用/禁用优化等,但它们都不适合我。我还在微软网站上迭代了可能的解决方案,但我找不到适合我的解决方案。我的数据库文件版本是 3.5.0.0。

我该如何解决这个问题?

4

2 回答 2

7

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

command.Connection = connection;
command.Connection.GetHashCode() == connection.GetHashCode(); // may return false.

这就是问题的原因。可以通过使用 connection.CreateCommand(); 来纠正

于 2009-01-15T16:20:49.217 回答
5

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

于 2011-10-31T17:57:08.327 回答