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 :

TADOQuery et Parameters


Sujet :

Delphi

  1. #1
    Membre habitué
    Profil pro
    Inscrit en
    Mars 2003
    Messages
    356
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2003
    Messages : 356
    Points : 133
    Points
    133
    Par défaut TADOQuery et Parameters
    bonjour, j'ai une question sur les requêtes paramétrées:

    quand je fais ça, ça marche
    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
     
    procedure del;
    begin
      with Tadoquery.Create(nil) do
      begin
        ConnectionString := Connection_string;
        SQL.Text := 'select * from clubs where (idnumber=:club) and (idnumber2=:club2)';
        Parameters.ParamByName('club').DataType := ftInteger;
        Parameters.ParamByName('club').value := 1000;
        Parameters.ParamByName('club2').DataType := ftInteger;
        Parameters.ParamByName('club2').value := 1000;
        open;
        while not(Eof) do
        begin
          showmessage(FieldByName('idnumber').AsString);
          Next;
        end;
        free;
      end;
    end;
    faut pas chercher de sens a la requête, c'est un exemple , en fait j'ai un paramètre qui est plusieurs fois dans la requête, mais si je mets le même paramètre ça marche pas

    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
     
    procedure del;
    begin
      with Tadoquery.Create(nil) do
      begin
        ConnectionString := Connection_string;
        SQL.Text := 'select * from clubs where (idnumber=:club) and (idnumber2=:club)';
        Parameters.ParamByName('club').DataType := ftInteger;
        Parameters.ParamByName('club').value := 1000;
        open;
        while not(Eof) do
        begin
          showmessage(FieldByName('idnumber').AsString);
          Next;
        end;
        free;
      end;
    end;
    c'est a dire que si dans une requete j'ai 5 fois la valeur 1000 a mettre, je suis obligé de faire
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
       Parameters.ParamByName('club1').DataType := ftInteger;
       Parameters.ParamByName('club1').value := 1000;
       Parameters.ParamByName('club2').DataType := ftInteger;
       Parameters.ParamByName('club2').value := 1000;
       Parameters.ParamByName('club3').DataType := ftInteger;
       Parameters.ParamByName('club3').value := 1000;
       Parameters.ParamByName('club4').DataType := ftInteger;
       Parameters.ParamByName('club4').value := 1000;
       Parameters.ParamByName('club5').DataType := ftInteger;
       Parameters.ParamByName('club5').value := 1000;
    ??


    merci

    exyacc

  2. #2
    Modérateur
    Avatar de tourlourou
    Homme Profil pro
    Biologiste ; Progr(amateur)
    Inscrit en
    Mars 2005
    Messages
    3 858
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Biologiste ; Progr(amateur)

    Informations forums :
    Inscription : Mars 2005
    Messages : 3 858
    Points : 11 299
    Points
    11 299
    Billets dans le blog
    6
    Par défaut
    Si tu sais que c'est le même, il faut alors plutôt utiliser une requête spécifique :
    Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
    select * from clubs where (idnumber=:club) and (idnumber2=idnumber)
    Si c'est un hasard, donc une occurrence à l'exécution pas plus fréquente qu'une autre, ben tant pis pour remplir plusieurs fois des paramètres différents avec la même valeur !
    Delphi 5 Pro - Delphi 11.3 Alexandria Community Edition - CodeTyphon 6.90 sous Windows 10 ; CT 6.40 sous Ubuntu 18.04 (VM)
    . Ignorer la FAQ Delphi et les Cours et Tutoriels Delphi nuit gravement à notre code !

  3. #3
    Membre habitué
    Profil pro
    Inscrit en
    Mars 2003
    Messages
    356
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2003
    Messages : 356
    Points : 133
    Points
    133
    Par défaut
    oui pour ça que j'ai dit que c'etait un exemple, en réalité, c'est une grosse grosse requete ou il est plus facile de mettre plusieurs fois le parametre

  4. #4
    Modérateur
    Avatar de tourlourou
    Homme Profil pro
    Biologiste ; Progr(amateur)
    Inscrit en
    Mars 2005
    Messages
    3 858
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Biologiste ; Progr(amateur)

    Informations forums :
    Inscription : Mars 2005
    Messages : 3 858
    Points : 11 299
    Points
    11 299
    Billets dans le blog
    6
    Par défaut
    Après, si c'est pour un souci de lisibilité de la requête, tu peux avoir ton SQL :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    S := 'select * from clubs where (idnumber=:club) and (idnumber2=:club)';
    et faire :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Query.Text := ReplaceStr(S, ':club', IntToStr(ParamClubValue), [rfReplaceAll]);
    Delphi 5 Pro - Delphi 11.3 Alexandria Community Edition - CodeTyphon 6.90 sous Windows 10 ; CT 6.40 sous Ubuntu 18.04 (VM)
    . Ignorer la FAQ Delphi et les Cours et Tutoriels Delphi nuit gravement à notre code !

  5. #5
    Membre habitué
    Profil pro
    Inscrit en
    Mars 2003
    Messages
    356
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2003
    Messages : 356
    Points : 133
    Points
    133
    Par défaut
    c’était surtout pour savoir si c'était normal ou si je faisais pas comme il faut.
    donc on peut pas mettre plusieurs fois le même paramètre dans une requête .?

  6. #6
    Rédacteur/Modérateur

    Avatar de SergioMaster
    Homme Profil pro
    Développeur informatique retraité
    Inscrit en
    Janvier 2007
    Messages
    15 038
    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 038
    Points : 40 943
    Points
    40 943
    Billets dans le blog
    62
    Par défaut
    Bonjour,

    il semblerait que ADO ait été écrit comme cela, pas de possibilité d'utiliser deux fois un même paramètre. Signalé comme "bug" lors de la version D6 je crois, il a été répondu que cela avait été conçu ainsi. Je ne sais pas si ADO a évolué depuis et comme cet ensemble n'est pas ma tasse de thé ..... En tout cas les sets de composants base de données que j'utilise le permette.
    J'ai vu par contre, qu'il n'y avait pas dans ton code de Prepare de la requête avant son exécution, qu'en serait-il dans ce cas là ?
    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

  7. #7
    Membre habitué
    Profil pro
    Inscrit en
    Mars 2003
    Messages
    356
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2003
    Messages : 356
    Points : 133
    Points
    133
    Par défaut
    avec prepared:= true c'est pareil.

    je mets pas de prepare quand la requête est exécutée qu'une fois.. a tort ?

  8. #8
    Rédacteur/Modérateur

    Avatar de SergioMaster
    Homme Profil pro
    Développeur informatique retraité
    Inscrit en
    Janvier 2007
    Messages
    15 038
    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 038
    Points : 40 943
    Points
    40 943
    Billets dans le blog
    62
    Par défaut
    Non, c'est juste que peut être cela aurait pu, peut-être, changer la donne.
    Reste donc la méthode de Tourlourou, l'équivalent d'une requête avec macro, ceci dit, cela n'en fait plus vraiment une requête paramétrée
    En tout cas, voilà une raison (que j'avais oubliée), qui fait que Ado n'est pas ma tasse de thé
    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

  9. #9
    Expert éminent sénior
    Avatar de ShaiLeTroll
    Homme Profil pro
    Développeur C++\Delphi
    Inscrit en
    Juillet 2006
    Messages
    13 455
    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 455
    Points : 24 867
    Points
    24 867
    Par défaut
    Voici un code générique pour corriger ce bug de la fonction SetParamsFromCursor ici de ma propre auto-réponse à ce problème : ORACLE même SQL lancé via BDE ou ODA = DataSet différent

    A la base, moi c'était pour des requêtes Maitre-Détail qui avait un problème de chainage
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
       DataLinkDataSource := DetailDataSet.DataSource;
       DetailDataSet.DataSource := nil;
       if DataLinkDataSource <> nil then
       begin
         DataSet := DataLinkDataSource.DataSet as TCustomADODataSet;
         if DataSet <> nil then
           for I := 0 to DetailDataSet.Parameters.Count - 1 do
             with DetailDataSet.Parameters.Items[I] do
               Assign(DataSet.FieldByName(Name));
       end;


    pour ton cas :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
        Parameters.ParamByName('club').DataType := ftInteger;
        Parameters.ParamByName('club').value := 1000;
        ReplicateHomonymParam();
    tu crées une unité ADOHelpers, tu colle ça dedans, tu l'inclus dans les unités qui en besoin via un uses
    Tous tes ADOQuery auront comme par magie une nouvelle fonction (vu ta construction en With Create ... le helper évite de créer une variable locale pour un passage de paramètre, c'est un peu degueux mais le helper c'est pratique pour patcher)
    Tapé direct sur le forum

    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
     
      type
        TADOQueryParamAssistant = class helper for TADOQuery
        public
          procedure ReplicateHomonymParam();
        end;
     
     
    procedure TADOQueryParamAssistant.ReplicateHomonymParam();
    var
      I: Integer;
      Src: TParameter;
    begin
      for I := 0 to Self.Parameters.Count - 1 do
      begin
         with Self.Parameters.Items[I] do
         begin
           Src := Self.ParamByName(Name);
           DataType := Src.DataType;
           Value := Src.Value;
         end;
      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

Discussions similaires

  1. Pb d'envoi de requete via un TADOQuery à une BD access
    Par gsmurf dans le forum Bases de données
    Réponses: 4
    Dernier message: 15/06/2004, 13h20
  2. Rafraichir TADOQuery
    Par koolkris dans le forum Bases de données
    Réponses: 6
    Dernier message: 13/05/2004, 16h14
  3. Requete parametrée TADOQuery
    Par cdlr27 dans le forum Bases de données
    Réponses: 3
    Dernier message: 01/05/2004, 18h41
  4. Syntaxe PARAMETERS pour requête sous VBA
    Par GAGNON dans le forum VBA Access
    Réponses: 3
    Dernier message: 28/11/2003, 11h39
  5. Treeview : Erreur "Reference to variable or parameter..
    Par Tirlibibi dans le forum XMLRAD
    Réponses: 4
    Dernier message: 06/05/2003, 11h19

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