"База данных заблокирована" с SQLite и C#
У меня проблема с моим кодом. Я хочу удалить некоторые строки в моей базе данных SQLite, но получаю исключение "База данных заблокирована". Я прочитал несколько сообщений об этом, как этот пост, но моя проблема все еще здесь.
Вот мой код:
using (var c = new SQLiteConnection(_connectionSQLite))
{
c.Open();
if (c.State == ConnectionState.Open)
{
var reqExist = string.Concat("SELECT id FROM ... ");
using (var cmdExist = new SQLiteCommand(reqExist, c))
{
var reqUpdate = string.Concat("UPDATE ... WHERE id = ", cmdExist.ExecuteScalar());
using (var cmdUpdate = new SQLiteCommand(reqUpdate, c))
{
cmdUpdate.ExecuteNonQuery();
}
}
}
c.Close();
}
Я получаю исключение "база данных заблокирована" на линии cmdUpdate.ExecuteNonQuery();
, Я пытался заменить на DELETE FROM
тот же результат, но с SELECT
это работает, я действительно не понимаю, что не так с моим кодом.
Спасибо за любую помощь.
3 ответа
Ок, всем спасибо за вашу помощь. Мне просто нужно.dispose() два читателя в другой функции перед вставкой / обновлением, и это работает!
Вы пытаетесь выполнить вторую команду до того, как распорядитесь первой. cmdExist
при попытке запуска база данных будет заблокирована cmdUdpdate
,
Вы должны реорганизовать свой код так, чтобы using
блоки для ваших команд не являются вложенными.
SQLite блокирует файл базы данных на чтение? Похоже, вы сможете читать, а затем писать, поэтому я также позаботился о том, чтобы у вас не было открытой базы данных из других источников. Это все еще кажется вероятным виновником, хотя.
Попробуйте упростить ваш выбор, а затем обновите его в одном выражении, например:
ОБНОВЛЕНИЕ... ГДЕ id = (ВЫБЕРИТЕ id ИЗ...)
Если это успешно, то вы знаете, что сбой произошел из-за взаимодействия между выбором и обновлением - т.е. отдельный выбор должен был держать общую блокировку открытой для базы данных, с которой столкнулось обновление.
Если этот объединенный оператор не выполняется из-за заблокированной базы данных, вы знаете, что что-то еще блокирует обновление, а не выбор. В приложении есть что-то еще, что вызывает ошибку блокировки базы данных.