【问题标题】:SQLite error (10): delayed 25ms for lock/sharing conflictSQLite 错误(10):锁/共享冲突延迟 25ms
【发布时间】:2013-01-01 21:20:36
【问题描述】:

我的C#/SQLite app 工作正常,但偶尔会输出此错误:

SQLite error (10): delayed 25ms for lock/sharing conflict

按照this thread 的建议,我更新到了最新的 SQLite,但它仍然会发生。
如何解决这个问题?


SQLite 版本:sqlite-netFx40-static-binary-Win32-2010-1.0.84.0.zipPrecompiled Statically-Linked Binaries for 32-bit Windows (.NET Framework 4.0) 段落http://system.data.sqlite.org/index.html/doc/trunk/www/downloads.wiki

Visual C# 2010 速成版

【问题讨论】:

标签: c# sqlite locking conflict


【解决方案1】:

来自这个原始代码:

    using (var command = new SQLiteCommand(GetSQLiteConnection()))
    {
        try
        {
            command.CommandText =
                "DELETE FROM folders WHERE path='" + path + "'";
            command.ExecuteNonQuery();
        }
        catch (SQLiteException e)
        {
            SparkleLogger.LogInfo("CmisDatabase", e.Message);
        }
    }

改成这样就解决了问题(只有前两行不同):

    var connection = GetSQLiteConnection();
    using (var command = new SQLiteCommand(connection))
    {
    try
        {
            command.CommandText =
                "DELETE FROM folders WHERE path='" + path + "'";
            command.ExecuteNonQuery();
        }
        catch (SQLiteException e)
        {
            SparkleLogger.LogInfo("CmisDatabase", e.Message);
        }
    }

【讨论】:

    【解决方案2】:

    从您的评论中查看源代码:

            using (var command = new SQLiteCommand(GetSQLiteConnection()))
            {
                try
                {
                    command.CommandText =
                        "DELETE FROM folders WHERE path='" + path + "'";
                    command.ExecuteNonQuery();
                }
                catch (SQLiteException e)
                {
                    SparkleLogger.LogInfo("CmisDatabase", e.Message);
                }
            }
    

    using 语句正在处理命令而不是连接。尝试为每个命令使用两个嵌套的 using 语句。

       using (var connection= GetSQLiteConnection())
       {
          using (var command = new SQLiteCommand(connection))
          {
            try
            {
                command.CommandText =
                    "DELETE FROM folders WHERE path='" + path + "'";
                command.ExecuteNonQuery();
            }
            catch (SQLiteException e)
            {
                SparkleLogger.LogInfo("CmisDatabase", e.Message);
            }
         }
      }
    

    这可能会缓解问题,但其他因素可能会导致出现此错误。

    【讨论】:

    • 改成这个后,上面写着Cannot access a disposed object. Object name: SQLiteConnection
    • 我不想每次都重新创建 SQLiteConnection 连接,所以我不能使用这个想法,很遗憾。
    • 我发现通过确保所有连接、命令和读取器都包含在 using 语句中,我可以完全消除 system.data.sqlite 代码中的此类错误。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-11-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-26
    • 2011-05-22
    相关资源
    最近更新 更多