0

我正在自动化使用 CSV 文件的邮件合并过程。此过程的一部分需要创建一个数据库(OpenOffice odb 文件),然后将其注册为数据源。当我来删除数据库时,我收到一个异常,指出“无法删除您的文件:它正在被其他人或程序使用”。问题是我无法让 OpenOffice 进程释放此资源(不杀死它)。我目前的代码是:

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。谢谢

4

2 回答 2

0

设法解决了这个问题,以防万一其他人对此感兴趣。
关键是获取对实际数据源的引用,然后将其处理掉。

基本步骤是:

  1. 检查是否存在具有指定名称的数据源
  2. 获取数据源对象
  3. 获取数据源文件名
  4. 处置与数据源关联的数据库文档
  5. 处理实际的数据源
  6. 删除数据库文件:)

这个的源代码看起来像

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()); 

如果有任何改进请告诉我...

于 2012-07-09T09:53:43.377 回答
0

单击查看,单击数据源,右键单击要删除的已注册数据库,单击已注册数据库,单击要删除的突出显示的已注册数据库的删除。

于 2014-04-11T03:08:30.067 回答