2012-07-06 74 views
0

我正在自動化使用CSV文件的mailmerge進程。部分此過程需要創建一個數據庫(OpenOffice odb文件),然後將其註冊爲數據源。當我來刪除數據庫時,我收到一個異常,指出'不能刪除你的文件:它正在被另一個人或程序使用'。問題是我無法讓OpenOffice進程釋放這個資源(而不是殺死它)。我當前的代碼是:取消註冊數據源並刪除關聯的CSV文件

public string DeleteDatasource(string datasourceName) 
    { 
     string result = string.Empty; 
     object databaseContext = _MultiServiceFactory.createInstance("com.sun.star.sdb.DatabaseContext");; 
     try 
     { 
      XDatabaseRegistrations databaseRegistrations = (XDatabaseRegistrations)databaseContext; 
      if(databaseRegistrations.hasRegisteredDatabase(datasourceName)) 
      { 
       /* //attempt one 
       XNameAccess nameAccess = (XNameAccess)OODatabaseContext; 
       object datasource = nameAccess.getByName(datasourceName); 
       XNamingService namingservice = (XNamingService)OODatabaseContext; 
       namingservice.revokeObject(datasourceName); 
       */ 

       //attempt 2 
       string databaseLocation = databaseRegistrations.getDatabaseLocation(datasourceName); 
       databaseRegistrations.revokeDatabaseLocation(datasourceName); 

       if (!String.IsNullOrEmpty(databaseLocation)) 
        try 
        {        
         //As File Path converts the uno file string into a standard form i.e. "file:///c:/temp/DatabaseFile.odb" to "c:\\temp\\DatabaseFile.odb" 
         File.Delete(databaseLocation.AsFilepath());         
        } 
        catch (System.Exception ex) 
        { 
         //some error handling 
        } 
      } 
      return result; 
     } 
     catch (System.Exception ex) 
     { 
      //More error handling 
     } 
    } 

任何想法如何,我可以註銷該數據源,這樣我就可以刪除ODB。 謝謝

回答

0

管理繞過這個問題,以防萬一誰有興趣這裏是如何。
關鍵是要獲得對實際數據源的引用,然後將其處理掉。

的基本步驟是:

  1. 檢查,如果數據源與指定名稱
  2. 獲取數據源對象
  3. 獲取數據源文件名
  4. 處置與數據源
  5. 相關聯的數據庫文件
  6. 配置實際數據源
  7. 刪除數據庫文件:)

這個源代碼類似

XNameAccess nameAccess = (XNameAccess)_MultiServiceFactory.createInstance("com.sun.star.sdb.DatabaseContext"); 
object datasource = nameAccess.getByName(datasourceName); 
XDocumentDataSource obj = (XDocumentDataSource)((Any)datasource).Value; 
//get the location of the associated odb file before we dispose the document object 
//and deregister the datasource 
string databaseLocation = databaseRegistrations.getDatabaseLocation(datasourceName); 
databaseRegistrations.revokeDatabaseLocation(datasourceName); 
((XComponent)obj.DatabaseDocument).dispose(); 
((XComponent)obj).dispose(); 


//put in a try block as we want to continue even if this fails 
//AsFilepath converts the OpenOffice file path to standard for that can be used with the standard IO file access classes 
File.Delete(databaseLocation.AsFilepath()); 

如果有任何改進,請讓我知道...

0

單擊視圖,單擊數據源, 右鍵點擊註冊的數據庫,你想刪除, 單擊已註冊數據庫, 單擊刪除以選擇要刪除的突出顯示的註冊數據庫。