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

Bases de données Delphi Discussion :

ADO - Paramètres de type tableau


Sujet :

Bases de données Delphi

  1. #1
    Membre à l'essai
    Inscrit en
    Janvier 2003
    Messages
    31
    Détails du profil
    Informations forums :
    Inscription : Janvier 2003
    Messages : 31
    Points : 20
    Points
    20
    Par défaut ADO - Paramètres de type tableau
    Bonjour

    J'utilise un objet TAdoQuery pour faire une requete, dont la commande ressemble à ceci (exemple bateau, ma requete est plus compliquée avec des jointures etc.) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    SELECT Nom FROM Client WHERE Index IN (:ListeIndexClients)
    Je passe le parametre ensuite, comme ci après
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    ADOQuery1.Parameters.ParamByName('ListeIndexClients').Value := '45, 28, 56'
    Lorsque le paramètre ne contient qu'une valeur, par exemple '45', ça marche, la requete renvoie un résultat. Avec une valeur "liste" comme celle indiquée plus haut ('45, 28, 56', sans les parenthèses bien sur), je n'ai aucun résultat.
    Ma question est donc: Est ce normal, ou y a-t-il quelquechose que je fais mal ?
    Merci
    nico

  2. #2
    Modérateur
    Avatar de Rayek
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mars 2005
    Messages
    5 235
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Haute Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2005
    Messages : 5 235
    Points : 8 504
    Points
    8 504
    Par défaut
    Ecrit plutot comme çà, ca focntionnera mieux

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    ADOQuery1.Parameters.ParamByName('ListeIndexClients').Value := '(''45'',''28'', ''56'')'
    Modérateur Delphi

    Le guide du bon forumeur :
    __________
    Rayek World : Youtube Facebook

  3. #3
    Membre à l'essai
    Inscrit en
    Janvier 2003
    Messages
    31
    Détails du profil
    Informations forums :
    Inscription : Janvier 2003
    Messages : 31
    Points : 20
    Points
    20
    Par défaut
    Citation Envoyé par Malatar
    Ecrit plutot comme çà, ca focntionnera mieux

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    ADOQuery1.Parameters.ParamByName('ListeIndexClients').Value := '(''45'',''28'', ''56'')'
    Pas possible, mes valeurs sont de type Integer. De plus, j'ai remarqué qu'avec la chaine '45,54' ça ne renvoie pas de résultats, mais avec '45,54,56' ca fait une erreur "type incompatible dans l'expression du critère". Il semblerait que la syntaxe ne soit pas bonne. J'ai tenté de déclarer le paramètre avec le datatype ftstring pour qu'il n'y ait pas de confusion a cause des virgules, et également d'ajouter ou non les parenthèses, mais rien ne marche pour le moment (toujours aucun résultat ou erreur avec le type du parametre).

    Merci pour ton aide, et si quelqun a une autre idée... ça m'intéresse!
    nico

  4. #4
    Modérateur
    Avatar de Rayek
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mars 2005
    Messages
    5 235
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Haute Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2005
    Messages : 5 235
    Points : 8 504
    Points
    8 504
    Par défaut
    Citation Envoyé par npze
    Pas possible, mes valeurs sont de type Integer. De plus, j'ai remarqué qu'avec la chaine '45,54' ça ne renvoie pas de résultats, mais avec '45,54,56' ca fait une erreur "type incompatible dans l'expression du critère". Il semblerait que la syntaxe ne soit pas bonne. J'ai tenté de déclarer le paramètre avec le datatype ftstring pour qu'il n'y ait pas de confusion a cause des virgules, et également d'ajouter ou non les parenthèses, mais rien ne marche pour le moment (toujours aucun résultat ou erreur avec le type du parametre).

    Merci pour ton aide, et si quelqun a une autre idée... ça m'intéresse!
    As tu testé cette solution quand même ? Car si je te propose cela c'est que c'est fonctionnel que le champ soit integer ou non.
    Le In impose une synthaxe pour que cela fonctionne, fait un test avec

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    SELECT Nom FROM Client WHERE Index IN ('45','56','54')
    Après il est vrai que passer par Value peut poser problème.
    Modérateur Delphi

    Le guide du bon forumeur :
    __________
    Rayek World : Youtube Facebook

  5. #5
    Membre à l'essai
    Inscrit en
    Janvier 2003
    Messages
    31
    Détails du profil
    Informations forums :
    Inscription : Janvier 2003
    Messages : 31
    Points : 20
    Points
    20
    Par défaut
    Citation Envoyé par Malatar
    As tu testé cette solution quand même ? Car si je te propose cela c'est que c'est fonctionnel que le champ soit integer ou non.
    Le In impose une synthaxe pour que cela fonctionne, fait un test avec

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    SELECT Nom FROM Client WHERE Index IN ('45','56','54')
    Après il est vrai que passer par Value peut poser problème.
    Oui bien sur, j'ai essayé. Quant à la la syntaxe si dessus, pas de probleme je la maitrise, mais le probleme se situe probablement au niveau de l'affectation de valeur au paramètre, ou de l'ecriture SQL (mettre le parametre entre parenthese ou pas, ou les mettre autour de la valeur du paramètre, ce genre de choses)...
    Et je n'ai vu ce problème évoqué nulle part, en partie aussi parce que je vois pas comment formuler ma recherche (et que les moteurs de recherche zappent les parentheses, "in" etc.).

    EDIT :
    Par ailleurs je viens d'essayer ta requete telle quelle, ça ne marche pas (erreur du type du parametre). Access quant à lui remplace les ',' de la liste de valeurs par des ';'...
    nico

  6. #6
    Expert éminent sénior
    Avatar de Cl@udius
    Homme Profil pro
    Développeur Web
    Inscrit en
    Février 2006
    Messages
    4 878
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Matériel informatique

    Informations forums :
    Inscription : Février 2006
    Messages : 4 878
    Points : 10 008
    Points
    10 008
    Par défaut
    Salut

    Une chose est certaine il faut séparer tes valeurs par des virgules (,).

    Dans cette situation, personnellement je contourne le problème en me passant de paramètre et en reconstruisant la chaine SQL:

    En supposant que la chaine SQL soit définie ainsi:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    select NOM
    from CLIENT
    where INDEX in (?)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    var
      s: string;
    begin
      s := '0,1,3';
      ADOQuery1.SQL[2] := Format('where Index in (%s)', [s]);
      ADOQuery1.Open;
    end;

    @+ Claudius

  7. #7
    Membre à l'essai
    Inscrit en
    Janvier 2003
    Messages
    31
    Détails du profil
    Informations forums :
    Inscription : Janvier 2003
    Messages : 31
    Points : 20
    Points
    20
    Par défaut
    Citation Envoyé par Claudius40
    Salut

    Une chose est certainement un faut séparer tes valeurs par des virgules (,).

    Dans cette situation, personnellement je contourne le problème en me passant de paramètre et en reconstruisant la chaine SQL:

    En supposant que la chaine SQL soit définie ainsi:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    select NOM
    from CLIENT
    where INDEX in (?)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    var
      s: string;
    begin
      s := '0,1,3';
      ADOQuery1.SQL[2] := Format('where Index in (%s)', [s]);
      ADOQuery1.Open;
    end;

    @+ Claudius
    Certes c'est bien sur plus simple niveau code, cependant pour le coté pratique (et deja-implémenté bien sur!) je voudrais savoir si cette utilisation des parametres est possible techniquement. Apres, si ce n'est pas le cas, et si les performances de la méthode "je parse le code à la main" sont équivalentes à celle implémentée dans le code ADO de delphi... il faudra bien m'y résoudre.
    nico

  8. #8
    Expert éminent sénior
    Avatar de Cl@udius
    Homme Profil pro
    Développeur Web
    Inscrit en
    Février 2006
    Messages
    4 878
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Matériel informatique

    Informations forums :
    Inscription : Février 2006
    Messages : 4 878
    Points : 10 008
    Points
    10 008
    Par défaut
    Je procède ainsi car je n'est jamais réussi à transmettre correctement un paramètre à une clause IN attendant une série de valeurs numériques.

    Si Malatar ou quelqu'un d'autre à trouver un moyen, je suis aussi preneur.

    @+

  9. #9
    Membre à l'essai
    Inscrit en
    Janvier 2003
    Messages
    31
    Détails du profil
    Informations forums :
    Inscription : Janvier 2003
    Messages : 31
    Points : 20
    Points
    20
    Par défaut
    Citation Envoyé par Claudius40
    Je procède ainsi car je n'est jamais réussi à transmettre correctement un paramètre à une clause IN attendant une série de valeurs numériques.

    Si Malatar ou quelqu'un d'autre à trouver un moyen, je suis aussi preneur.

    @+
    Aurais tu éventuellement réussi à passer des valeurs non numériques ? Ca pourrait toujours dépanner...
    Pour résumer ça serait effectivement bien d'etre fixés à savoir si c'est possible ou pas, et comment si ça l'est.
    Merci pour ta contribution en tout cas !
    nico

  10. #10
    Modérateur
    Avatar de Rayek
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mars 2005
    Messages
    5 235
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Haute Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2005
    Messages : 5 235
    Points : 8 504
    Points
    8 504
    Par défaut
    Le problème de l'utilisation de Value c'est qu'il va tenter de "détecter" le type de paramètre et la donnée transmise, en général il nous mets un joli petit ftString (s'il n'est pas définit) donc si on envoi ('45','56','59') notre cher Value va rajouter des ' et on se retrouve avec '('45','56','59')' d'où le fait que ta requete de recheche plante ou ne trouve rien.
    Le seul moyen est comme t'as montré Claudius40.
    Modérateur Delphi

    Le guide du bon forumeur :
    __________
    Rayek World : Youtube Facebook

  11. #11
    Expert éminent sénior
    Avatar de Cl@udius
    Homme Profil pro
    Développeur Web
    Inscrit en
    Février 2006
    Messages
    4 878
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Matériel informatique

    Informations forums :
    Inscription : Février 2006
    Messages : 4 878
    Points : 10 008
    Points
    10 008
    Par défaut
    Citation Envoyé par npze
    Aurais tu éventuellement réussi à passer des valeurs non numériques ?
    Non plus ! De toute façon comme l'explique Malatar la valeur du paramètre sera systématiquement interprétée comme un String. D'où les ' parasites.

    Il reste donc ma façon de faire.
    @+ Claudius

Discussions similaires

  1. Réponses: 9
    Dernier message: 10/06/2013, 09h24
  2. [WD14] Affectation par défaut à un paramètre de type tableau
    Par mail.spam dans le forum WinDev
    Réponses: 8
    Dernier message: 19/03/2010, 09h05
  3. [WD14] Paramètre par defaut de type tableau
    Par klbsjpolp dans le forum WinDev
    Réponses: 3
    Dernier message: 30/01/2009, 15h02
  4. [ADO] Passage de paramètre de type Date dans une requête
    Par e-ric dans le forum Bases de données
    Réponses: 6
    Dernier message: 25/01/2006, 12h36
  5. Fonction de type tableau
    Par Charles f dans le forum Langage
    Réponses: 5
    Dernier message: 04/08/2002, 14h04

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