【问题标题】:How to troubleshoot SQLite Error 5: database is locked?如何解决 SQLite 错误 5:数据库被锁定?
【发布时间】: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; 表名和列名都正确。

标签: sqlite uwp


【解决方案1】:

我想通了。我最近的 SQLite 操作涉及两个单独的命令,但我很糟糕并重用了带有参数的 SQLiteCommand。我首先使用命令选择一行并使用了两个参数。然后我更改了文本但没有使用任何参数。我不确定是否是未使用的参数或只是重新使用导致问题的一般命令,但在第二次操作中使用新命令导致数据库连接实际关闭。

我通过中断我正在执行的每个数据库操作来解决此问题。在我逐步检查每一个以确保它按预期工作后,我在 SQLite Studio 中执行了一个基本的UPDATE 命令。操作完成后,SQLite Studio 挂起时发现操作错误。

【讨论】:

    猜你喜欢
    • 2012-02-09
    • 2018-06-11
    • 1970-01-01
    • 2013-04-18
    • 1970-01-01
    • 2014-07-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多