2017-11-17 32 views
0

명시된 바와 같이 here C# 을 사용하여 SQL Server에서 Access로 테이블을 다시 작성합니다. 도움을 받으니 덕분에 프로세스를 완료 할 수 있었지만 .accdb 파일은 꽤 깁니다. 큰, 나중에 압축하고 그들을 수리해야합니다. 그 때문에 the marked answer from here을 사용했습니다. 이상하게도 "Microsoft Office 16.0 Access 데이터베이스 엔진 개체 라이브러리"에 대한 참조 만 내 프로젝트에 추가 할 수있었습니다. 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

후기 바인딩을 사용하여 데이터베이스 엔진 개체를 생성 해보십시오. 'using System.Reflection; '및'Object engine = Activator.CreateInstance (Type.GetTypeFromProgID ("DAO.DBENGINE.36")); ' –

+0

@ErikvonAsmuth가 답장을 보내 주셔서 감사합니다. 컴파일러에서 해당 메서드에 대한 정의가 없으므로 메서드 "CompactDatabase"를 어떻게 호출합니까? – Scorch

+1

아, 'Dynamic'타입을 사용하면이 문제를 해결할 수 있습니다. (동적 엔진 = Activator.CreateInstance (Type.GetTypeFromProgID ("DAO.DBENGIN E.36 ")); ' –

답변

1

아쉽게도 JRO, ADO 또는 ADOX를 사용하여 Microsoft Access .accdb (Access 2007 이상) 데이터베이스 파일을 압축하고 복구 할 수 있습니다. 그러나 DBEngine 개체를 사용하면 올바른 방향으로 가고 있습니다. PIA 의존을 피하기 위해 사용할 수있는 한 가지 방법은 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와 함께 번들로 제공되지 않습니다. JET DAO는 Windows XP 이후 Windows와 번들되었습니다. –