我正在使用Microsoft.Data.SQLite构建数据库信息亭。我使用的任何数据库都只能使用一种用于更新行的方法锁定。其他写入方法也可以,但是这种方法会使应用程序挂起10秒钟,然后吐出“错误5:数据库已锁定”。另外,此方法曾经使用过,但是我很难确定该应用程序的哪些无关更改使它中断,因此为什么要解决此问题。
我确保所有其他数据库连接都已关闭。调试时,所有内容均按预期显示,但整个过程都挂在ExecuteReader().
上,据我所知,该命令没有任何问题。当我将其复制并粘贴到SQLite Studio中时,它可以完美地工作。这是整个方法。如果您愿意,我可以详细介绍列表和内容,但是我确保此命令的所有设置均无问题。基本上,标题和数据的行为类似于行的列名和数据,并且令牌用作跨多个表的单个项目的唯一标识符。在这种方法中,我在数据中的每个项目周围添加引号,并将“标头”和“数据”中的对与", "
一起形成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实现,欢迎任何改进和建议。
答案 0 :(得分:0)
我知道了。我最近的SQLite操作涉及两个单独的命令,但是我很糟糕,正在重用带有参数的SQLiteCommand
。我首先使用命令选择了一行,并使用了两个参数。然后,我更改了文本,但未使用任何参数。我不确定是导致废弃的参数,还是只是重新使用了导致问题的一般命令,但是第二次操作使用新命令实际上导致数据库连接关闭。
我通过中断我正在执行的每个数据库操作来解决此问题。在逐步完成每个步骤以确保其正常工作之后,我在SQLite Studio中执行了一个基本的UPDATE
命令。操作完成后,SQLite Studio挂起时,我发现了错误的操作。