"База данных заблокирована" с 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 ИЗ...)

Если это успешно, то вы знаете, что сбой произошел из-за взаимодействия между выбором и обновлением - т.е. отдельный выбор должен был держать общую блокировку открытой для базы данных, с которой столкнулось обновление.

Если этот объединенный оператор не выполняется из-за заблокированной базы данных, вы знаете, что что-то еще блокирует обновление, а не выбор. В приложении есть что-то еще, что вызывает ошибку блокировки базы данных.

Другие вопросы по тегам