Newsgroup: it.comp.lang.delphi
Titolo: Compattare db Access ??

Ciao
Sto cercanco di compattare un db Access da codice ma al create del
datamodule ho il seguente errore: "Si sono verificati errori in
un'operazione OLE DB composta da più passaggi. Controllare i singoli valori
di stato OLE DB."
questo è il codice al create del datamodule:
========================
  adoconnection1.ConnectionString :='Provider=Microsoft.Jet.OLEDB.4.0;Data
Source=' + extractfilepath(application.exename) + 'db.mdb;Persist Security
Info=False';
  MDBtemporaneo:= ExtractFilePath(Application.ExeName) + 'Temp\tempDB.mdb';
  MDBtempString:='Provider=Microsoft.Jet.OLEDB.4.0;Data Source=' +
MDBtemporaneo + ';Persist Security Info=False';
    If FileExists(MDBtemporaneo) then
        begin
        if not DeleteFile(MDBtemporaneo) then
                begin
                MessageDlg('Errore nella cancellazione del database
temporaneo.', mtError, [mbOK], 0);
                Exit;
                end
        end;
  JetEngine1.CompactDatabase(adoconnection1.ConnectionString
,MDBtempString);      // componente Microsoft Jet and Replication Engine
importato come libreria
  JetEngine1.Disconnect;
adoconnection1.open;  //apro la connessione
=======================

 Sto cercanco di compattare un db Access da codice
ciao, purtroppo non ho tempo di controllare nè il tuo codice nè quello che
ti posto (l'ho trovato in rete un po di tempo fa ma poi non l'ho mai
utilizzato) quindi non volermi male se ti faccio perdere tempo :)
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; //try
  except
    on E: EOleException do
      ShowMessage('Impossibile comprimere il database: ' + E.Message);
  end; //try
end;
ciao e fammi sapere

 questa sarà rimossa per il file dopo la compressione
Questo codice lo avevo trovato anche io, ma mi da un errore in compilazione
quando vado ad eseguire la createoleobject..... siccome uso Jet 4.0 passo
come parametro alla CreateOleObject('DAO.DBEngine.40'), ma questo mi provoca
un errore....
In oltre:
con questo codice io devo possedere Access? Da quanto mi sembra di capire in
questo modo vado a creare una istanza di Access, o sbaglio
Davide


Grazie mille per l'aiuto, purtroppo il codice che mi hai postato dà uno
strano errore in compilazione.
Comunque sono riuscito a compattare un db Access mettendo a posto il mio
codice che posto di seguito
Ciao e grazie
    ADOConnection.Close;  // Chiudo la connessione
    MDBtemporaneo:= ExtractFilePath(Application.ExeName) +
'Temp\tempDB.mdb';
    MDBtempString:='Provider=Microsoft.Jet.OLEDB.4.0;Data Source=' +
MDBtemporaneo + ';Jet OLEDB:Database Password=""';
    If FileExists(MDBtemporaneo) then
        begin
        if not DeleteFile(MDBtemporaneo) then
                begin
                MessageDlg('Errore nella cancellazione del database
temporaneo.', mtError, [mbOK], 0);
                Exit;
                end
        end;
    Sleep(1000);  // Bisogno di tempo dopo chiusura connessione
    JetEngine.CompactDatabase(adoconnection.connectionstring,MDBtempString);
// Utilizzo l'oggetto importato
    JetEngine.Disconnect;
    ADOConnection.Open;   // Riapro la connessione
   // il componente TJetEngine lo devi importare (Import Type Library) =>
Microsoft Jet and Replication Engine (versione più nuova se ce n'è più di
una).