Как устранить ошибку SQLite Ошибка 5: база данных заблокирована? - PullRequest
0 голосов
/ 19 апреля 2019

Я строю киоск базы данных, используя Microsoft.Data.SQLite. Любая база данных, которую я использую, блокируется только одним методом, который я использую для обновления строки. Другие методы записи хороши, но этот вызывает зависание приложения примерно на 10 секунд, а затем выдает «Ошибка 5: База данных заблокирована». Кроме того, этот метод использовал для работы, но мне очень трудно определить, какое несоответствующее изменение приложению сломало его, поэтому я ищу решение этой проблемы.

Я гарантировал, что все остальные подключения к базе данных закрыты. При отладке все выглядит точно так, как и должно быть, но все это висит на ExecuteReader(). Насколько я могу судить, с командой все в порядке. Это работает безупречно, когда я копирую и вставляю его в SQLite Studio. Вот весь метод. Я могу подробнее рассказать о списках и прочем, но я позаботился о том, чтобы все настройки для этой команды были без проблем. По сути, заголовки и данные действуют как имена столбцов и данные для строки, а токен используется как уникальный идентификатор для одного элемента в нескольких таблицах. В этом методе я добавляю кавычки вокруг каждого элемента в Data и соединяю пары в заголовках и данных вместе с ", ", чтобы сформировать пары UPDATE.

public static void UpdateRow(string[] _Token, List<string> _Headers, List<string> _Data) // update a row in a table
        {
            string Table = _Token[0];
            string Item = _Token[1];
            string Serial = _Token[2];

            List<string> changes = new List<string>();

            foreach (string str in _Data) // add quotes to every datum
            {
                string str2 = "\"" + str + "\"";
                changes.Add(_Headers[_Data.IndexOf(str)] + " = " + str2); // keep the og str there because indexof needs the unmodified version
            }

            string result = string.Join(", ", changes); // join all the pairs together with ,

            string query = $"Item = \"{Item}\" AND Serial = {Serial}";

            using (SqliteConnection db = new SqliteConnection(ConnectionString)) // the db
            {

                SqliteCommand updateCommand = new SqliteCommand //build command
                {
                    Connection = db, // sets db for command to use

                    //UPDATE  Table SET 
                    // header = 'data',
                    // WHERE Item = item AND Serial = serial
                    CommandText = $"UPDATE {Table} SET {result} WHERE {query};"
                };

                db.Open();

                updateCommand.ExecuteReader();

                db.Close();

            }

        }

Опять же, у этого метода ранее не было никаких проблем, но я сделал так много несвязанных изменений перед тем, как снова протестировать его, что не могу до конца жизни понять, что могло заставить его перестать работать. Я знаю, что это, вероятно, не лучшая реализация SQLite, и я приветствую любые улучшения и предложения.

1 Ответ

0 голосов
/ 24 апреля 2019

Я понял это.Моя самая последняя операция SQLite включала две отдельные команды, но я был не в порядке и повторно использовал SQLiteCommand, который имел параметры.Сначала я использовал команду для выбора строки и использовал два параметра.Затем я изменил текст, но не использовал никаких параметров.Я не уверен, что причиной проблемы была неиспользуемые параметры или просто повторное использование команды в целом, но использование новой команды для второй операции привело к фактическому закрытию соединения с базой данных.

Iустранить эту проблему, ломая при каждой операции с базой данных, которую я делал.После того, как я пошагово проверил каждый из них, чтобы убедиться, что он работает должным образом, я выполнил простую команду UPDATE в SQLite Studio.Я обнаружил ошибочную операцию, когда SQLite Studio завис после ее завершения.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...