Избегайте блокировки таблицы с помощью SQLite - PullRequest
0 голосов
/ 23 марта 2020

Я пишу C# программу, которая обращается к БД SQLite.

На начальном этапе я читаю пользовательскую версию таблицы БД и, если она старше, я удаляю таблицу и регенерирую ее.

Проблема в том, что когда go удалить таблицу, я получаю много ошибок, таких как:

Ошибка SQLite (6): оператор прерывается в 21: [DROP TABLE IF EXISTS orders;] таблица базы данных заблокирована

Я обнаружил, что, вероятно, это потому, что активна предыдущая команда SELECT, тогда мне нужно сбросить / завершить ее - но как?

I пробовал с rdr.Close(), а затем с cmd.Reset(), но без положительных результатов.

Мой код:

Debug.WriteLine("[DbManager] check db version..");
cmd = new SQLiteCommand("select * from settings;", sqlConnection);
try {
    rdr = cmd.ExecuteReader();
    if (rdr.Read()){
        // Read and check version
        var i = rdr.GetOrdinal("version");
        var version = rdr.GetInt32(i);
        LogManager.Write(
            String.Format(
                "> Version: {0} - CurrentVersion: {1}", version, CURRENT_DB_VERSION
            )
        );
        if (version < CURRENT_DB_VERSION){
            // Cancella la tabella orders
            cmd.Reset();    //
            rdr.Close();

            /*var cmdDrop*/ cmd = new SQLiteCommand("DROP TABLE IF EXISTS orders;", sqlConnection);
            try {
                /*cmdDrop*/cmd.ExecuteNonQuery();
                ...
...