Avatar billede hugopedersen Nybegynder
12. april 2010 - 12:24 Der er 6 kommentarer og
1 løsning

Compact/repair MS Access database fra Delphi

Hvad er den mest korrekte metode til compact/repair af en Access database fra Delphi?

Hvis jeg søger på nettet, så er der ikke noget helt entydigt svar.
Avatar billede arne_v Ekspert
17. april 2010 - 23:58 #1
Jeg har ingen anelse om hvad der er bedst.

Men jeg er så doven at jeg bare ville køre msaccess.exe med /compact !
Avatar billede hugopedersen Nybegynder
18. april 2010 - 10:23 #2
Der er kun den hage ved det at M$ Access så skal være installeret på maskinen. Og det er den nødvenigvis ikke :-)
Avatar billede arne_v Ekspert
19. april 2010 - 02:26 #3
Så du leder efter en Jet driver only løsning.
Avatar billede hugopedersen Nybegynder
19. april 2010 - 11:47 #4
Jeg fik nedenstående bakset sammen. Men den kræver selvfølgelig at databasen er lukket ned af alle, ellers kan den ikke låses som påkrævet.

function acCompact(aDB: string): boolean;
var
  JE: TJetEngine;
  Temp: string;
  TempConn: string;
const
  Provider = 'Provider=Microsoft.Jet.OLEDB.4.0; Data Source=';
begin
  Temp := ExtractFileDir(aDB) + 'TEMP' + ExtractFileName(aDB);
  TempConn := Provider + Temp;
  FileDeleteIfExists(Temp);
  JE:= TJetEngine.Create(Application);
  try
    try
      JE.CompactDatabase(Provider + aDB, TempConn);
      FileDeleteIfExists(aDB);
      FileRenameIfExists(Temp, aDB);
    except
      on E:Exception do
        begin
          Logfile.Error(E.Message);
        end;
    end;
  finally
    JE.FreeOnRelease;
    Result := True;
  end;
end;
Avatar billede arne_v Ekspert
19. april 2010 - 22:48 #5
Du maa kunne fange hvis du ikke kan laase databasen.

Derudover ville jeg teste at den nye database eksisterede og var OK inden jeg slettede den gamle.
Avatar billede hugopedersen Nybegynder
20. april 2010 - 07:42 #6
Jeg disconnecter min UniDAC forbindelse til db'en - så kan jeg se om den er låst/i brug med følgende kode jeg har fra gammel tid
function FileInUse(aFile : string): Boolean;
var
  hFileRes: HFILE;
begin
  Result := False;
  if not FileExists(aFile) then exit;
  hFileRes := CreateFile(PChar(aFile),
                                    GENERIC_READ or GENERIC_WRITE,
                                    0,
                                    nil,
                                    OPEN_EXISTING,
                                    FILE_ATTRIBUTE_NORMAL,
                                    0);
  Result := (hFileRes = INVALID_HANDLE_VALUE);
  if not Result then
    CloseHandle(hFileRes);
end;

Jeg renamer med følgende kode. Den checker dog ikke om db'en er OK.
function FileRenameIfExists(Const aOld, aNew: string ): boolean;
begin
  Result:= (FileExists(aOld)) and (FileExists(aNew));
  if Result = True then
    Result := FileDeleteIfExists(aOld);
  if Result = True then
    Result:= SysUtils.RenameFile(aOld, aNew);
end;
Avatar billede hugopedersen Nybegynder
28. april 2010 - 15:22 #7
Fik som sagt selv bikset noget sammen der ser ud til at fungere
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester