Pergunta

Estou executando o SQL Server Compact Edition 3.5.1.0 SP1 em uma aplicação multi-thread. O aplicativo é executado de forma aleatória consultas de inserção em transações. Com as transações curtas, ele funciona bem. Mas quando as transações ficam mais longos e atraso entre execuções ficam mais curtos ou quando eu executar o aplicativo no modo de depuração, SQLCE começa a jogar a seguinte exceção ao acaso:

AccessViolationException Tentativa de ler ou escrever na memória protegida. este é muitas vezes uma indicação de que outros memória está corrompida.

at System.Data.SqlServerCe.SqlCeCommand.CompileQueryPlan () em System.Data.SqlServerCe.SqlCeCommand.ExecuteCommand (CommandBehavior comportamento, método String, opções ResultSetOptions) em System.Data.SqlServerCe.SqlCeCommand.ExecuteNonQuery () em SqlCompactTest.TransactedCommandGroupExecutionTest.Test () no D: \ Projects \ Campo de jogos \ SqlCompactTest \ SqlCompactTest \ TransactedCommandGroupExecutionTest.cs: Linha 53 em SqlCompactTest.ExecutionTest.RunTest () no D: \ Projects \ Campo de jogos \ SqlCompactTest \ SqlCompactTest \ ExecutionTest.cs: Linha 60 no SqlCompactTest.ExecutionTest.TimerElapsed (Object remetente, ElapsedEventArgs e) em D: \ Projects \ Campo de jogos \ SqlCompactTest \ SqlCompactTest \ ExecutionTest.cs: Linha 68 no System.Timers.Timer.MyTimerCallback (Object Estado)

O código que eu estou correndo é:

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 está sendo executado simultaneamente em dois tópicos. string de conexão é:

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

Eu encontrei soluções absurdas na Internet como reverter de volta para Framework 1.1, alterar a ordem dos argumentos de método, ativar / desativar otimizações etc. mas nenhum deles funcionou para mim. Eu também iterado soluções possíveis em sites da Microsoft mas eu não poderia encontrar uma solução que funciona para mim. Minha versão do arquivo de banco de dados é 3.5.0.0.

Como posso resolver isso?

Foi útil?

Solução

Apenas porque você definir uma conexão com command.Connection não significa que ele está definido.

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

Esta é a causa do problema. Pode ser corrigido usando connection.CreateCommand ();

Outras dicas

objetos SQL CE não são thread-safe . Além disso, o mesmo artigo listas a situação incompatibilidade de versão (que aconteceu no meu caso).

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top