База данных 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;