Я строю киоск базы данных, используя 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, и я приветствую любые улучшения и предложения.