Newsgroup: it.comp.lang.delphi
Titolo: Compattare un DB Access da delphi

Ho un problema, devo compattare un database access utilizzando delle
funzioni di Delphi o Api.
Per compattare intendo cancellare fisicamente i record che il DB aveva
cancellato solo logicamene e quindi diminuirne le dimensioni.
Qualcuno conosce un sistema per fare ciň?
Grazie e saluti
Ivan Fontana

 ha scritto nel messaggio
news:93hg1l$g6i$1...@lacerta.tiscalinet.it...


Se accedi ad Access usando il BDE è un problema, perchè non mi sembra esista
una specifica funzione per farlo.
Se accedi ad Access via ADO, allora devi crearti una routine che invochi le
funzioni di compattazione.
Se sulla macchina hai installato Access o solo il suo motore Jet, e non solo
il file MDB, allora posso utilizzarti di usare i componenti freeware KADAO
(
http://delphi.pari.bg
), componenti di tipo TDATASET per accedere a fonti
dati ODBC e JEtEngine, in cui hai anche metodi avanzati, appunto quali la
compattazione e il ripristino
Altrimenti puoi scrivere una funzione che usi il motore DB della MS: jet
come server com per fargli fare la compressione sul tuo archivio.
Sul sito di MArco Cantu (
www.marcocantu.it
) ho trovato questo articolo,
spero possa esserti d'aiuto
Saluti
Andrea
----------------------------------------------------------------------------
----
Manutenzione DB Access: compressione
di Giuseppe Madaffari
----------------------------------------------------------------------------
----
Quando si lavora con database MS Access una delle esigenze del programmatore
è poter comprimere di tanto in tanto il file MDB, rimuovendo lo spazio
sprecato dal Jet Engine durante la rimozione di record e altre operazioni
interne.
Il BDE non fornisce alcuna routine per la manutenzione di database Access
pertanto è necessario interagire direttamente con l'Engine (che è un server
COM).
Il codice che segue implementa una routine per la compressione di file
*.MDB, attraverso la quale è possibile anche impostare l'eventuale password.
I parametri sono:
DBName indica il percorso completo del file .MDB da comprimere
TempDBName indica il nome del file temporaneo o del nuovo file da creare
(vedi prossimo parametro)
NewFile se impostato a True, indica che TempDBName contiene il nome del
nuovo file *.MDB risultante dalla compressione
Pwd se diverso da '' specifica la password del file da comprimere
NewPwd se diverso da #0 specifica la password per il file dopo la
compressione. Se si imposta '' e il file sorgente è protetto da password,
questa sarà rimossa per il file dopo la compressione
uses ComObj;
procedure CompactAccessDb(DBName, TempDBName: String; NewFile: Booleand =
False;
  Pwd: string = ''; NewPwd: String = #0);
const
  dbLangGeneral = ';LANGID=0x0409;CP=1252;COUNTRY=0';
var
  DBEngine, vLocale, vOptions: Variant;
begin
  try
    Screen.Cursor := crHourGlass;
    try
      {apre l'oggetto automation "Database Engine." (attenzione alla
versione) }
      DBEngine := CreateOleObject('DAO.DBEngine.35');
      { Impostiamo le opzioni per la password }
      if Pwd = '' then
        vOptions := EmptyParam
      else
        vOptions := Format(';pwd=%s', [Pwd]);
      if NewPwd = #0 then  // manteniamo la stessa password del file
originale
        vLocale := EmptyParam
      else  // cambiamo la pwd: se e' '' allora non ci sara' una pwd
        vLocale := dbLangGeneral + Format(';pwd=%s', [NewPwd]);
      {Comprime il db}
      DBEngine.CompactDatabase(DBName, TempDbName, vLocale, EmptyParam,
vOptions);
      if not NewFile then
      begin
        { Cancella il file originale... }
        DeleteFile(DBName);
        { ...e lo sostituisce con quello compresso }
        RenameFile(TempDbName, DBName);
      end;
    finally
      Screen.Cursor := crDefault;
    end; file://try
  except
    on E: EOleException do
      ShowMessage('Impossibile comprimere il database: ' + E.Message);
  end; file://try
end;

Qualcuno conosce un sistema per fare ciň?
Lancia "access.exe" da riga di comando (dal programma Delphi con
ShellExecute) specificando il nome del .mdb e l'opzione /compact.
--
Andrea Laforgia (ICQ 87230455)
http://www.geocities.com/AndreaLaforgia
"ci sono tre tipi di persone nel mondo : quelli che
 sono bravi in matematica e quelli che non lo sono."


E se da Delphi uso ADO?
Bye Bye Honest
---
L'esperienza insegna, ma prima bisogna farsela!