[ reiser @ 24.11.2010. 20:51 ] @
| 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 ? |
[ savkic @ 25.11.2010. 16:49 ] @
> 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.
[ reiser @ 26.11.2010. 01:10 ] @
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.
[ reiser @ 26.11.2010. 02:06 ] @
//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.
Copyright (C) 2001-2025 by www.elitesecurity.org. All rights reserved.