Je développe en tant que petit programme de diabète en utilisant Delphi 5 et ADO. Je fais une petite requête comme ceci:Delphi: fuite de mémoire TAdoQuery?
function GetLowestGlucoseLevel(StartDate:string;EndDate:string): Integer;
var
Q:TADOQuery;
begin
try
Q:=TADOQuery.Create(Application); //Separate unit, owner set to App
Q.Connection:=dtMod.ADOCon;
Q.DisableControls;
Q.Close;
Q.SQL.Clear;
Q.SQL.Add('SELECT Min(qGlucose.Glucose) AS MinOfGlucose from qGlucose');
Q.Parameters[0].Value:=StartDate;
Q.Parameters[1].Value:=EndDate;
Q.Open;
Result:=Q.FieldByName('MinOfGlucose').AsInteger;
Q.Close;
finally
Q:=nil;
Q.Free;
end;
end;
La requête fonctionne bien et renvoie le résultat comme prévu. Toutefois, lorsque j'ai vérifié le Gestionnaire des tâches Windows, l'utilisation de la mémoire continue à augmenter plutôt que de diminuer après la requête.
Comment résoudre ce problème?
Merci!
commentaire supplémentaire sur votre code: L'objet Q est créé dans votre routine, donc l'appel à DisableControls/Close/Effacer sont totalement inutiles, parce que la requête n'a pas de contrôle associés, n'est pas ouvert et la propriété SQL est _blank_ lors de la création. L'impact sur les performances est quasiment nul en faisant les appels, mais j'évite ce type de code par nature, principalement parce que cela rend un simple aperçu de routine un peu compliqué. – jachguate
Supplémentaire 2: Votre texte de requête ne contient pas de paramètres, mais vous en indiquez deux dans la ligne suivante ... sans Delphi en ce moment, je ne peux pas tester, mais je pense qu'il y aura une exception ou, au moins, un comportement indéfini. – jachguate
@Jachguate: à propos des commandes de désactivation, j'ai juste l'habitude de m'assurer de toujours désactiver les commandes avant de faire appel à sql. Merci de l'avoir fait remarquer :) À propos des paramètres, j'appelle en fait une requête à l'intérieur du fichier d'accès ms avec les paramètres, donc sans définir les paramètres dans mon code, cela déclencherait une exception. – AFF