2011-05-13 90 views
0

所以我這是爲了檢查是否有表中被定義爲數據庫中存在的方法如下:檢查是否表存在保持連接打開SQLite中

internal override bool TableExists(string tableName) 
{ 
    bool tableExists = false; 

    // Check the Tables schema and see if the table exists 
    using (SQLiteConnection conn = (SQLiteConnection) CreateConnection()) 
    { 
     conn.Open(); 
     DataRow[] rows = conn.GetSchema("Tables").Select(string.Format("Table_Name = '{0}'", tableName)); 
     tableExists = (rows.Length > 0); 
    } 

    // Actually called elsewhere in the code, just here for testing. 
    File.Delete(DatabaseEnvironmentInfo.GetPrimaryDataFile(DatabaseName)); 

    return tableExists; 
} 

CreateConnection()只是創建一個新的連接連接字符串,所以我不認爲這個問題在那裏。如果我有刪除線conn.GetSchema("Tables")...,我能夠刪除數據庫文件,但如果我再補充一點線早在我出現以下情況例外,當我嘗試using後刪除:

System.IO.IOException: 不能訪問該文件的進程「C:\ db.sqlite」 ,因爲它正由另一個 過程..

DataRow對象存到數據庫的連接,或有沒有人知道是什麼的問題可能是?如果有更好的方法來檢查一個表是否存在於SQLite中,我也對它開放。

謝謝!

回答

2

好吧,所以我已經找到了這個問題,所以我會在這裏發佈它,以防萬一任何人遇到同樣的問題。基本上我啓用了連接池,因此連接與數據庫保持開放連接,這就是我看到異常的原因。只需添加下面的using後:

SQLiteConnection.ClearAllPools(); 
0

如果在使用結束時添加conn.Close(),是否可以刪除數據庫?

+0

我已經試過,並沒有幫助。另外,我非常肯定,當我們退出範圍時,using語句將明確地關閉連接。 – 2011-05-13 15:27:36

+0

using語句確保在塊結束時將調用dispose並將對象註冊爲垃圾回收。我雖然也許這個配置還沒有被調用,當你試圖刪除文件 – Martin 2011-05-13 15:30:43

+0

是的,我想這是可能的。但在真實的代碼中,我嘗試在代碼中進一步刪除數據庫。這正是我縮小到的地方。 – 2011-05-13 15:32:59

0

我已經不使用連接池類似的問題。我發現問題是由TableAdapters中丟失的SQLiteCommand引起的。

你可以找到更多的細節here