Bonjour,

J'utilises un composant TAdoQuery pour effectuer des requêtes SQL (2 fonctions : 1/ pour sélectionner des données 2/pour exécuter une requête (insert/update/etc).

EDIT : j'utilise Delphi 7 (Build 4.453)

J'ai remarqué, grâce à un fichier de 70000 lignes (fichier *.csv), un message d'erreur du type : "out of memory". Après analyse je pense que cela vient du composant TAdoQuery (et d'après des recherches sur le net aussi). J'ai essayé différentes solutions (fermer, libérer le composant, utiliser les paramètres pour n'avoir que le readonly, etc) mais sans succès. Voici un exemple d'une des fonctions. J'ai ajouté du log qui me permet de contrôler la mémoire physique.

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
function GetQuery(const ASql :string):TDataSet;
Var
 fTmpQuery : TAdoQuery;
begin
   AddLog('Mem Usage before GetQuery : '+ FormatFloat(' Mem.: ,.# K', CurrentMemoryUsage / 1024));
   fTmpQuery := TAdoQuery.create(NIL);
     try
       fTmpQuery.connection := vgAdoConnectionCible;
       fTmpQuery.SQL.Add(ASQL);
       AddDebug(TraceQuery(fTmpQuery));
       fTmpQuery.Open;
       Result := fTmpQuery;
       AddLog('Mem Usage after GetQuery : '+ FormatFloat(' Mem.: ,.# K', CurrentMemoryUsage / 1024));
     except
       On E:Exception do
       begin
         Result := NIL;
         Inc(vgNbError);
         AddLog('ERREUR GetQuery : '+ ASql + ' '+E.Message);
       end;
     end;
end;
Il faut savoir que cette fonction est appelé dans un script Pascal (composant PascalScript by Lazarus), et donc j'ai eu des problèmes lorsque je cherchais à libérer le TAdoQuery dans un finally.


J'ai essayé de modifié ADODB.pas comme indiqué sur un poste des groupes google :

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
destructor TADOQuery.Destroy;
begin
   FreeAndNil(FSQL);
   inherited Destroy;
end;
&

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
destructor TADOCommand.Destroy;
begin
   Connection := nil;
   FCommandObject := nil;
   FreeAndNil(FParameters);
 
   inherited Destroy;
end;
Mais sans succès.
Je ne vois vraiment pas quoi faire et je suis encore débutant dans la programmation.

Merci pour votre aide