Sql Compact случайным образом создает AccessViolationException - PullRequest
5 голосов
/ 13 января 2009

Я использую Sql Server Compact Edition 3.5.1.0 SP1 в многопоточном приложении. Приложение случайным образом выполняет запросы вставки в транзакциях. С короткими транзакциями работает нормально. Но когда транзакции становятся длиннее и задержка между выполнениями сокращается или когда я запускаю приложение в режиме отладки, SqlCE начинает случайным образом выдавать следующее исключение:

AccessViolationException Попытка чтение или запись защищенной памяти. это часто свидетельствует о том, что другие память повреждена.

в System.Data.SqlServerCe.SqlCeCommand.CompileQueryPlan () в System.Data.SqlServerCe.SqlCeCommand.ExecuteCommand (CommandBehavior поведение, метод String, Параметры ResultSetOptions) в System.Data.SqlServerCe.SqlCeCommand.ExecuteNonQuery () в SqlCompactTest.TransactedCommandGroupExecutionTest.Test () в D: \ Projects \ PlayGround \ SqlCompactTest \ SqlCompactTest \ TransactedCommandGroupExecutionTest.cs: линия 53 в SqlCompactTest.ExecutionTest.RunTest () в D: \ Projects \ PlayGround \ SqlCompactTest \ SqlCompactTest \ ExecutionTest.cs: линия 60 в SqlCompactTest.ExecutionTest.TimerElapsed (Объект отправитель, ElapsedEventArgs e) в D: \ Projects \ PlayGround \ SqlCompactTest \ SqlCompactTest \ ExecutionTest.cs: линия 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"

В Интернете я нашел абсурдные решения, такие как возврат к Framework 1.1, изменение порядка аргументов методов, включение / отключение оптимизаций и т. Д., Но ни одно из них не помогло мне. Я также перебрал возможные решения на сайтах Microsoft , но не смог найти решение, которое мне подходит. Моя версия файла базы данных - 3.5.0.0.

Как я могу решить эту проблему?

Ответы [ 2 ]

6 голосов
/ 15 января 2009

То, что вы установили соединение с командой. Соединение не означает, что оно установлено.

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

Это причина проблемы. Может быть исправлено с помощью connection.CreateCommand ();

4 голосов
/ 31 октября 2011

Объекты SQL CE не являются поточно-ориентированными . Кроме того, в той же статье перечислены ситуации несоответствия версий (что произошло в моем случае).

...