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

C# Discussion :

requete paraméteré avec une clause IN [Débutant]


Sujet :

C#

  1. #1
    Membre éprouvé Avatar de shaun_the_sheep
    Homme Profil pro
    Chef de projet NTIC
    Inscrit en
    Octobre 2004
    Messages
    1 619
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Chef de projet NTIC
    Secteur : Enseignement

    Informations forums :
    Inscription : Octobre 2004
    Messages : 1 619
    Par défaut requete paraméteré avec une clause IN
    Bonjour,

    je cherche à faire une requete paramétré avec une clause IN dans la requete.
    Impossible de trouver l'astuce pour le faire et pourtant j'ai bien des données à remonter ....

    quelqu'un a une idée ?

    Mon paramétre pour la clause IN est du type string comme suit : 'CHAINE1','CHAINE2'

    pour avoir quelque chose comme :
    ...
    and student in ('CHAINE1','CHAINE2')

  2. #2
    Membre Expert
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Novembre 2009
    Messages
    2 056
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur .NET

    Informations forums :
    Inscription : Novembre 2009
    Messages : 2 056
    Par défaut
    Regarde par ici si ca t'aide:
    http://www.sommarskog.se/arrays-in-sql-2008.html

  3. #3
    Membre éprouvé Avatar de shaun_the_sheep
    Homme Profil pro
    Chef de projet NTIC
    Inscrit en
    Octobre 2004
    Messages
    1 619
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Chef de projet NTIC
    Secteur : Enseignement

    Informations forums :
    Inscription : Octobre 2004
    Messages : 1 619
    Par défaut
    merci ... j'ai attentivement lu ce doc et rien ...

  4. #4
    Modérateur
    Avatar de DotNetMatt
    Homme Profil pro
    CTO
    Inscrit en
    Février 2010
    Messages
    3 611
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : Etats-Unis

    Informations professionnelles :
    Activité : CTO
    Secteur : Finance

    Informations forums :
    Inscription : Février 2010
    Messages : 3 611
    Billets dans le blog
    3
    Par défaut
    Bonjour,

    J'utilise ceci dans mes projets :

    Code C# : 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
     
    SqlConnection co = new SqlConnection();
     
    var inValues = new string[] {"A", "B", "C"};
     
    SqlCommand cmd = co.CreateCommand();
     
    string[] queryParams = new string[inValues.Length];
    for (int i = 0; i < inValues.Length; i++)
    {
     queryParams[i] = "@param" + i;
     cmd.Parameters.AddWithValue(queryParams[i], inValues[i]);
    }
     
    StringBuilder query = new StringBuilder();
    query.Append("SELECT * FROM Table WHERE Name IN (");
    query.Append(string.Join(",", queryParams));
    query.Append(")");
    Less Is More
    Pensez à utiliser les boutons , et les balises code
    Desole pour l'absence d'accents, clavier US oblige
    Celui qui pense qu'un professionnel coute cher n'a aucune idee de ce que peut lui couter un incompetent.

  5. #5
    Inactif  
    Homme Profil pro
    Chef de projet NTIC
    Inscrit en
    Janvier 2007
    Messages
    6 604
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 64
    Localisation : France

    Informations professionnelles :
    Activité : Chef de projet NTIC

    Informations forums :
    Inscription : Janvier 2007
    Messages : 6 604
    Par défaut
    Il manque juste la ligne :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    cmd.CommandText = query.ToString();

  6. #6
    Membre éprouvé Avatar de shaun_the_sheep
    Homme Profil pro
    Chef de projet NTIC
    Inscrit en
    Octobre 2004
    Messages
    1 619
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Chef de projet NTIC
    Secteur : Enseignement

    Informations forums :
    Inscription : Octobre 2004
    Messages : 1 619
    Par défaut
    merci ... cela me semble assez compliqué pour moi ....
    en gros vous construisez une chaine qui sera interprété comme requete SQL , est ce là ?

  7. #7
    Inactif  
    Homme Profil pro
    Chef de projet NTIC
    Inscrit en
    Janvier 2007
    Messages
    6 604
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 64
    Localisation : France

    Informations professionnelles :
    Activité : Chef de projet NTIC

    Informations forums :
    Inscription : Janvier 2007
    Messages : 6 604
    Par défaut
    Citation Envoyé par shaun_the_sheep Voir le message
    merci ... cela me semble assez compliqué pour moi ....
    en gros vous construisez une chaine qui sera interprété comme requete SQL , est ce là ?
    Non, il construit une chaine qui est la requête SQL avec les paramétres (requête paramétrée).
    Et il met les valeurs de la liste 'IN' dasn les valeurs de paramétres; ce qui fait que malgré la présence du StringBuilder, on est bien dans le cas d'une requête paramétrée, sans tomber dans le travers consistant à construire une requête avec les valeurs dedans.

  8. #8
    Membre éprouvé Avatar de shaun_the_sheep
    Homme Profil pro
    Chef de projet NTIC
    Inscrit en
    Octobre 2004
    Messages
    1 619
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Chef de projet NTIC
    Secteur : Enseignement

    Informations forums :
    Inscription : Octobre 2004
    Messages : 1 619
    Par défaut
    Ok ... l'idée me plait bien ... mais ma requete ne se limite cependant pas à la cause IN , j'ai des like aussi .....

    je me disais au lieu d'un IN peut être une succession de OU .... cela peut être la même chose non ?

  9. #9
    Modérateur
    Avatar de DotNetMatt
    Homme Profil pro
    CTO
    Inscrit en
    Février 2010
    Messages
    3 611
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : Etats-Unis

    Informations professionnelles :
    Activité : CTO
    Secteur : Finance

    Informations forums :
    Inscription : Février 2010
    Messages : 3 611
    Billets dans le blog
    3
    Par défaut
    Merci Bluedeep pour la ligne manquante ;-)

    @shaun_the_sheep, oui on peut adapter cet exemple à plusieurs scénarios afin de construire une requête paramétrée un peu plus complexe.

    Il "suffit" de multiplier le code suivant :

    Code C# : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    string[] queryParams = new string[inValues.Length];
    for (int i = 0; i < inValues.Length; i++)
    {
    queryParams[i] = "@param" + i;
    cmd.Parameters.AddWithValue(queryParams[i], inValues[i]);
    }

    autant de fois que nécessaire, et d'adapter la structure de la requête dans le StringBuilder en conséquence.

    Le bout de code ci-dessus permet de gérer les paramètres de la clause IN. S'il y a 2 clauses IN, il suffit de copier/coller ce code, et de nommer différemment les paramètres.

    Idem, s'il y a une clause OR, il suffit de copier/coller le code, donner un nom différent aux paramètres...

    Ensuite il faut adapter le StringBuilder en conséquence afin d'inclure les nouvelles clauses, et leurs paramètres au bon endroit.

    Je ne sais pas si mon explication est très claire, donc dans le doute, voici un petit exemple. Voici la requête que l'on cherche à générer :

    Code SQL : Sélectionner tout - Visualiser dans une fenêtre à part
    SELECT * FROM Table WHERE Name IN (...) OR City IN (...)

    On a donc 2 séries de paramètres à gérer, une pour la clause IN sur le champ Name, et une pour la clause IN sur le chemp City. Voici l'implémentation :

    Code C# : 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
    SqlConnection co = new SqlConnection();
    SqlCommand cmd = co.CreateCommand();
     
    var nameInValues = new string[] {"A", "B", "C"};
    var cityInValues = new string[] { "Paris", "Bordeaux", "Lyon" };
     
    // Clause IN - Column Name
    string[] queryParams_NameIn = new string[nameInValues.Length];
    for (int i = 0; i < nameInValues.Length; i++)
    {
     queryParams_NameIn[i] = "@paramNameIn" + i;
     cmd.Parameters.AddWithValue(queryParams_NameIn[i], nameInValues[i]);
    }
     
    // Clause IN - Column City
    string[] queryParams_CityIn = new string[cityInValues.Length];
    for (int i = 0; i < cityInValues.Length; i++)
    {
     queryParams_CityIn[i] = "@paramCityIn" + i;
     cmd.Parameters.AddWithValue(queryParams_CityIn[i], cityInValues[i]);
    }
     
    StringBuilder query = new StringBuilder();
    query.Append("SELECT * FROM Table WHERE Name IN (");
    query.Append(string.Join(",", queryParams_NameIn));
    query.Append(") OR City IN (");
    query.Append(string.Join(",", queryParams_CityIn));
    query.Append(")");
     
    Console.WriteLine(query.ToString());

    Résultat généré :
    Code SQL : Sélectionner tout - Visualiser dans une fenêtre à part
    SELECT * FROM Table WHERE Name IN (@paramNameIn0,@paramNameIn1,@paramNameIn2) OR City IN (@paramCityIn0,@paramCityIn1,@paramCityIn2)

    Là c'est un peu crade, il faudra factoriser, notamment les boucles for, mais l'idée est là ;-)
    Less Is More
    Pensez à utiliser les boutons , et les balises code
    Desole pour l'absence d'accents, clavier US oblige
    Celui qui pense qu'un professionnel coute cher n'a aucune idee de ce que peut lui couter un incompetent.

  10. #10
    Membre éprouvé Avatar de shaun_the_sheep
    Homme Profil pro
    Chef de projet NTIC
    Inscrit en
    Octobre 2004
    Messages
    1 619
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Chef de projet NTIC
    Secteur : Enseignement

    Informations forums :
    Inscription : Octobre 2004
    Messages : 1 619
    Par défaut
    un grand merci ... j'ai pas tout a fait fait comme vous mais le principe est le même.

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

Discussions similaires

  1. Réponses: 4
    Dernier message: 28/06/2007, 08h49
  2. requete update avec une condition
    Par youtou dans le forum Langage SQL
    Réponses: 5
    Dernier message: 07/06/2006, 20h55
  3. Comment faire une requete liée avec une requete ?
    Par DavidDeTroyes dans le forum Requêtes
    Réponses: 4
    Dernier message: 18/04/2006, 13h18
  4. Requete SQL avec une clause FROM variable
    Par aCe_GiK dans le forum Requêtes et SQL.
    Réponses: 8
    Dernier message: 11/04/2006, 13h45
  5. [super requete] Dumper un model avec une clause where
    Par elievar dans le forum Langage SQL
    Réponses: 3
    Dernier message: 16/03/2005, 17h05

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