2010-05-06 41 views
3

不应该将以下语句设为autocommited?我得到一个IOException试图在执行查询后删除文件。尽管连接已关闭,SQLite锁定文件

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"); 
+0

什么是实际例外? – 2010-05-06 09:15:37

+0

例外情况是:“进程无法访问文件'data \ test.db',因为它正在被另一个进程使用。” – 2010-05-06 09:41:12

+0

我也得到这个错误,是有史以来发现的解决方案?即使在等待几秒或几分钟后,文件仍未解锁,也可以使用 – Mizipzor 2010-11-18 12:52:29

回答

3

,我迟到了,但我不得不:

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

之前要调用File.Delete()。

0

我不知道是什么问题 - 我刚刚看了source code到C#的客户端和SQLite的C#实现,并没有什么明显的 - 所以也许你只需要等待几秒钟的OS在完全准备好删除之前将事情写回磁盘?

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

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

。该列表仅仅是实际代码的简化。但是谢谢你的提示。 – 2010-05-06 09:42:42

+0

好吧,它打败了“伙计,这应该工作”,这是我首先要写的东西。 :-) – 2010-05-06 10:03:14

0

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

connection.Close();

1

是不是SQLiteCommand还处置(能)?连接可能没有关闭,因为您尚未关闭该命令。我也会使用它。

+0

我也有这个问题。我处理了我使用的sql命令并释放了该文件。 – Behr 2013-08-01 20:02:26