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

ADO.NET Discussion :

Specificite du IN dans une requete avec ADO.NET


Sujet :

ADO.NET

  1. #1
    Membre habitué
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Avril 2009
    Messages
    391
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Avril 2009
    Messages : 391
    Points : 185
    Points
    185
    Par défaut Specificite du IN dans une requete avec ADO.NET
    Bonjour à tous ,

    j'ai une requête UPDATE qui ressemble à ça :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    UPDATE x 
    SET y = 0, date = SYSDATE
    WHERE z = ...
    AND code IN (
       SELECT DISTINCT code
       FROM a
       WHERE id IN (
          Liste d'identifiant
       )
    );
    J'aimerais savoir s'il est possible d'avoir un Objet List<string> dans un IN ? Par exemple je remplacerais "Liste d'identifiant" par une List<string> listeId.

    Merci d'avance

  2. #2
    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 : 36
    Localisation : Etats-Unis

    Informations professionnelles :
    Activité : CTO
    Secteur : Finance

    Informations forums :
    Inscription : Février 2010
    Messages : 3 611
    Points : 9 743
    Points
    9 743
    Billets dans le blog
    3
    Par défaut
    C'est faisable un convertissant le paramètre en string :
    Code C# : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    var listeIdentifiants = new List<string>();
     
    var query = "SELECT DISTINCT code FROM a WHERE id IN (@ListeIdentifiants)";
    using (var cmd = new SqlCommand(query, taSqlConnection))
    {
        cmd.Parameters.Add("@ListeIdentifiants", String.Join(",", listeIdentifiants.ToArray()));
    }
    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.

  3. #3
    Invité
    Invité(e)
    Par défaut
    Citation Envoyé par DotNetMatt Voir le message
    C'est faisable un convertissant le paramètre en string : [...]
    Tu es sûr d'avoir testé ce que tu dis. ça ne marche pas ou du moins ça ne marche uniquement si ta liste contient un seul élément parce que si tu as plusieurs éléments ex : CODE1, CODE2 et CODE3 la requête exécutée est la suivante : "SELECT DISTINCT code FROM a WHERE id IN ( 'CODE1, CODE2, CODE3' )". Remarque que ton paramètre sera considéré comme une seule valeur et que le tout sera entouré de simple quote.

    paladice,
    Il y a plusieurs solutions pour faire mais celle que je préfère est la suivante :
    1. Créer un type dans ton SGBDR :
      Code SQL : Sélectionner tout - Visualiser dans une fenêtre à part
      1
      2
      3
      4
      5
      6
       
      CREATE TYPE Codes AS TABLE 
      ( 
      	Code varchar(50)
       );
      GO
    2. Créer une procédure stockée comme suit :
      Code SQL : Sélectionner tout - Visualiser dans une fenêtre à part
      1
      2
      3
      4
      5
      6
      7
      8
       
      create procedure SelectItemWhereCodeIn (@codes Codes READONLY)
      as
      begin
             -- Pour l'update tu feras à peu près pareil
      	SELECT DISTINCT code FROM a WHERE id IN  in 
      	( select code from @codes )
      end
    3. Côté C# tu fais comme suit :
      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
       
       
      SqlCommand cmd = new SqlCommand();
      cmd.CommandText = "SelectItemWhereCodeIn";
      cmd.CommandType = CommandType.StoredProcedure;
       
       
      DataTable parameters = new DataTable();
      parameters.Columns.Add(new DataColumn("Code", typeof(string)));
      parameters.Rows.Add("CODE1");
      parameters.Rows.Add("CODE2");
      parameters.Rows.Add("CODE3");
       
      SqlParameter parameter = new SqlParameter { SqlDbType = System.Data.SqlDbType.Structured,  Value = parameters, ParameterName = "@codes" };
      cmd.Parameters.Add(parameter);
       
      // Et là tu exécutes ta commande.

  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 : 36
    Localisation : Etats-Unis

    Informations professionnelles :
    Activité : CTO
    Secteur : Finance

    Informations forums :
    Inscription : Février 2010
    Messages : 3 611
    Points : 9 743
    Points
    9 743
    Billets dans le blog
    3
    Par défaut
    Citation Envoyé par h2s84 Voir le message
    Tu es sûr d'avoir testé ce que tu dis. ça ne marche pas ou du moins ça ne marche uniquement si ta liste contient un seul élément parce que si tu as plusieurs éléments ex : CODE1, CODE2 et CODE3 la requête exécutée est la suivante : "SELECT DISTINCT code FROM a WHERE id IN ( 'CODE1, CODE2, CODE3' )". Remarque que ton paramètre sera considéré comme une seule valeur et que le tout sera entouré de simple quote.
    J'ai effectivement fait un oubli, il faut utiliser string.Join("','" (avec des simple quotes dedans). Mais sinon oui ça marche bien, en tout cas ça devrait

    [EDIT] : Après vérification effectivement il y a un souci, je n'avais pas pu tester en postant ce matin. Donc voici un truc testé et qui fonctionne :
    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
    var liste = new List<string>(); // la liste qui contient les valeurs du IN
    string[] paramArray = liste.Select((x, i) => "@liste" + i).ToArray(); // On crée dynamiquement un paramètre SQL par valeur (format @listeX où X est l'index de l'élément dans la liste)
    cmd.CommandText = string.Format("SELECT * FROM Table1 WHERE PRODUIT IN ({0})", string.Join(",", paramArray)); // On ajoute les paramètres dans le IN
     
    // On ajoute les SqlParameters à la commande
    for (int i = 0; i < liste.Count; ++i)
    {
        cmd.Parameters.Add(new SqlParameter("@liste" + i, liste[i]));
    }
     
    // Et il n'y a plus qu'à exécuter...
    cmd.Connection.Open();
     
    using (var dr = cmd.ExecuteReader())
    {
        while (dr.Read())
        {
            var a = dr[0];
            var b = dr[1];
        }
    }
    Merci h2s84 pour avoir signalé l'erreur
    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
    Membre habitué
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Avril 2009
    Messages
    391
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Avril 2009
    Messages : 391
    Points : 185
    Points
    185
    Par défaut
    Merci à vous =)

    Je ne peux malheureusement pas tester la solution de h2s84 parce que je ne peux pas toucher à la BDD.
    Je vais tester la tienne DotNetMatt, merci

  6. #6
    Membre éclairé Avatar de chamamo
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    588
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2006
    Messages : 588
    Points : 735
    Points
    735
    Par défaut
    Je préfère plutôt créer un parametre pour chaque identifiant.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    var listeIdentifiants = ....; //Récupérer les identifiants
     
    var query = "SELECT DISTINCT code FROM a WHERE id IN (";
    int i=0;
    foreach(var id in listeIdentifiants)
    {
          var ParamName = "@id" + i++;
          cmd.Parameters.Add(ParamName , id);
          query += ParamName + ",";
    }
    query = query .Remove(ss.Length - 1) + ")";

  7. #7
    Membre éclairé Avatar de chamamo
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    588
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2006
    Messages : 588
    Points : 735
    Points
    735
    Par défaut
    Citation Envoyé par chamamo Voir le message
    Je préfère plutôt créer un parametre pour chaque identifiant.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    var listeIdentifiants = ....; //Récupérer les identifiants
     
    var query = "SELECT DISTINCT code FROM a WHERE id IN (";
    int i=0;
    foreach(var id in listeIdentifiants)
    {
          var ParamName = "@id" + i++;
          cmd.Parameters.Add(ParamName , id);
          query += ParamName + ",";
    }
    query = query .Remove(ss.Length - 1) + ")";
    Zut j'avais pas vu la solution de DotNetMatt

Discussions similaires

  1. Réponses: 3
    Dernier message: 03/05/2008, 16h44
  2. Réponses: 5
    Dernier message: 06/02/2007, 13h46
  3. [MySQL] Erreur dans une requête avec jointures
    Par bobic dans le forum Langage SQL
    Réponses: 17
    Dernier message: 03/08/2006, 13h04
  4. Somme dans une requete avec regroupement
    Par louroulou dans le forum Requêtes et SQL.
    Réponses: 1
    Dernier message: 19/07/2006, 21h20
  5. Calculs dans une requete avec conditions multiples
    Par Sha1966 dans le forum Access
    Réponses: 3
    Dernier message: 13/01/2006, 15h18

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