База данных sqlite заблокирована при вставке

Там простой код

var insert = 
    @"INSERT INTO [files] (
     [Name],
     [FullName],
     [MD5])
     VALUES (@Name, @FullName, @MD5);";
using (var con = _db.OpenConnection())
{
    using (var cmd = con.CreateCommand())
    {
        cmd.CommandText = insert;
        cmd.Parameters.AddWithValue("@Name", item.Name);
        cmd.Parameters.AddWithValue("@FullName", item.FullName);
        cmd.Parameters.AddWithValue("@MD5", item.MD5);
        cmd.ExecuteNonQuery();
    }
 }

приложения зависают на некоторое время при выполнении

cmd.ExecuteNonQuery();

и затем происходит сбой с исключением "база данных заблокирована". Почему это происходит? Приложение не многопоточное. Файл БД только что создан.

3 ответа

Решение

Задача решена. Перед этим кодом был вызов SqlCommand.ExecuteReader(). Хотя соединение и команда, которые создали этот читатель, были расположены, сам этот читатель не был расположен. После исправления с помощью "using(reader)" соединение было закрыто должным образом и ошибка выше исчезла.

В целом: DataReader все еще может удерживать соединение, даже если соединение и SqlCommand были расположены явно.

Не забывайте нажимать на Write changesв браузере SQLite, если он запущен и есть несохраненные изменения!

В моем случае это было очень глупо с моей стороны, я вносил изменения в браузере SQLite и не нажимал на запись изменений, что заблокировало изменение БД службами. После того, как я нажал кнопку «Записать изменения», все запросы на публикацию работали, как ожидалось.
Согласно @Rohan Shenoy в этой теме: Исключение блокировки базы данных SQLite

В вашем коде отсутствует вызов prepare()

int i=0;
        try
        {
            Conectar();
            SQLiteCommand comando = new SQLiteCommand(con);
            comando.CommandText = "INSERT INTO EMPRESA (NAME,ESTADO) VALUES (@name, @estado)";
            comando.Parameters.AddWithValue("@name", art.NAME);
            comando.Parameters.AddWithValue("@estado", art.ESTADO);
            comando.Prepare();
            con.Open();
            i = comando.ExecuteNonQuery();
            con.Close();
        }
        catch (SQLiteException ex)
        {
            string a = ex.Message.ToString();   
            throw;
        }

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