Riprendo questo post dopo un po di tempo, avendo trovato la soluzione la condivido, anche se poco utilizzato MS Access potrebbe venire utile a qualcuno.
@DragoRosso,
ho seguito le tue indicazioni ma senza riuscire a risolvere (probabilmente per colpa mia), devo dire però che il driver Microsoft.ACE.OLEDB.12.0 mi ha permesso poi di collegarmi e lavorare anche su Access .accdb, alla fine il problema della compattazione dei DB Access l'ho risolta utilizzando DAO.DBEngine.120.
Ovviamente l'ho testato sia su DB 2000-2003 (.mdb) che su DB 2007-2013 (.accdb),
sia DB protetti da password che senza e inclusa versione cifrata,
verificato dimensioni iniziali e finali dopo la compattazione, confrontando i risultati ottenuti sia eseguendo il comando all'interno di Access, che con questo codice,
stesso risultato :) :)
ecco il codice sorgente (relativo solo alla chiamata OLE, la parte mancante del programma è una banalità:
procedure TForm1.BitBtnCompactClick(Sender: TObject);
const
ServerName = 'DAO.DBEngine.120';
var
Server: Variant;
Duration : TDateTime;
begin
// DB da compattare...
if ( OldDBName = '' ) then begin
ShowMessage('Selezionare i DB da compattare.');
Exit;
end;
if MessageDlg( 'Prosegui con la compattazione del DB ?.', mtInformation, [mbOk, mbCancel],0) = mrCancel then exit;
Password := Edit1.Text;
if Password = 'none' then Password := '';
Screen.Cursor := crHourglass;
try
Duration := Now();
try
Server := CreateOleObject(ServerName);
// l'ultimo parametro è la password per accedere al DB (se impostata) ho testato che se il DB non ha password la si può lasciare vuota e funziona lo stesso
Server.CompactDatabase( OldDBName, NewDBName, , , ';pwd=dago');
Label2.Caption := 'Operazione completata con successo in : ' +TimeToStr(Now() - Duration) ;
ShowMessage('Il database è stato compattato regolarmente.');
except
Label2.Caption := 'Errore nell''esecuzione del comando !';
ShowMessage('Si è verificato un errore durante la compattazione, ' + #13 + #13 +
'verificare se la password è stata impostata correttamente');
end;
finally
Screen.Cursor := crDefault;
end;
// questo l'ho messo perchè mi era utile per vedere il prima e dopo il processo,
if CheckBoxDeleteOldFile.Checked then begin
DeleteFile( OldDBName);
RenameFile( NewDBName, OldDBName);
end;
end;