五月综合缴情婷婷六月,色94色欧美sute亚洲线路二,日韩制服国产精品一区,色噜噜一区二区三区,香港三级午夜理伦三级三

您現(xiàn)在的位置: 365建站網(wǎng) > 365文章 > sqlite錯誤:close和dispose后不能釋放與db文件的連接

sqlite錯誤:close和dispose后不能釋放與db文件的連接

文章來源:365jz.com     點擊數(shù):1252    更新時間: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;

            }


執(zhí)行代碼,在刪除文件時提示:

An unhandled exception of type 'System.IO.IOException' occurred in TestSqlite.exe


Additional information: 文件“G:\test.db”正由另一進程使用,因此該進程無法訪問此文件。


異常。


原因是sqlite在執(zhí)行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()的區(qū)別 

Dispose了,就必須再Create一次
而Close()后,還可以再Open(), 
而Dispose后,對象都不存在了,就不能Open()了
Dispose是對于對象自身而言的,Close是對于連接數(shù)據(jù)庫而言的


如對本文有疑問,請?zhí)峤坏浇涣髡搲瑥V大熱心網(wǎng)友會為你解答??! 點擊進入論壇

發(fā)表評論 (1252人查看,0條評論)
請自覺遵守互聯(lián)網(wǎng)相關的政策法規(guī),嚴禁發(fā)布色情、暴力、反動的言論。
昵稱:
最新評論
------分隔線----------------------------

其它欄目

· 建站教程
· 365學習

業(yè)務咨詢

· 技術支持
· 服務時間:9:00-18:00
365建站網(wǎng)二維碼

Powered by 365建站網(wǎng) RSS地圖 HTML地圖

copyright © 2013-2024 版權所有 鄂ICP備17013400號