Composant TAdoQuery & problème de mémoire (out of memory)
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:
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:
1 2 3 4 5
| destructor TADOQuery.Destroy;
begin
FreeAndNil(FSQL);
inherited Destroy;
end; |
&
Code:
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