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: 53 行目 D:\Projects\PlayGround\SqlCompactTest\SqlCompactTest\ExecutionTest.cs: 60 行目 SqlCompactTest.ExecutionTest の SqlCompactTest.ExecutionTest.RunTest() .TimerElapsed(Object sender, ElapsedEventArgs e) in D:\Projects\PlayGround\SqlCompactTest\SqlCompactTest\ExecutionTest.cs: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();

このコードは、2 つのスレッドで同時に実行されます。接続文字列は次のとおりです。

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

フレームワーク 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 に答える