2009-01-13 11 views
5

Ich verwende Sql Server Compact Edition 3.5.1.0 SP1 in einer Multithread-Anwendung. Die Anwendung führt in zufälliger Reihenfolge Insert-Abfragen in Transaktionen aus. Bei kurzen Transaktionen funktioniert es gut. Aber wenn die Transaktionen länger werden und die Verzögerung zwischen Ausführungen kürzer werden oder wenn ich die Anwendung im Debug-Modus ausgeführt wird, beginnt SQLCE die folgende Ausnahme zufällig zu werfen:Sql Compact erzeugt zufällig AccessViolationException

Access Versuchte zu lesen oder im geschützten Speicher schreiben. Diese ist oft ein Hinweis darauf, dass andere Speicher beschädigt ist.

bei System.Data.SqlServerCe.SqlCeCommand.CompileQueryPlan() bei System.Data.SqlServerCe.SqlCeCommand.ExecuteCommand (CommandBehavior Verhalten, String-Methode, ResultSetOptions Optionen) bei System.Data.SqlServerCe.SqlCeCommand .ExecuteNonQuery() bei SqlCompactTest.TransactedCommandGroupExecutionTest.Test() in D: \ Projects \ Spielplatz \ SqlCompactTest \ SqlCompactTest \ TransactedCommandGroupExecutionTest.cs: Linie 53 bei SqlCompactTest.ExecutionTest.RunTest() in D: \ Projects \ Spielplatz \ SqlCompactTest \ SqlCompactTest \ ExecutionTest.cs: Linie 60 bei SqlCompactTest.ExecutionTest.TimerElapsed (Object sender, ElapsedEventArgs e) in D: \ Projects \ Spielplatz \ SqlCompactTest \ SqlCompactTest \ ExecutionTest.cs : line 68 bei System.Timers.Timer.MyTimerCallback Der Code

( Zustand Object) bei mir läuft ist:

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

Dieser Code gleichzeitig in tw läuft o Fäden. Verbindungszeichenfolge ist:

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

fand ich absurd Lösungen auf Internet wie zurück zum Rahmen Zurücksetzen 1.1, die Reihenfolge der Methodenargumente zu ändern, die Aktivierung/Deaktivierung Optimierungen etc., aber keiner von ihnen arbeitete für mich. Ich habe auch durch possible solutions on microsoft sites iteriert, aber ich konnte keine Lösung finden, die für mich funktioniert. Meine Datenbankdateiversion ist 3.5.0.0.

Wie kann ich das lösen?

Antwort

5

Nur weil Sie eine Verbindung zum Befehl festlegen. Verbindung bedeutet nicht, dass es gesetzt ist.

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

Dies ist die Ursache des Problems. Kann mit connection.CreateCommand() korrigiert werden;

+0

Wurde der Fehler behoben? Ich muss jetzt die Antwort –

3

SQL CE objects are not thread-safe. Derselbe Artikel listet auch eine Versionskonfliktsituation auf (was in meinem Fall passierte).

+0

Ich hatte die gleiche Ausnahme und es war genau das, einen Hintergrundarbeiter aufrufen, die auf meinen Kontext zugegriffen, während andere Prozesse es verwendeten. – Hannish