Sql Compact 随机产生 AccessViolationException

Posted

技术标签:

【中文标题】Sql Compact 随机产生 AccessViolationException【英文标题】:Sql Compact randomly produces AccessViolationException 【发布时间】:2009-01-13 09:50:47 【问题描述】:

我在多线程应用程序中运行 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:line 53 在 SqlCompactTest.ExecutionTest.RunTest() 在 D:\Projects\PlayGround\SqlCompactTest\SqlCompactTest\ExecutionTest.cs:line 60 在 SqlCompactTest.ExecutionTest.TimerElapsed(对象 发件人,ElapsedEventArgs e) 在 D:\Projects\PlayGround\SqlCompactTest\SqlCompactTest\ExecutionTest.cs:line 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();

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

"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。

我该如何解决这个问题?

【问题讨论】:

【参考方案1】:

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

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

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

【讨论】:

【参考方案2】:

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

【讨论】:

我遇到了同样的异常,正是这个,调用了一个后台工作程序来访问我的上下文,而其他进程正在使用它。

以上是关于Sql Compact 随机产生 AccessViolationException的主要内容,如果未能解决你的问题,请参考以下文章

SQL.求一个随机产生时间的函数

sql产生随机数

MS Sync/SQL Server Compact 代码在最新版本 SQL Compact 3.5 中失败

HBase的compact分析

sqlserver 中rand()是产生随机数,为啥还要设置种子?

如何用SQL为每一行均产生一个随机数