2017-11-17 5 views
0

here C#を使用してSQL ServerからAccessにテーブルを再構築しています 私が受け取ったヘルプのおかげで、.accdbファイルがきれいです大きな、私は圧縮し、後でそれらを修復する必要があります。 そのために、the marked answer from hereを使用しました。不思議なことに、自分のプロジェクトに追加できる「Microsoft Office 16.0アクセスデータベースエンジンオブジェクトライブラリ」の参照のみがありました。 DBEngineの初期化時に C#DAOまたはADOXを使用して.accdbファイルを圧縮して修復する

using Microsoft.Office.Interop.Access.Dao; 

var engine = new DBEngine(); // Exception 
var destFile = Path.GetFileNameWithoutExtension(filepath) + "_Compact" + ".accdb"; 
var destFilePath = Path.Combine(Path.GetDirectoryName(filepath), destFile); 

engine.CompactDatabase(filepath, destFilePath); 

- オブジェクトは、例外がスローされます。また、

Retrieving the COM class factory for component with CLSID {CD7791B9-43FD-42C5-AE42-8DD2811F0419} failed due to the following error: 80040154 Class not registered (Exception from HRESULT: 0x80040154 (REGDB_E_CLASSNOTREG)). 

は、このタスクにADOXを使用する方法があり、私はすでに作成のためにそれを使用していますので、私のカタログ?

+1

データベースバインディングを使用してデータベースエンジンオブジェクトを作成してみてください: 'System.Reflection; 'と' Object engine = Activator.CreateInstance(Type.GetTypeFromProgID( "DAO.DBENGINE.36")); ' –

+0

@ErikvonAsmuthはあなたの返事に感謝します。コンパイラはそのメソッドの定義がないので、メソッド "CompactDatabase"をどのように呼び出すのですか? – Scorch

+1

ああ、あなたは 'ダイナミック'型を使って回避することができます。(これらのものがなくても動作するvbの人のほうが) 'Dynamic engine = Activator.CreateInstance(Type.GetTypeFromProgID(" DAO.DBENGIN E.36 "));' –

答えて

1

残念ながら、JRO、ADO、ADOXは、Microsoft Access .accdb(Access 2007およびそれ以上)のデータベースファイルを圧縮して修復するために使用できます。ただし、DBEngineオブジェクトを使用して適切な軌道に乗っています。 PIAに頼るのを避けるために使用できる方法の1つは、ACE DAOエンジン(古い.mdb形式のJET DAOエンジンを置き換える)で遅延バインディングを使用することです。

この方法では、PIAまたはプロジェクト参照は必要ありません。しかし、ACEエンジンをマシンにインストールする必要があります。 ACEは自由に配布可能であり、Microsoftからダウンロードできます。Microsoft Access Database Engine 2010 Redistributable

using System; 

// Use ACE DAO to Compact an Access .ACCDB file 
// This method uses late binding to create the ACE DAO.DBEngine object 
public bool CompactDatabaseACE(string SourceDb, string TempPath) 
{ 
    string Temp1Db, Temp2Db; 
    object[] oParams; 
    bool retVal = false; 

    Temp1Db = Path.Combine(TempPath, Path.GetFileNameWithoutExtension(SourceDb) + ".cmp"); 
    Temp2Db = Path.Combine(Path.GetDirectoryName(SourceDb),Path.GetFileNameWithoutExtension(SourceDb) + ".old"); 
    if (File.Exists(Temp1Db)) 
     File.Delete(Temp1Db); 
    if (File.Exists(Temp2Db)) 
     File.Delete(Temp2Db); 
    oParams = new object[] 
    { 
     SourceDb, Temp1Db 
    }; 
    try 
    { 
     object DBE = Activator.CreateInstance(Type.GetTypeFromProgID("DAO.DBEngine.120")); 
     DBE.GetType().InvokeMember("CompactDatabase", System.Reflection.BindingFlags.InvokeMethod, null, DBE, oParams); 
     if (File.Exists(Temp1Db)) 
     { 
      try 
      { 
       File.Move(SourceDb, Temp2Db); 
      } 
      catch { } 
      if (File.Exists(Temp2Db)) 
      { 
       try 
       { 
        File.Move(Temp1Db, SourceDb); 
       } 
       catch { } 
       if (File.Exists(SourceDb)) 
       { 
        retVal = true; 
       } 
      } 
      if (File.Exists(Temp1Db)) 
       File.Delete(Temp1Db); 
      if (File.Exists(Temp2Db)) 
       File.Delete(Temp2Db); 
     } 
     System.Runtime.InteropServices.Marshal.ReleaseComObject(DBE); 
     DBE = null; 
    } 
    catch (Exception ex) 
    { 
     // Do something with the error 
    } 
    return retVal; 
} 
+0

プログラムを使用したいすべてのマシンにACEをインストールする必要がありますか? – Scorch

+0

はい、存在しない場合はあります。 Microsoft Officeがインストールされている場合、ACEはすでにマシンにインストールされている可能性があります。 ACEはまだWindowsにバンドルされていません。 Windows XP以降、JET DAOはWindowsにバンドルされています。 –

関連する問題