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;
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 ?