2009-01-13 14 views
5

Estoy ejecutando Sql Server Compact Edition 3.5.1.0 SP1 en una aplicación multi-hilo. La aplicación ejecuta aleatoriamente consultas de inserción en transacciones. Con transacciones cortas, funciona bien. Pero cuando las transacciones se hacen más largos y demora entre ejecuciones se hacen más cortos o cuando corro la aplicación en modo de depuración, SQLCE comienza a tirar de la siguiente excepción al azar:Sql Compact produce al azar AccessViolationException

AccessViolationException Intento de leer o escribir en la memoria protegida. Esto es a menudo una indicación de que otra memoria está dañada.

en System.Data.SqlServerCe.SqlCeCommand.CompileQueryPlan() en System.Data.SqlServerCe.SqlCeCommand.ExecuteCommand (CommandBehavior comportamiento, el método de cuerdas, opciones ResultSetOptions) en System.Data.SqlServerCe.SqlCeCommand .ExecuteNonQuery() en SqlCompactTest.TransactedCommandGroupExecutionTest.Test() en D: \ Proyectos \ PlayGround \ SqlCompactTest \ SqlCompactTest \ TransactedCommandGroupExecutionTest.cs: línea 53 en SqlCompactTest.ExecutionTest.RunTest() en D: \ Projects \ PlayGround \ SqlCompactTest \ SqlCompactTest \ ExecutionTest.cs: línea 60 en SqlCompactTest.ExecutionTest.TimerElapsed (Object remitente, ElapsedEventArgs e) en D: \ Projects \ PlayGround \ SqlCompactTest \ SqlCompactTest \ ExecutionTest.cs : línea 68 al System.Timers.Timer.MyTimerCallback (objeto estado)

El código me postulo es:

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

Este código se ejecuta simultáneamente en tw o hilos. cadena de conexión es:

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

he encontrado las soluciones absurdas en Internet como volver de nuevo a Framework 1.1, cambiando el orden de los argumentos del método, habilitar/deshabilitar optimizaciones etc., pero ninguno de ellos trabajaron para mí. También repetí en possible solutions on microsoft sites pero no pude encontrar una solución que me funcionara. Mi versión del archivo de base de datos es 3.5.0.0.

¿Cómo puedo solucionar esto?

Respuesta

5

Simplemente porque establece una conexión con el comando. La conexión no significa que está configurada.

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

Esta es la causa del problema. Se puede corregir usando connection.CreateCommand();

+0

HAs el error ha sido reparado? Necesito ahora la respuesta –

3

SQL CE objects are not thread-safe. Además, el mismo artículo enumera una situación de desajuste de versión (que sucedió en mi caso).

+0

Tuve la misma excepción y fue exactamente esto, llamando a un backgroundworker que accedió a mi contexto mientras otros procesos lo estaban usando. – Hannish