【问题标题】:SQLite locking file even though connection is closedSQLite 锁定文件,即使连接已关闭
【发布时间】:2011-02-16 07:12:43
【问题描述】:

以下语句是否应该自动提交?我得到一个 IOException 试图在执行查询后删除文件。

using (SQLiteConnection connection = new SQLiteConnection("Data Source=" + AppDomain.CurrentDomain.BaseDirectory + "data\\test.db;Version=3;"))
{
    connection.Open();
    SQLiteCommand command = new SQLiteCommand("CREATE TABLE IF NOT EXISTS test (id INTEGER)", connection);
    command.ExecuteNonQuery();
}

//throwing an IOException
File.Delete(AppDomain.CurrentDomain.BaseDirectory + "data\\test.db");

【问题讨论】:

  • 实际的异常是什么?
  • 异常是:“进程无法访问文件'data\test.db',因为它正被另一个进程使用。”
  • 我也遇到这个错误,有没有找到解决办法?

标签: c# sqlite


【解决方案1】:

我迟到了,但我不得不:

GC.WaitForPendingFinalizers();
GC.Collect();

在调用 File.Delete() 之前。

【讨论】:

    【解决方案2】:

    SQLiteCommand 不也是 Dispose(able) 吗?连接可能不会关闭,因为您尚未关闭命令。我也会为此使用 using。

    【讨论】:

    • 我也有这个问题。我处理掉了我使用的 sql 命令,它释放了文件。
    【解决方案3】:

    您必须在使用完每个 SQLiteConnectionSQLiteCommandSQLiteDataReader 后处理它。只需在“使用”块中创建 SQLiteCommand,问题就会消失。

    【讨论】:

      【解决方案4】:

      我不确定问题是什么——我刚刚阅读了 C# 客户端的 source code 和 sqlite 的 C# 实现,没有什么明显的——所以也许你只需要等待几秒钟让操作系统完成在一切准备好删除之前将其写回磁盘?

      当然,如果数据不多,那么您应该只使用内存数据库。如果不需要,为什么还要用数据打扰文件系统呢?你需要这个连接字符串:

      Data Source=file::memory:;Version=3;
      

      【讨论】:

      • 即使在等待几秒钟或几分钟后,文件也没有解锁。该清单只是对实际代码的简化。但谢谢你的提示。
      • 嗯,它胜过“老兄,那应该可以工作”,这是我首先要写的。 :-)
      【解决方案5】:

      您是否尝试在查询执行后关闭连接?

      connection.Close();

      【讨论】:

        【解决方案6】:

        就我而言,我使用的是PRAGMA locking_mode = EXCLUSIVE;,但在关闭连接之前将其设置回PRAGMA locking_mode = NORMAL;。这导致连接的锁定没有被释放。

        【讨论】:

          猜你喜欢
          • 2012-09-14
          • 1970-01-01
          • 2012-09-29
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2020-09-16
          • 1970-01-01
          • 2016-07-18
          相关资源
          最近更新 更多