2011-06-17 58 views
3

我正在開發一個C#應用程序,其後端爲sqlite。在我的應用程序中,我有一個用於清理數據庫的按鈕(刪除.db文件並使用一些初始數據重新創建它)。有時當我嘗試刪除數據庫時,它說它不能被刪除,因爲它正在被另一個進程使用。在刪除它之前,我正在使用緊密連接,處理和清除池功能。即使這樣它也會拋出同樣的異常。這裏是我的代碼:刪除sqlite數據庫文件

string targetDataBaseFilePath = Path.Combine(dataDirectoryPath, "local.db");    
ThingzDatabase.Create(targetDataBaseFilePath, "touchdb"); 

在創建函數我定義了下面的代碼,從那裏我得到的錯誤:

if (File.Exists(DatabaseFileName)) 
{ 
    try 
    { 
     ThingzDatabase.localdb.conn.Close(); 
     ThingzDatabase.localdb.conn.Dispose(); 
     SQLiteConnection.ClearAllPools(); 
    } 
    catch (Exception) 
    { 
    } 
    File.Delete(DatabaseFileName); //error throws from here.      
} 

我怎樣才能防止被拋出的錯誤?

回答

-1

我相信你還沒有處理從API返回的東西。

你使用哪個sqlite包裝?你引用了你的自定義函數,他們做了什麼?

-1
ThingzDatabase.localdb.conn.ClearAllPools(); 

應該是我認爲該行的呼叫。

+0

我會很樂意回顯! – 2011-12-16 06:21:03

-1

您可以使用Mark Russinovich的one這樣的procmon。
然後,您可以根據文件名篩選顯示。
完成此操作後,您可以看到哪個進程正在鎖定此文件,並進行相應的調試。

-2

我可以建議你,只是一種變通方法,

  1. 創建新的數據庫,並通過overwriting the exisiting config or Setting.Setting file讓在您的配置文件相同的一個條目。

  2. Clear all pools如上所述。

  3. 使用Process.kill(name of your app exe)然後Process.start(your exe)使用Process class

  4. 重新啓動將刷新連接字符串,並附加有新的數據庫exe文件,重新啓動您的應用程序。

  5. Enumerate all db except the newly created in the target dirs,做任何你想要使用FileInfo

2

最後我只是問了question自己。解決方案是讓垃圾收集運行一下。

0

在連接字符串中使用此Pooling = False;我遇到了同樣的問題。

-1

我看到很多與進程工作。但是sqlite有一個方法。 真空

The VACUUM command rebuilds the database file, repacking it into a minimal amount of disk space.

https://sqlite.org/lang_vacuum.html