2012-07-06 72 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

单击视图,单击数据源, 右键点击注册的数据库,你想删除, 单击已注册数据库, 单击删除以选择要删除的突出显示的注册数据库。