PDA

Visualizza la versione completa : Dimensioni database non diminuiscono nonostante svuoto le tabelle


halinder
07-10-2008, 10:28
Salve a tutti!

Mediante un programma scritto in delphi 7 riempo un database MSAccess composto da una decine di tabelle. Man mano che aggiungevo record le dimensioni del database sono passate da pochi mega a 150 mega. Ora ho svuotato le tabelle tramite l'istruzione delete ma, nonostante i record siano stati effettivamente eliminati, le dimensioni del database non sono diminuite. PerchŔ? La dimensione del database non Ŕ proporzionale ai dati che contiene? Esiste un modo per "ricompattare"?

LeleFT
07-10-2008, 12:11
Access mette a disposizione uno strumento apposito per questo problema:

Lo trovi nel men¨ Strumenti -> UtilitÓ Database - > Compatta e ripristina Database...

Se sia possibile richiamarlo da un programma esterno attraverso qualche API non lo so.
E' anche possibile pianificare la compattazione alla chiusura del database.

Ciao. :ciauz:

oregon
07-10-2008, 18:36
Originariamente inviato da halinder
La dimensione del database non Ŕ proporzionale ai dati che contiene? Esiste un modo per "ricompattare"?

Jet (per i file mdb) non elimina i dati quando questi sono "cancellati". Li "marca" come cancellati, ma lo spazio non viene recuperato (per questioni di performance).

Lo spazio viene solamente recuperato solo se si "compatta" il db, come ti ha detto Lele.
Attenzione pero' ... non puoi compattare un mdb che e' in uso da parte di altri utenti. Il file deve essere aperto in modo esclusivo.

pallinopinco
07-10-2008, 18:42
Per compattarlo via codice (nelle versioni del Jet engine che supportano JRO) crea un'istanza del motore:

JetEng := CreateOleObject('JRO.JetEngine');

ed invoca il metodo JetEng.CompactDatabase(...parametri specifici per il tuo db...).

Cerca informazioni su Internet relative a JRO, Jet Engine, CompactDatabase.

halinder
08-10-2008, 11:22
Grazie a tutti per l'aiuto! Ecco la funzione con cui ho risolto il problema, dovesse servire anche a qualcun'altro...

procedure TFm_Login.CompactDatabase;
var MsJet: Variant;
begin
Fm_Login.ADOCnt.Close;
MsJet := CreateOleObject('JRO.JetEngine');
MsJet.CompactDatabase('Data Source="<percorso database>"; Jet OLEDB : Database password="<password database>";',
'Data Source="<percorso database backup>"; Jet OLEDB : Database password="<password database backup>";');
DeleteFile('<percorso database>');
RenameFile('<percorso database backup>','<percorso database>');
end;

Bisogna anche importare la unit ComObj al progetto.

Loading