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 :

Setup d'un Selfextractor bloque en mémoire dès que je fais une requête avec ADOQuery


Sujet :

Delphi

  1. #1
    Membre du Club
    Homme Profil pro
    Analyse système
    Inscrit en
    Septembre 2014
    Messages
    5
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 57
    Localisation : Canada

    Informations professionnelles :
    Activité : Analyse système
    Secteur : Santé

    Informations forums :
    Inscription : Septembre 2014
    Messages : 5
    Par défaut Setup d'un Selfextractor bloque en mémoire dès que je fais une requête avec ADOQuery
    Bonjour tout le monde,
    J'ai fait en Delphi un programme Setup qui installe la mise à jour d'un logiciel à l'intérieur d'un SelfExtractor. Le Setup fait plein de choses, comme copier des fichiers, écrire dans la base de registres, lire et écrire dans un fichier .ini, etc. Ça fait des années que je l'utilise et il a toujours bien été. Cette semaine, on me demande d'inclure une requête SQL avec ADOQuery. C'est un simple SELECT qui me permet de vérifier la version de la BD. Mais dès que le Setup fait appel à l'ADOQuery, le programme Setup reste bloqué en mémoire et la mise à jour ne se termine pas. On doit aller dans le gestionnaire de tâches et mettre fin au processus.

    Voici la function problématique:

    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
    function TForm1.Version : TDateTime;
    Var
         code : string;
         a : TDateTime;
         ADOQuery1 : TADOQuery;
    begin
         a := 0;
         ADOQuery1 := TADOQuery.Create(nil);
    	Try
              code := 'Provider=Microsoft.Jet.OLEDB.4.0;Data Source=';
              code := code + rep + '\MaBD.mdb';
              code := code + ';Persist Security Info=False';
              ADOQuery1.Connectionstring := code;
              ADOQuery1.SQL.Clear;
              ADOQuery1.SQL.Add('SELECT ReleaseDate');
              ADOQuery1.SQL.Add('FROM DBSystem');
              ADOQuery1.Open;
              //ADOQuery1.Active := True;
              a := ADOQuery1.FieldList[0].asDateTime;
         Finally
              ADOQuery1.Close;
              ADOQuery1.Free;
              Application.ProcessMessages;
              ADOQuery1 := nil;
         end;
         Version := a;
    end;
    La fonction n'a aucun problème, elle renvoie bien la date de version. Le problème, c'est que le Setup ne se libère pas de la mémoire dès que je fais appel à cette fonction. Quelqu'un a une idée comment régler ce problème?

  2. #2
    Expert éminent
    Avatar de ShaiLeTroll
    Homme Profil pro
    Développeur C++\Delphi
    Inscrit en
    Juillet 2006
    Messages
    13 869
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Développeur C++\Delphi
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2006
    Messages : 13 869
    Par défaut
    Ton Setup, il est codé en Delphi ?

    j'écrirais ta fonction ainsi dans un DataModule c'est plus propre que fenêtre
    sépare la gestion de la libération de la gestion du Close/Open, cela peut être parano mais c'est mieux

    Le ProcessMessages ne sert à rien

    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
     
    function TDataModuleMisc.GetVersion(out ADateVersion: TDateTime): Boolean;
    var
      code : string;
      a : TDateTime;
    begin
      Result := False;
      ADateVersion := 0;
      try
        // CoInitialize(nil); // A tenter !
       // try 
        with TADOQuery.Create(nil) do
        try
          code := 'Provider=Microsoft.Jet.OLEDB.4.0;Data Source=';
          code := code + rep + '\MaBD.mdb';
          code := code + ';Persist Security Info=False';
          ConnectionString := code;
          SQL.Text := 'SELECT ReleaseDate FROM DBSystem';
          Open();
          try
            ADateVersion := FieldByName('ReleaseDate').asDateTime;
            Result := True;
          finally
            Close;
          end;
        finally  
           Free();
        end;
        // finally
        //   CoUnitialize();
        // end
      except
        Result := False;
        ADateVersion := -1;
      end;
    end;
    Aide via F1 - FAQ - Guide du développeur Delphi devant un problème - Pensez-y !
    Attention Troll Méchant !
    "Quand un homme a faim, mieux vaut lui apprendre à pêcher que de lui donner un poisson" Confucius
    Mieux vaut se taire et paraître idiot, Que l'ouvrir et de le confirmer !
    L'ignorance n'excuse pas la médiocrité !

    L'expérience, c'est le nom que chacun donne à ses erreurs. (Oscar Wilde)
    Il faut avoir le courage de se tromper et d'apprendre de ses erreurs

  3. #3
    Membre du Club
    Homme Profil pro
    Analyse système
    Inscrit en
    Septembre 2014
    Messages
    5
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 57
    Localisation : Canada

    Informations professionnelles :
    Activité : Analyse système
    Secteur : Santé

    Informations forums :
    Inscription : Septembre 2014
    Messages : 5
    Par défaut
    Oui, C'est en Delphi 7.

    J'ai tenté les 3 Try imbriqués, même problème, ça reste bloqué en mémoire.

    J'ai tenté le CoInitialize et UnInitialize, même problème, ça reste bloqué en mémoire.

  4. #4
    Membre Expert
    Avatar de ALWEBER
    Homme Profil pro
    Expert Delphi
    Inscrit en
    Mars 2006
    Messages
    1 513
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 69
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Expert Delphi

    Informations forums :
    Inscription : Mars 2006
    Messages : 1 513
    Billets dans le blog
    10
    Par défaut
    Peut être peut tu utiliser un client non ole et mettre
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    DataBase.Connected à false
    avant de libérer tes objets

Discussions similaires

  1. Réponses: 6
    Dernier message: 24/06/2007, 02h13
  2. Réponses: 6
    Dernier message: 01/09/2006, 19h04
  3. Réponses: 4
    Dernier message: 24/07/2006, 03h03
  4. Réponses: 21
    Dernier message: 21/07/2006, 17h55
  5. [ACCESS] Je bloque sur une requête...
    Par portu dans le forum Langage SQL
    Réponses: 8
    Dernier message: 16/02/2006, 11h33

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