РЕШЕНО [SQLite] INSERT блокирует базу данных, каким образом можно решить данный вопрос?

Здравствуйте

Возникла непонятная для меня ситуация. Обычная SQLite БД. Вставка работала в принципе нормально. Пять дней назад появилась непонятная тенденция - после перезагрузки ПК БД позволяет сделать 1-2 вставки, после чего любые попытки приводят к ошибке "БД заблокирована".

public static void ExecuteSqlTransaction(string Zapros)
        {
            string dbFileName = @"res\db\def.db";
            
            using (SQLiteConnection connection = new SQLiteConnection("Data Source=" + dbFileName + ";mode=Exclusive;datetimeformat=CurrentCulture"))
            {
                connection.Open();

                //string Zapros = "insert into Def_LMSZ (guid, id_anketa, guid_msz) " +
                //    "values ('" + new_guid + "','" + Perem.id_anketa + "','" + guid_LMSZ + "')";
                // где new_guid - новый гуид
                //     Perem.id_anketa - номер
                //     guid_LMSZ - гуид из другой таблицы

                using (SQLiteTransaction dbTrans = connection.BeginTransaction())
                {
                    using (SQLiteCommand cmd = connection.CreateCommand())
                    {
                        cmd.CommandText = Zapros;
                        cmd.ExecuteNonQuery();
                    }
                    try
                    {
                        dbTrans.Commit();
                    }
                    catch
                    {
                        MessageBox.Show("Жопа какая то!");
                    }
                }
            }
        }


Уже пробовал по всякому, MSDN перерыл весь. Киберфорум - аналогично. В Гугле решений не так уж и много по данному вопросу. Пробовал транзакциями. Пробовал с общим единым коннектом для всего проекта. Переустанавливал драйвер SQLite. Пересоздавал БД и отдельные таблицы.

Причем через шелл данный запрос (INSERT) выполняется без проблем и любое неограниченное количество раз, без ощутимой блокировки БД (несколько миллисекунд, как и должно быть).

Запрос один. Никаких циклов нет.

Мыслей у меня уже тоже. Помогите...
  • Вопрос задан
  • 666 просмотров
Решения вопроса 1
@defond Автор вопроса
Мне помогли решить вопрос на Кибер форуме.

Я не понимаю как, т.к. у меня был по логике такой же класс. Назывался по другому, и построение запросов было ближе к рекомендациям MSDN, но факт остается фактом - код в ответе работает, мой нет.

И дополнение к ответу, вместо:
public static Close()
        {
            connection.Close();
        }

нужно читать:
public static void Close()
        {
            connection.Close();
        }

Очевидная опечатка, но вдруг кто-то скопирует. )

На всякий случай, размещаю верный пример кода:
class Database
    {
        const string dbFileName = @"res\db\def.db";
        private static SQLiteConnection connection;
 
        static Database()
        {
            connection = new SQLiteConnection("Data Source=" + dbFileName + ";mode=Exclusive;datetimeformat=CurrentCulture");
            connection.Open();
        }
 
        public static void Close()
        {
            connection.Close();
        }
 
        // можно также добавить методы для получения данных при необходимости...
 
        public static void ExecuteSqlTransaction(string query)
        {
            using (SQLiteTransaction dbTrans = connection.BeginTransaction())
            {
                using (SQLiteCommand cmd = connection.CreateCommand())
                {
                    cmd.CommandText = query;
                    cmd.ExecuteNonQuery();
                }
                try
                {
                    dbTrans.Commit();
                }
                catch
                {
                    MessageBox.Show("Незадача какая то!");
                }
            }
        }
    }
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы