IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Delphi Discussion :

Unidac + Sqlite : Fuite mémoire - Quelle est mon erreur ?


Sujet :

Delphi

  1. #1
    Membre actif
    Profil pro
    Inscrit en
    Décembre 2007
    Messages
    549
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2007
    Messages : 549
    Points : 226
    Points
    226
    Par défaut Unidac + Sqlite : Fuite mémoire - Quelle est mon erreur ?
    Bonjour

    Je teste unidac avec une simple base de données composée d une seule table de 2 champs.
    C est simplement pour faire des stats sur une suite de nombres.
    Je cree la base quand un fichier est selectionné et injecte le contenu de ce fichier dans la base.
    Ensuite je fais une requete sur ma base et affiche le resultat ( c est tres simple, c est pour m initier) mais à ce moment j ai une fuite memoire (detectee a l aide de reportmemoryleaksonshutdown := true;) alors que je pense avoir fait ce qu il fallait.
    Pourriez vous m eclairer svp.

    Mon code pour parcourir le resultat de ma requete
    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
    UniQuery1.SQL.Text := 'SELECT rapport FROM import ';
      UniQuery1.open;
     
      UniQuery1.First;
     
      while not UniQuery1.Eof do
      begin
        stemp := UniQuery1.FieldByName('rapport').AsString;
    Memo1.Lines.Add(stemp);
        UniQuery1.Next;
      end;
      UniQuery1.Close;
     
      UniConnection1.Disconnect;
      UniConnection1.Free;
    Merci de votre aide et de vos consiels
    stephane

  2. #2
    Rédacteur/Modérateur

    Avatar de SergioMaster
    Homme Profil pro
    Développeur informatique retraité
    Inscrit en
    Janvier 2007
    Messages
    15 043
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 67
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur informatique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Janvier 2007
    Messages : 15 043
    Points : 40 957
    Points
    40 957
    Billets dans le blog
    62
    Par défaut
    Bonjour,

    il manque des éléments, à savoir : Uniquery et stemp sont déclarés où ?

    si Uniquery ou stemp sont créés au runtime alors il manque leur libération.

    d'autre part stemp ne sert pas à grand chose !

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
     // UniQuery1.First;  << inutile  
     
      while not UniQuery1.Eof do
      begin
    //    stemp := UniQuery1.FieldByName('rapport').AsString;
        Memo1.Lines.Add(UniQuery1.FieldByName('rapport').AsString);
        UniQuery1.Next;
      end;
    de plus sans le rapport de fuite mémoire rien ne nous dit qu'il s'agit d'un problème sur le code rapporté ! il s'agit peut être d'un problème d'UNIDAC
    MVP Embarcadero
    Delphi installés : D3,D7,D2010,XE4,XE7,D10 (Rio, Sidney), D11 (Alexandria), D12 (Athènes)
    SGBD : Firebird 2.5, 3, SQLite
    générateurs États : FastReport, Rave, QuickReport
    OS : Window Vista, Windows 10, Windows 11, Ubuntu, Androïd

  3. #3
    Membre actif
    Profil pro
    Inscrit en
    Décembre 2007
    Messages
    549
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2007
    Messages : 549
    Points : 226
    Points
    226
    Par défaut
    Merci d avoir pris le temps de te pencher sur mon pb
    Le code de ma procedure est
    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
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    procedure TForm1.RunStats(fichier: string);
    var
      List: TstringList;
      i: Integer;
      Uniquery1: TUniquery;
    begin
      UniConnection1.ProviderName := 'SQLite';
      UniConnection1.Connect;
     
      Uniquery1 := TUniquery.Create(self);
      Uniquery1.Connection := UniConnection1;
     
      Uniquery1.SQL.Text :=
        'CREATE  TABLE "main"."import" ("id" INTEGER PRIMARY KEY  AUTOINCREMENT  NOT NULL  UNIQUE , "rapport" DOUBLE DEFAULT 0)';
      Uniquery1.Execute;
     
      List := TstringList.Create;
      List.LoadFromFile(fichier);
      for i := 0 to List.Count - 1 do
      begin
        Uniquery1.SQL.Text :=
          'INSERT INTO "main"."import" ("id","rapport") VALUES ("' + inttostr(i) +
          '"' + ',"' + List[i] + '")';
        Uniquery1.Execute;
      end;
      List.Destroy;
     
      Uniquery1.SQL.Text := 'SELECT rapport FROM "main"."import" ';
      Uniquery1.open;
      while not Uniquery1.Eof do
      begin
        Memo1.Lines.Add(Uniquery1.FieldByName('rapport').AsString);
        Uniquery1.Next;
      end;
     
      Uniquery1.Close;
      Uniquery1.Destroy;
     
      UniConnection1.Disconnect;
      UniConnection1.Free;
     
      Memo1.Lines.Add('fini');
    end;
    Je l ai simplifié au maximum et quand je n n ai pas la partie Uniquery1.open -> Uniquery1.close, je n ai aucune fuite mémoire.

    Le rapport (je ne sais pas si on peut l afficher dans un fichier...)
    Nom : rapport.png
Affichages : 250
Taille : 18,7 Ko

    merci

  4. #4
    Rédacteur/Modérateur

    Avatar de SergioMaster
    Homme Profil pro
    Développeur informatique retraité
    Inscrit en
    Janvier 2007
    Messages
    15 043
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 67
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur informatique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Janvier 2007
    Messages : 15 043
    Points : 40 957
    Points
    40 957
    Billets dans le blog
    62
    Par défaut
    Bonjour,

    premier point, il vaut mieux utiliser Free plutôt que Destroy (voir la discussion à ce sujet)

    ensuite je suggère d'utiliser une requête paramétrée, plus propre, préparée une fois au lieu que n fois (n étant égale à list.count-1).

    je ne connais pas Unidac mais je tenterais ainsi

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
      List := TstringList.Create;
      List.LoadFromFile(fichier);
      UniQuery.SQL.Text:='INSERT INTO main.import (id,rapport) VALUES (:id,:valeur)';
      Uniquery.Prepare;
      for i := 0 to List.Count - 1 do
      begin
        Uniquery1.ParamByName('id').asInteger:=i;
        Uniquery1.ParamByName('valeur').asString:=List[i];
        Uniquery1.Execute;
      end;
      List.Free;
    pour afficher ensuite le résultat

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
      Uniquery1.UnPrepare; // la requête précédente ayant été préparée il faut libéré cette partie 
      Uniquery1.SQL.Text := 'SELECT rapport FROM "main"."import" ';
      Uniquery1.open;
      while not Uniquery1.Eof do
      begin
        Memo1.Lines.Add(Uniquery1.FieldByName('rapport').AsString);
        Uniquery1.Next;
      end;
     
      Uniquery1.Close;
      Uniquery1.Free;
    pour la connexion, étrangement c'est bien Free qui est utilisé alors que cette dernière ne semble pas crée au Runtime étonnant mais ....
    c'est tout ce que je vois comme modification à apporter (bien qu'il me semble que j'ai "sur le bout de la langue" une option encore plus simple mais je ne met pas le "doigt dessus",
    si ce n'est que déjà : - j'aurai utilisé un auto incrément pour la valeur de ID
    - j'aurai utilisé un CREATE TABLE IF NOT EXIST
    mais ça, ça fait partie de mes manies )
    MVP Embarcadero
    Delphi installés : D3,D7,D2010,XE4,XE7,D10 (Rio, Sidney), D11 (Alexandria), D12 (Athènes)
    SGBD : Firebird 2.5, 3, SQLite
    générateurs États : FastReport, Rave, QuickReport
    OS : Window Vista, Windows 10, Windows 11, Ubuntu, Androïd

  5. #5
    Membre actif
    Profil pro
    Inscrit en
    Décembre 2007
    Messages
    549
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2007
    Messages : 549
    Points : 226
    Points
    226
    Par défaut
    Merci
    La fuite demeure sur l instruction Uniquery1.open;.
    J ai regardé sur le montieur windows, ce doit etre infime car ce n est pas visible.
    merci de t etre penché sur mon pb.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Quelle est mon erreur dans cette syntaxe
    Par BuzzLeclaire dans le forum Langage
    Réponses: 18
    Dernier message: 01/07/2009, 00h28
  2. Débutant, quelle est mon erreur ?
    Par vladimire dans le forum Servlets/JSP
    Réponses: 5
    Dernier message: 15/05/2009, 23h43
  3. [STR912 ARM9] Quelle est l'erreur dans mon prog. ASM ?
    Par maczdecarpate dans le forum Autres architectures
    Réponses: 3
    Dernier message: 05/08/2007, 02h27
  4. [MySQL] Mais ou est mon erreur de syntax?
    Par pierrot10 dans le forum PHP & Base de données
    Réponses: 5
    Dernier message: 07/10/2006, 15h59
  5. Où est mon erreur ?
    Par Fusio dans le forum Langage
    Réponses: 5
    Dernier message: 07/04/2006, 17h29

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo