System.Data.SQLite Close()不释放数据库文件

System.Data.SQLite Close()不释放数据库文件,第1张

概述我在尝试删除文件之前关闭数据库时出现问题。代码就是 myconnection.Close(); File.Delete(filename); 并且删除会抛出该文件仍在使用的异常。我在几分钟后重新尝试了调试器中的Delete(),所以这不是时间问题。 我有事务代码,但它不会在Close()调用之前运行。所以我相当肯定这不是一个开放的事务。 sql命令之间的打开和关闭只是选择。 ProcMo 我在尝试删除文件之前关闭数据库时出现问题。代码就是
myconnection.Close();     file.Delete(filename);

并且删除会抛出该文件仍在使用的异常。我在几分钟后重新尝试了调试器中的Delete(),所以这不是时间问题。

我有事务代码,但它不会在Close()调用之前运行。所以我相当肯定这不是一个开放的事务。 sql命令之间的打开和关闭只是选择。

ProcMon显示我的程序和我的防病毒程序查看数据库文件。它不显示我的程序在close()之后释放db文件。

Visual Studio 2010,C#,System.Data.sqlite版本1.0.77.0,Win7

我看到一个两岁的错误就像这样,但changelog说它是固定的。

还有什么我可以检查吗?有没有办法获得任何打开的命令或事务的列表?

新的,工作代码:

db.Close(); GC.Collect();   // yes,really release the db bool worked = false; int trIEs = 1; while ((trIEs < 4) && (!worked)) {    try    {       Thread.Sleep(trIEs * 100);       file.Delete(filename);       worked = true;    }    catch (IOException e)   // delete only throws this on locking    {       trIEs++;    } } if (!worked)    throw new IOException("Unable to close file" + filename);
遇到同样的问题一段时间,同时为C#编写DB抽象层,我从来没有真正了解到问题是什么。我刚刚结束时,当您尝试使用我的库删除sqlite数据库时抛出异常。

无论如何,今天下午,我一直在看着这一切,想到我会尝试,找出为什么它一劳永逸,所以这里是我发现到目前为止。

当调用sqliteConnection.Close()时会发生什么事情(以及一些检查和其他事情)指向sqlite数据库实例的sqliteConnectionHandle被处理。这是通过调用sqliteConnectionHandle.dispose()来实现的,但是这不会释放指针,直到CLR的垃圾收集器执行一些垃圾收集。因为sqliteConnectionHandle覆盖CriticalHandle.ReleaseHandle()函数来调用sqlite3_close_interop()(通过另一个函数),这并不关闭数据库。

从我的角度来看,这是一个非常糟糕的方式来做事情,因为程序员实际上并不确定当数据库被关闭,但这是它的方式,所以我想我们必须现在生活与现在,或提交对System.Data.sqlite的几个更改。欢迎任何志愿者这样做,不幸的是我没有时间在明年之前这样做。

TL; DR
解决方案是在调用sqliteConnection.Close()之后并在调用file.Delete()之前强制使用GC。

这里是示例代码:

string filename = "testfile.db";sqliteConnection connection = new sqliteConnection("Data Source=" + filename + ";Version=3;");connection.Close();GC.Collect();file.Delete(filename);

祝你好运,我希望它有所帮助

总结

以上是内存溢出为你收集整理的System.Data.SQLite Close()不释放数据库文件全部内容,希望文章能够帮你解决System.Data.SQLite Close()不释放数据库文件所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/sjk/1162650.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-06-01
下一篇 2022-06-01

发表评论

登录后才能评论

评论列表(0条)

保存