【发布时间】:2019-09-09 19:02:49
【问题描述】:
我正在使用 Microsoft.Data.SQLite 构建一个数据库信息亭。我使用的任何数据库都会被我用来更新行的一种方法锁定。其他写入方法都很好,但是这种方法会导致应用程序挂起大约 10 秒,然后吐出“错误 5:数据库已锁定”。此外,这种方法曾经可以工作,但我很难确定应用程序的哪个不相关的更改破坏了它,因此我要解决这个问题。
我已确保所有其他数据库连接都已关闭。调试时,一切都完全按照预期显示,但整个事情都挂在ExecuteReader(). 据我所知,该命令没有任何问题。当我将它复制并粘贴到 SQLite Studio 中时,它可以完美运行。这是整个方法。如果您愿意,我可以详细介绍列表和内容,但我已确保此命令的所有设置都没有问题。基本上,Headers 和 Data 就像一行的列名和数据,而 Token 用作跨多个表的单个项目的唯一标识符。在这种方法中,我在 Data 中的每个项目周围添加引号,并将 Headers 和 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 实现,我欢迎任何改进和建议。
【问题讨论】:
-
在所有这些字符串恶作剧之后,调试器会为文字解析的命令文本显示什么?
-
UPDATE L SET Item = "LEKO", Serial = "1", FriendlyName = "LekoLite base", Notes = "This will crash", Condition = "Good", Status = "Flown", DateLastService = "2018-12-09 00:59:04", ExpressColumn = "5" WHERE Item = "LEKO" AND Serial = 0001;表名和列名都正确。