6

我正在开发一个 C# 应用程序,其后端为 sqlite。在我的应用程序中,我有一个用于清理数据库的按钮(删除 .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.                       
}

如何防止错误被抛出?

4

7 回答 7

4
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是您的数据库文件路径

于 2020-07-12T14:53:17.493 回答
2
ThingzDatabase.localdb.conn.ClearAllPools(); 

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

于 2011-12-15T23:09:42.830 回答
2

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

于 2011-12-16T16:15:59.830 回答
1

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

于 2012-01-03T13:38:06.157 回答
1

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

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

于 2011-12-10T13:38:23.303 回答
-1

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

于 2011-12-15T23:12:15.233 回答
-1

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

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

https://sqlite.org/lang_vacuum.html

于 2017-09-25T07:37:31.603 回答