Navigacija
Lista poslednjih: 16, 32, 64, 128 poruka.

Delphi 7, Access 2010 database, compact & repair problem

[es] :: Pascal / Delphi / Kylix :: Delphi 7, Access 2010 database, compact & repair problem

[ Pregleda: 1896 | Odgovora: 3 ] > FB > Twit

Postavi temu Odgovori

Autor

Pretraga teme: Traži
Markiranje Štampanje RSS

reiser

Član broj: 7895
Poruke: 2314



+102 Profil

icon Delphi 7, Access 2010 database, compact & repair problem24.11.2010. u 20:51 - pre 163 meseci
Hocu da kompaktujem Access 2010 (.accdb) bazu iz Delphi 7. Funkcija:

Code:

function CompactDatabase(ADatabasePathName : String) : Boolean;
var
  JE      : TJetEngine;
  sdbTemp : String;
  DAO     : OleVariant;
begin
  JE := nil;
  try
    JE := TJetEngine.Create(Application);
    result := FALSE;
    sdbTemp := IncludeTrailingBackslash(ExtractFilePath(ADatabasePathName)) + IntToStr(GetTickCount) + ExtractFileName(ADatabasePathName);
    If FileExists(sdbTemp) Then
      DeleteFile(sdbTemp);

    try
      DAO := CreateOleObject('DAO.DBEngine.120');
      DAO.CompactDatabase(ADatabasePathName, sdbTemp);
      result := TRUE;
    except
    end;

    If DeleteFile(ADatabasePathName) Then
      RenameFile(sdbTemp, ADatabasePathName);

    If FileExists(sdbTemp) Then
      DeleteFile(sdbTemp);
  finally
    If Assigned(JE) Then
      JE.FreeOnRelease;
  end;
end;

...

procedure TForm.CompactDB;
begin
  DatabaseConnection.AfterDisconnect := DatabaseConnectionCompactIt;
  DatabaseConnection.Close;
end;

procedure TMainWindow.DatabaseConnectionCompactIt(Sender: TObject);
begin
  DatabaseConnection.AfterDisconnect := nil;
  CompactDatabase(IncludeTrailingBackslash(ExtractFilePath(ParamStr(0))) + 'base.accdb');
  tblRaw.Active := TRUE;
  tblProcessed.Active := TRUE;
end;


Dakle, prilikom poziva CompactDB(), procedura zatvara DatabaseConnection (ADOConnection) i setuje event koji se poziva posle diskonektovanja. DatabaseConnectionCompactIt() poziva CompactDatabase() fju i posle kompaktovanja aktivira tabele - koje automatski aktiviraju DatabaseConnection. Sve ovo se uspesno odradi, ali mi posle toga baci ovu gresku:



...iako je compact & repair uspesno odradjen. Hints ?
 
Odgovor na temu

savkic
Igor Savkić

Moderator
Član broj: 92186
Poruke: 2739



+92 Profil

icon Re: Delphi 7, Access 2010 database, compact & repair problem25.11.2010. u 16:49 - pre 163 meseci
> Dakle, prilikom poziva CompactDB(), procedura zatvara DatabaseConnection (ADOConnection) i setuje event koji se poziva posle diskonektovanja.
> DatabaseConnectionCompactIt() poziva CompactDatabase() fju i posle kompaktovanja aktivira tabele - koje automatski aktiviraju DatabaseConnection. Sve ovo se uspesno odradi, ali
> ..iako je compact & repair uspesno odradjen. Hints ?

Da li si puštao program kroz debugger, red po red, gde se tačno javi greška? Vidim i da u onAfterDisconnect događaju za bazu ti postavljaš da su neke tabele aktivne, to može biti uzrok. Ako ne otkriješ, uključi use debug dcu, i idi red po red sve dok ne dobiješ grešku pa eventualno možeš videti u kom Delphi unitu, kada i zašto do toga dolazi.



 
Odgovor na temu

reiser

Član broj: 7895
Poruke: 2314



+102 Profil

icon Re: Delphi 7, Access 2010 database, compact & repair problem26.11.2010. u 01:10 - pre 163 meseci
Dolazi do greske prilikom poziva JE.FreeOnRelease() funkcije u CompactDatabase(). Ali, ako komentujem JE.FreeOnRelease(), onda dolazi do greske u liniji iznad, If FileExists()... ? Weird... Dakle, definitivno CompactDatabase() funkcija ne valja, a nigde na netu ne mogu da nadjem kako da compactujem Access2010 bazu.
 
Odgovor na temu

reiser

Član broj: 7895
Poruke: 2314



+102 Profil

icon Re: Delphi 7, Access 2010 database, compact & repair problem26.11.2010. u 02:06 - pre 163 meseci
//edit

Sada sam primetio da ako ovu funkciju pozovem is drugog programa, tj iskopiram kod funkcije u prazan projekat i pokrenem je, ne dolazi do nikakve greske. Dakle, definitivno se desava neki konflikt izmedju ADOConnection/DataSet/ADOQuery objekta koji koriste tu bazu i CompactDatabase() funkcije. Jel dobro zatvaram bazu pre kompaktovanja ? ADOConnection.Close ().. ? Probao sam i da zatvorim sve datasetove i tabele pre pozive CompactDatabase(), ali i dalje ista greska.
 
Odgovor na temu

[es] :: Pascal / Delphi / Kylix :: Delphi 7, Access 2010 database, compact & repair problem

[ Pregleda: 1896 | Odgovora: 3 ] > FB > Twit

Postavi temu Odgovori

Navigacija
Lista poslednjih: 16, 32, 64, 128 poruka.