【问题标题】:Problem in compacting Access 2007 Database, After Compacting Access 2007 Database gets converted to Access 2002-2003 format压缩 Access 2007 数据库时出现问题,压缩 Access 2007 数据库后转换为 Access 2002-2003 格式
【发布时间】:2011-04-21 06:15:49
【问题描述】:

我正在使用 Delphi 程序来压缩 Access 数据库

程序的代码片段是:

procedure CompactDatabase(pFullDatabasePathName : string; pLoginName : string = '';    pPassword : string = ''; pSystemDb : string = '');

var
  JE            : TJetEngine;

  sdbTemp       : String;

  sdbTempConn   : String;

  sdbSrcConn    : String;

  loginString   : String;

  systemDbString: String;

  compactDone   : Boolean;

  const
    SProviderAccess2007 = 'Provider=Microsoft.ACE.OLEDB.12.0;Data Source=';

    SEngine = ';Jet OLEDB:Engine Type=';
    Access2007EngineType = '5';

 begin

  loginString := '';

  if (pLoginName <> '') then
    loginString := ';User Id= ' + pLoginName + '; Password = ' + pPassword;

  if ((pLoginName = '') and (pPassword <> '')) then
    loginString := ';Jet OLEDB:Database Password = ' + pPassword;


  systemDbString := '';

  if (pSystemDb <> '') then
    systemDbString := ';Jet OLEDB:System Database = ' + pSystemDb;


    try
      compactDone := False;
      JE := TJetEngine.Create(Application);

      sdbTemp := ExtractFileDir(pFullDatabasePathName) + '\TEMP' + ExtractFileName(pFullDatabasePathName);

      if FileExists(sdbTemp) then
        DeleteFile(sdbTemp);


      //Access 2007
      if not compactDone then
        begin
          try
            sdbSrcConn := SProviderAccess2007 + pFullDatabasePathName + loginString + systemDbString + SEngine + Access2007EngineType;
            sdbTempConn := SProviderAccess2007 + sdbTemp + SEngine + Access2007EngineType;
          JE.CompactDatabase(sdbSrcConn, sdbTempConn);
            compactDone := True;
          except
          end;
        end;

      if not compactDone then
        Raise Exception.Create('Compacting of database: ' + pFullDatabasePathName + 'failed!');

      if (not DeleteFile(pFullDatabasePathName)) then
        Raise Exception.Create('Compacting failed because cannot delete database: ' +  pFullDatabasePathName);

      if (not RenameFile(sdbTemp, pFullDatabasePathName)) then
        Raise Exception.Create('Compacting failed because cannot overwrite database: ' +  pFullDatabasePathName + ' by temporary compacted database: ' +   sdbTemp);

        if FileExists(sdbTemp) then
          DeleteFile(sdbTemp);

  finally
    JE.FreeOnRelease;
  end;
 end;

此过程的结果是 Compact Access 数据库,但采用 Access 2002-2003 格式。

我无法找到问题区域。是否需要更新某些 dll 或注册表设置? 请帮忙...

【问题讨论】:

  • 您确定您使用的是 5 型引擎吗? CompactDatabase 方法描述 (msdn.microsoft.com/en-us/library/bb237197(office.12).aspx) 中使用的连接字符串使用“Provider=Microsoft.Jet.OLEDB.4.0;”你的代码指的是“Microsoft.ACE.OLDDB.12.0” 喷气发动机的最高版本是4。版本12还有很长的路要走?​​span>
  • "Provider=Microsoft.Jet.OLEDB.4.0;"用于Access 97/2000访问数据库,对于Access2007,使用'Provider=Microsoft.ACE.OLEDB.12.0'。
  • 严格来说,“Provider=Microsoft.Jet.OLEDB.4.0;”适用于所有 Jet 4 数据库,这意味着 A2000、A2002、A2003 以及以 A2000 或更高格式创建的任何 MDB 文件,包括在 A2007 或 A2010 中创建的 MDB 文件。对于 ACCDB,您需要使用 ACE,而不是 Jet 4。Jet 4 对 ACCDB 格式一无所知,直到 A2007 引入 ACE。

标签: delphi ms-access ms-access-2007 compact-database


【解决方案1】:

感谢 4 的支持,我找到了解决此问题的有效方法,并认为值得与您分享。

现在我不使用 Jet 4,而是使用“DAO.DBEngine.120”。

  //Access 2007 
  if not compactDone then 
    begin 
      try
       // DaoAccess2007 is OleVariant Type

        DaoAccess2007 := CreateOleObject('DAO.DBEngine.120');
        DaoAccess2007.CompactDatabase(pFullDatabasePathName,sdbTemp); 
        compactDone := True; 
      except 
      end; 
    end;

结果是 Access 2007 格式的压缩数据库。 干杯!

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-05-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-11-07
    • 1970-01-01
    相关资源
    最近更新 更多