System.Data.SQLite Close()不释放数据库文件
我在尝试删除文件之前关闭数据库时出现问题。代码就是
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 这里是示例代码: string filename = "testFile.db"; SQLiteConnection connection = new SQLiteConnection("Data Source=" + filename + ";Version=3;"); connection.Close(); GC.Collect(); File.Delete(filename); 祝你好运,我希望它有所帮助 (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |