您现在的位置: 365建站网 > 365学习 > sqlite错误:close和dispose后不能释放与db文件的连接

sqlite错误:close和dispose后不能释放与db文件的连接

文章来源:365jz.com     点击数:212    更新时间:2019-04-26 16:23   参与评论

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是对于连接数据库而言的


如对本文有疑问,请提交到交流论坛,广大热心网友会为你解答!! 点击进入论坛


发表评论 (212人查看0条评论)
请自觉遵守互联网相关的政策法规,严禁发布色情、暴力、反动的言论。
用户名: 验证码: 点击我更换图片
最新评论
------分隔线----------------------------