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 に答える