Sql Compact随机产生AccessViolationException

问题描述 投票:6回答:2

我正在多线程应用程序中运行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:line53岁SqlCompactTest.ExecutionTest.RunTest()在D:\ Projects \ PlayGround \ SqlCompactTest \ SqlCompactTest \ ExecutionTest.cs:line60点SqlCompactTest.ExecutionTest.TimerElapsed(Object发送者,ElapsedEventArgs e)在D:\ Projects \ PlayGround \ SqlCompactTest \ SqlCompactTest \ ExecutionTest.cs:line68岁System.Timers.Timer.MyTimerCallback(Object状态)

我正在运行的代码是:

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,更改方法参数的顺序,启用/禁用优化等,但是它们都不适合我。我也遍历了possible solutions on microsoft sites,但找不到适合我的解决方案。我的数据库文件版本是3.5.0.0。

我该如何解决?

sql-server-ce access-violation
2个回答
7
投票

只是因为您将命令设置为连接。连接并不意味着已设置它。

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

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

进行更正

5
投票

SQL CE objects are not thread-safe。另外,同一篇文章列出了版本不匹配的情况(在我的案例中发生过)。

© www.soinside.com 2019 - 2024. All rights reserved.