2012-08-25 107 views
-1

我有一個Web應用程序,它創建了一個Access數據庫。 當我創建這個數據庫時,我首先必須刪除該文件,如果它存在,然後重新創建它。我想刪除文件時出錯

  if (File.Exists(DataSourcePath + fileName)) 
       File.Delete(DataSourcePath + fileName); 

      string cnnStr = @"Provider=Microsoft.Jet.OLEDB.4.0; Data Source=" + DataSourcePath + fileName + "; Jet OLEDB:Engine Type=5"; 
      var catType = Type.GetTypeFromProgID("ADOX.Catalog"); 
      object o = Activator.CreateInstance(catType); 
      catType.InvokeMember("Create", BindingFlags.InvokeMethod, null, o, new object[] { cnnStr }); 

      OleDbConnection cnn = new OleDbConnection(cnnStr); 
      var cmd = cnn.CreateCommand(); 

      cnn.Open(); 
      cmd.CommandText = "CREATE TABLE TblInfoCompany (Name TEXT, Family TEXT)"; 
      cmd.ExecuteNonQuery(); 

      cmd.Dispose(); 
      cnn.Close(); 
      cnn.Dispose(); 

當我重新創建這個文件時,我可以得到一個異常。 異常說:「該文件在另一個進程中使用。」 請幫我關閉此過程或找到解決此問題的方法。

謝謝。

+3

顯示相關代碼。並且從字面上引用錯誤,並沒有涉及「Open Process」。 –

+0

您的連接可能是合併的,因此關閉它是不夠的。請參閱[ReleaseObjectPool](http://msdn.microsoft.com/zh-cn/library/system.data.oledb.oledbconnection.releaseobjectpool%28v=vs.100%29.aspx) –

回答

1

保留正在使用的文件的過程可能是Web應用程序本身。由於關閉/打開該mdf文件不是由您直接處理,而是來自Jet Engine,因此並不那麼容易。我建議的PInvoke系統功能MoveFileEx指定:

  • null作爲第二個參數,這意味着你要刪除
  • MOVEFILE_DELAY_UNTIL_REBOOT作爲dwFlags中,這意味着該操作將在下次系統重新啓動來完成

我知道是不是最好的,因爲服務器並不是經常關閉,但可能是更簡單的解決方案來刪除一個鎖定的文件,你不能關閉別的途徑。