Compact Database en cours d'utilisation

mtaallah Messages postés 28 Date d'inscription lundi 10 décembre 2001 Statut Membre Dernière intervention 13 décembre 2006 - 26 nov. 2006 à 23:46
mtaallah Messages postés 28 Date d'inscription lundi 10 décembre 2001 Statut Membre Dernière intervention 13 décembre 2006 - 26 nov. 2006 à 23:55
Salut,
   J'essaye de compacter une base de données Access...
   Mon application contient plusieurs formes dont chacune se connecte à  ma base en utilisant ADOTable ou ADOQuery dont aucune liaison n'est activé au départ.
   J'utilise la fonction suivante:
 
Function CompactAndRepair(DB: string) : boolean;  //je l'ai trouvé dans une recherche
var
    v: OLEvariant;
begin
  Result := True;
  try
    v := CreateOLEObject('JRO.JetEngine');
    try
      v.CompactDatabase('Provider=Microsoft.Jet.OLEDB.4.0;Data Source=' + DB,
                        'Provider=Microsoft.Jet.OLEDB.4.0;Data Source=' + DB +
                        'x;Jet OLEDB:Engine type=5');
      DeleteFile(DB);
      RenameFile(DB + 'x', DB)
    finally
      v := Unassigned
    end; { try }

  except
    Result := False
  end; { try }
end;
et on ajoute la procédure suivante:


procedure TFormIndex.FormClose(Sender: TObject; var Action: TCloseAction);

begin

   CompactAndRepair(GetCurrentDir+'\Data\Database.mdb');

end;





  Le problème c'est qu'à la fermeture de mon application après avoir effectué quelques modification ou en ouvrant tout simplement les autres Formes (lors de la compilation avec Delphi, et même juste en activant la liason ADOTable ou ADOQuery sans introduire aucune modification) on me dit que la base de données est en cours d'utilisation par l'utilisateur... et la machine ... (un long message) et qu'il est impossible de la compacter...

  Alors que je suis sûr que toutes les liaisons ont été désactivées en fermant chaque Form (à l'évènement OnHide de chaque Form -- > ADOTablex.Active: = False;)

  En exécutant l'application directement, il n'affiche aucun message, mais il ne modifie rien dans la base de données (le compactage n'est pas effectué).

Comment faire...

1 réponse

mtaallah Messages postés 28 Date d'inscription lundi 10 décembre 2001 Statut Membre Dernière intervention 13 décembre 2006
26 nov. 2006 à 23:55
Désolé!
Le sujet est un peu long, j'essaye d'être un peu précis... Mais ce que je voudrai le savoir en fin de l'histoire c'est:
   - Peut on avoir une solution pour libérer notre base de donnée de toute connection ADO (soit disons un ADOTable ou un ADOQuery).
ou bien
   - Existe-t-il une autre procédure à appliquer à la forme autre que

procedure TForm2.FormHide(Sender: TObject; var Action: TCloseAction);
begin
     ADOTable1.Active:= False;
end;
 
   pour y être sûr qu'il n'existe aucun processus en iaison avec ma base de données...

Merci
0
Rejoignez-nous