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.
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.
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;
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;
Mais sans succès.
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;
Je ne vois vraiment pas quoi faire et je suis encore débutant dans la programmation.
Merci pour votre aide
Partager