Problema en la compactación de la base de datos Access 2007, después de la compactación base de datos Access 2007 se convierte al formato de Access 2002-2003

StackOverflow https://stackoverflow.com/questions/3863165

Pregunta

Estoy utilizando un procedimiento de Delphi para Compactar base de datos de acceso

Código sniphet del procedimiento es:

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;

El resultado de este procedimiento es el Compactar base de datos Access, pero en formato de Access 2002-2003.

Soy incapaz de conseguir el área del problema. Es algunas necesidades configuración DLL o regsitry ser renovados? Por favor, ayuda ...

¿Fue útil?

Solución

Gracias 4 ur ayuda, he encontrado una solución a este problema de trabajo y se encontró que vale la pena compartir con ustedes.

Ahora, en lugar de utilizar Jet 4, ahora estoy utilizando '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;

El resultado es el compactado Databsae en Access 2007 Formato. Saludos!

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top