mtaallah
Messages postés28Date d'inscriptionlundi 10 décembre 2001StatutMembreDernière intervention13 décembre 2006
-
26 nov. 2006 à 23:46
mtaallah
Messages postés28Date d'inscriptionlundi 10 décembre 2001StatutMembreDernière intervention13 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);
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...
A voir également:
Impossible d'obtenir l'accès exclusif car la base de données est en cours d'utilisation
mtaallah
Messages postés28Date d'inscriptionlundi 10 décembre 2001StatutMembreDernière intervention13 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...