sqlite错误:close和dispose后不能释放与db文件的连接
string dbFile = @"G:\test.db";
string connenctStr = string.Format(@"Data Source={0};Pooling=true;FailIfMissing=false", dbFile);
SQLiteConnection m_Connection = new SQLiteConnection(connenctStr);
m_Connection.Open();
using (var com = m_Connection.CreateCommand())
{
com.CommandText = @"select 1";
com.ExecuteNonQuery();
}
m_Connection.Close();
m_Connection.Dispose();
try
{
File.Delete(dbFile);
}
catch (Exception e)
{
throw e;
}
执行代码,在删除文件时提示:
An unhandled exception of type 'System.IO.IOException' occurred in TestSqlite.exe
Additional information: 文件“G:\test.db”正由另一进程使用,因此该进程无法访问此文件。
异常。
原因是sqlite在执行SQLiteConnectionHandle.Dispose()操作时候,其实并没有真正的释放连接,只有显式调用 CLR垃圾回收之后才能真正释放连接。
参考连接 stackoverflow 问答,http://stackoverflow.com/questions/8511901/system-data-sqlite-close-not-releasing-database-file,但是即使按
照answer中给出的答案加上GC.Collect();仍然报同样异常。
还需要加上GC.WaitForPendingFinalizers()这句。参考上述博客中11楼的回答。
代码修改后如下
string dbFile = @"G:\test.db";
string connenctStr = string.Format(@"Data Source={0};Pooling=true;FailIfMissing=false", dbFile);
SQLiteConnection m_Connection = new SQLiteConnection(connenctStr);
m_Connection.Open();
using (var com = m_Connection.CreateCommand())
{
com.CommandText = @"select 1";
com.ExecuteNonQuery();
}
m_Connection.Close();
m_Connection.Dispose();
GC.Collect();
GC.WaitForPendingFinalizers();
try
{
File.Delete(dbFile);
}
catch (Exception e)
{
throw e;
}
运行正常
dispose与close()的区别
Dispose了,就必须再Create一次
而Close()后,还可以再Open(),
而Dispose后,对象都不存在了,就不能Open()了
Dispose是对于对象自身而言的,Close是对于连接数据库而言的
如对本文有疑问,请提交到交流论坛,广大热心网友会为你解答!! 点击进入论坛