Я создаю приложение в Windows Forms. Net Compact Framework 3.5 с резервной базой данных SQLite. Мне нужно сохранить открытое соединение с базой данных по соображениям производительности, и мне нужно использовать транзакции для выполнения нескольких обновлений для возможности отката.
В некоторых таблицах SQLite есть ограничения внешнего ключа, и по умолчанию принудительное использование внешнего ключа отключено, поэтому мне пришлось вручную включать их при открытии соединения между приложением и базой данных.
Проблема теперь в том, что транзакции не допускают ограничений внешнего ключа: (https://sqlite.org/pragma.html#pragma_foreign_keys)
Поэтому, когда я запускаю операторы обновления, они завершаются неудачно, и транзакция откатывается
Я попытался вручную отключить ограничение внешнего ключа перед транзакцией, и затем обновление прошло успешно. Но когда я попытался снова включить ограничение внешнего ключа после транзакции, обновление не удалось.
Мне нужно, чтобы ограничения внешнего ключа были включены, но они терпят неудачу во время транзакций, и я не могу просто отключить их, выполнить транзакцию, а затем снова включить их. Так что мне делать?
using (var cmd1 = new SQLiteCommand(Con))
{
cmd1.CommandText = "PRAGMA foreign_keys = 0"; //turn foreign key contraint off before transaction
cmd1.ExecuteNonQuery();
}
var cmd2 = new SQLiteCommand(Con);
using (SQLiteTransaction transaction = Con.BeginTransaction())
{
//run update commands here
transaction.Commit(); //run transaction
}
using (var cmd3 = new SQLiteCommand(Con))
{
cmd3.CommandText = "PRAGMA foreign_keys = 1"; //turn foreign key constraint back on after transaction
cmd3.ExecuteNonQuery(); //this doesnt work
}