【问题标题】:Delete sqlite db file删除sqlite db文件
【发布时间】:2011-06-17 10:04:09
【问题描述】:

我正在开发一个后端为 sqlite 的 C# 应用程序。在我的应用程序中,我有一个用于清理数据库的按钮(删除 .db 文件并使用一些初始数据再次创建它)。有时当我尝试删除数据库时,它说它不能被删除,因为它正在被另一个进程使用。在删除它之前,我正在使用关闭连接、处置和清除池功能。即使那样,它也会引发相同的异常。这是我的代码:

string targetDataBaseFilePath = Path.Combine(dataDirectoryPath, "local.db");               
ThingzDatabase.Create(targetDataBaseFilePath, "touchdb");

在创建函数中,我定义了以下代码,从那里我得到了错误:

if (File.Exists(DatabaseFileName))
{
    try
    {
        ThingzDatabase.localdb.conn.Close();
        ThingzDatabase.localdb.conn.Dispose();
        SQLiteConnection.ClearAllPools();
    }
    catch (Exception)
    {
    }
    File.Delete(DatabaseFileName); //error throws from here.                       
}

如何防止错误被抛出?

【问题讨论】:

    标签: sqlite c#-4.0 sqlexception drop-database


    【解决方案1】:
    FileInfo fi = new FileInfo(DatabasePath);
    try
    {
        if (fi.Exists)
        {
            SQLiteConnection connection = new SQLiteConnection("Data Source=" + DatabasePath + ";");
            connection.Close();
            GC.Collect();
            GC.WaitForPendingFinalizers();
            fi.Delete();
        }
    }
    catch(Exception ex)
    {
        fi.Delete();
    }
    

    DatabasePath是你的数据库文件路径

    【讨论】:

    • 我使用了“File.Delete(dbPath);”而不是“FileInfo”,谢谢!
    【解决方案2】:

    我相信你还没有处理从 API 返回的东西。

    您使用哪个 sqlite 包装器?您正在引用自定义函数的使用,它们是做什么的?

    【讨论】:

    • 我引用了一个未正确处理的数据库连接。一旦我解决了这个问题,这个问题就为我解决了。好电话。
    • 我遇到了同样的问题,发现我没有在 ADO.NET 中对一个 SQLiteCommand 使用“使用”。
    【解决方案3】:
    ThingzDatabase.localdb.conn.ClearAllPools(); 
    

    我相信应该是对那条线的呼吁。

    【讨论】:

    • 这肯定需要更多的声音。就我而言,我正在使用 Setup/Teardown 进行一些测试,并且依赖 GC 调用似乎真的很hacky。请注意,此后 API 似乎发生了变化,它现在是 SQLiteConnection 上的静态方法,您现在可以这样称呼它:SQLiteConnection.ClearAllPools()
    【解决方案4】:

    在连接字符串中使用这个 Pooling=False;我在池化时遇到了同样的问题。

    【讨论】:

      【解决方案5】:

      您可以使用 Mark Russinovich 的 one 这样的 procmon。
      然后您可以根据文件名过滤显示。
      完成此操作后,您可以准确查看锁定此文件的进程,并进行相应的调试。

      【讨论】:

        【解决方案6】:

        我看到很多使用流程。但是 sqlite 有一个方法。 真空

        VACUUM 命令重建数据库文件,将其重新打包到最小的磁盘空间中。

        https://sqlite.org/lang_vacuum.html

        【讨论】:

          【解决方案7】:

          我最后只是自己问了question。解决方案是让垃圾收集运行一段时间。

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2015-04-11
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多