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 :

[WPF] Requête SQL dans un dataset


Sujet :

C#

  1. #1
    Membre régulier
    Profil pro
    Inscrit en
    Janvier 2011
    Messages
    183
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2011
    Messages : 183
    Points : 89
    Points
    89
    Par défaut [WPF] Requête SQL dans un dataset
    Bonjour,

    Je développe actuellement une application WPF en C#, je récupère le contenu d'une requête SQL dans une DATAGRID.

    Parallèlement je dois construire un graphique en rapport avec ces données sauf que je dois faire des opérations sur mon dataset (sommes cumulées par exemple).

    Est-til possible de faire une requête SQL (avec opération count()) sur un dataset en mode déconnecté ?

    Merci d'avance et bonne journée.

  2. #2
    Membre régulier
    Inscrit en
    Novembre 2006
    Messages
    40
    Détails du profil
    Informations forums :
    Inscription : Novembre 2006
    Messages : 40
    Points : 117
    Points
    117
    Par défaut
    Je développe actuellement une application WPF en C#, je récupère le contenu d'une requête SQL dans une DATAGRID.
    Comment tu recuperes le resultat du SQL pour le mettre dans la datagrid ?
    tu binds sur une collection ?

    Si c'est le cas, alors tu peux avoir acces a toutes les methodes sur la collection : Count(), Sum(), Average()

  3. #3
    Membre régulier
    Profil pro
    Inscrit en
    Janvier 2011
    Messages
    183
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2011
    Messages : 183
    Points : 89
    Points
    89
    Par défaut
    Citation Envoyé par Drezounet218 Voir le message
    Comment tu recuperes le resultat du SQL pour le mettre dans la datagrid ?
    tu binds sur une collection ?

    Si c'est le cas, alors tu peux avoir acces a toutes les methodes sur la collection : Count(), Sum(), Average()
    Je fais le lien de cette manière :


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
     
    Datagrid.ItemsSource = dataset.Tables[0].DefaultView;

  4. #4
    Membre régulier
    Inscrit en
    Novembre 2006
    Messages
    40
    Détails du profil
    Informations forums :
    Inscription : Novembre 2006
    Messages : 40
    Points : 117
    Points
    117
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
             dynamic[] obj = new dynamic[ds.Tables[0].DefaultView.Count];
             dataset.Tables[0].DefaultView.CopyTo(obj, 0);
             var nombre = obj.Where(w => w.Salaire > 2000).Count();
             var moyenne = obj.Average(w=>w.Salaire);
             var MasseSalariale = obj.Sum(w => w.Salaire );
    Quelque chose du genre devrait pouvoir fonctionner

    on créé un tableau d'element (obj).
    On met tous les éléments de la view dans le tableau
    On utilise Linq pour faire des opérations sur ce tableau ( j'ai dans mon exemple la propriété Salaire sur les éléments de mon DataSet)
    Il faut rajouter en haut de ton code :
    Attention, ci dessus, je copie le DefaultView. Donc les valeurs dépendront des éléments affichés a l'ecran.
    Si les besoin sont sur le dataset entier, il faut l'adapter

  5. #5
    Membre régulier
    Profil pro
    Inscrit en
    Janvier 2011
    Messages
    183
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2011
    Messages : 183
    Points : 89
    Points
    89
    Par défaut
    Super, c'est globalement ce que je cherche, sauf que je fais une somme par catégorie par exemple ma table est de cette forme :

    Personne | Voiture
    -------------------
    Jean | Peugeot
    Pierre | Citroën
    Paul | Peugeot


    et ce que je cherche c'est à cumuler l'occurence d'une catégorie par exemple là on aurait 2 pour peugeot et 1 pour citroën.
    Actuellement je fais ça en SQL avec count et group by de manière simple mais ça nécessite deux requêtes SQL séparées (une pour les données en datagrid et une pour la somme pour le graph) .

  6. #6
    Membre régulier
    Inscrit en
    Novembre 2006
    Messages
    40
    Détails du profil
    Informations forums :
    Inscription : Novembre 2006
    Messages : 40
    Points : 117
    Points
    117
    Par défaut
    Toujours avec linq sur ta collection :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    var group = from p in obj
                         group p.Person by p.Car into g
                         select new { Car = g.Key, Persons = g.ToList(), Compteur=g.Count() };
    group sera une liste d'objet avec comme propriété :
    - Car : nom de la voiture
    - Persons : liste des personnes qui ont cette voiture
    - Compteur : Nombre de personne qui ont ce model de voiture

  7. #7
    Membre régulier
    Profil pro
    Inscrit en
    Janvier 2011
    Messages
    183
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2011
    Messages : 183
    Points : 89
    Points
    89
    Par défaut
    Merci beaucoup de te pencher sur mon cas .
    En fait mon dataset contient entre autre un champ nommé "Choix".

    Mon but est de pouvoir lister l'occurence de tous les choix par exemple mon dataset contient ces valeurs:

    Choix
    -----
    Choix1
    Choix2
    Choix1
    Choix3

    j'aimerais avoir comme résultats :

    Choix1 : 2
    Choix2 : 1
    Choix 3 : 1

    Je fais ça de manière très simple en SQL de cette manière :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    Select Count(Choix) as somme, Choix
    From MaTable
    GroupBy Choix
    Mais avec deux requêtes séparées (une qui sélectionne tout pour la datagrid et une autre pour le graph).

    Avec les bouts de code précédent, cela ne fonctionne pas :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
                    dynamic[] obj = new dynamic[ds.Tables[0].DefaultView.Count];
                    ds.Tables[0].DefaultView.CopyTo(obj, 0);
     
                    var group = from c in obj
                                group c.Phase by c.Choix into g
                                select new { Choix = g.Key, Compteur = g.Count() };
    De plus comment pointer par la suite chaque valeurs de obj ? Désolé je n'y connais pas grand chose en Linq .

  8. #8
    Membre régulier
    Inscrit en
    Novembre 2006
    Messages
    40
    Détails du profil
    Informations forums :
    Inscription : Novembre 2006
    Messages : 40
    Points : 117
    Points
    117
    Par défaut
    J'ai fait ce petit programme :
    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
      List<string> choix = new List<string>();
             choix.Add("Choix1");
             choix.Add("Choix2");
             choix.Add("Choix3");
             choix.Add("Choix1");
     
             var groupe = from c in choix
                         group c by c into g
                         select new { Choix = g.Key, Compteur = g.Count() };
     
             foreach (var item in groupe)
             {
                 Console.WriteLine(item.Choix + " : " + item.Compteur);
             }
             Console.ReadLine();
    cela retourne :
    Choix1 : 2
    Choix2 : 1
    Choix3 : 1


    Peut etre en changeant un peu le code :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     dynamic[] obj = new dynamic[ds.Tables[0].DefaultView.Count];
                    ds.Tables[0].DefaultView.CopyTo(obj, 0);
     
                    var group = from c in obj
                                group c.Choix by c.Choix into g
                                select new { Choix = g.Key, Compteur = g.Count() };

  9. #9
    Membre régulier
    Profil pro
    Inscrit en
    Janvier 2011
    Messages
    183
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2011
    Messages : 183
    Points : 89
    Points
    89
    Par défaut
    J'obtiens malheureusement cette erreur :

    'System.Data.DataRowView' ne contient pas de définition pour 'Choix'

    On y est presque je pense

  10. #10
    Membre régulier
    Inscrit en
    Novembre 2006
    Messages
    40
    Détails du profil
    Informations forums :
    Inscription : Novembre 2006
    Messages : 40
    Points : 117
    Points
    117
    Par défaut
    L'objet DataRowView représente une ligne de ton tableau.

    sur cette ligne, il y a une colonne qui porte le choix

    donc il faut modifier ce que j'ai mis en rouge dans mon post précédent pour mettr e:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    dynamic[] obj = new dynamic[ds.Tables[0].DefaultView.Count];
                    ds.Tables[0].DefaultView.CopyTo(obj, 0);
     
    colonne = 5 ;
                    var group = from c in obj
                                group c[colonne] by c[colonne] into g
                                select new { Choix = g.Key, Compteur = g.Count() };
    J'ai considéré que le choix etait dans la 6eme colonne de ta grid

  11. #11
    Membre régulier
    Profil pro
    Inscrit en
    Janvier 2011
    Messages
    183
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2011
    Messages : 183
    Points : 89
    Points
    89
    Par défaut
    Super ça fonctionne impeccable je te remercie beaucoup pour ta patience.

    Bonne continuation à toi

  12. #12
    Membre régulier
    Profil pro
    Inscrit en
    Janvier 2011
    Messages
    183
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2011
    Messages : 183
    Points : 89
    Points
    89
    Par défaut
    Désolé de t'embêter encore mais du coup le but de la manoeuvre étant de faire plusieurs opérations différentes sur un seul dataset. La première était de compter l'occurence des choix et ça fonctionne nikel.
    La deuxième est de cumuler une valeur par choix :

    Choix | Val
    -------|--------
    Choix1 20
    Choix2 10
    Choix1 5
    Choix3 2

    Devrait me donner :
    Choix | Val
    -------|--------
    Choix1 25
    Choix2 10
    Choix3 2

    J'ai donc voulu faire ceci :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
                int colonneChoix = 5;
                int colonneVal = 6;
                var group = from c in obj
                             group c[colonneVal ] by c[colonneChoix ] into g
                             select new { Choix = g.Key, Compteur = g.Sum(c => c.Val) };
    Mais j'ai cette erreur lors de l'exécution :

    'long' ne contient pas de définition pour 'Val'

    Je pense que c'est pas grand chose mais en regardant les exemples sur le web je n'ai trouvé que cette manière de faire :S

  13. #13
    Membre régulier
    Inscrit en
    Novembre 2006
    Messages
    40
    Détails du profil
    Informations forums :
    Inscription : Novembre 2006
    Messages : 40
    Points : 117
    Points
    117
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
       int colonneChoix = 5;
                int colonneVal = 6;
                var group = from c in obj
                             group c[colonneVal ] by c[colonneChoix ] into g
                             select new { Choix = g.Key, Compteur = g.Sum(c => c.Val) };
    il faut modifier un peu du coup :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
       int colonneChoix = 5;
                int colonneVal = 6;
                var group = from c in obj
                             group c by c[colonneChoix ] into g
                             select new { Choix = g.Key,Nombre = g.Count(), Compteur = g.Sum(c => c[colonneVal ]) };
    On peut ainsi utiliser toutes les fonctions disponibles dans linq : Sum, Average, Count .... dans la meme requete et eviter ainsi de faire plusieurs fois les memes lignes de requetes !

    tu auras peut etre des problemes de conversion, il faut utiliser le Convert.ToInt32(c[colonneVal]) si cela arrive

  14. #14
    Membre régulier
    Profil pro
    Inscrit en
    Janvier 2011
    Messages
    183
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2011
    Messages : 183
    Points : 89
    Points
    89
    Par défaut
    Super tout fonctionne !!!!


    Encore merci !!!

    Bonne continuation

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

Discussions similaires

  1. Projet VB v6 : utilisation de requête SQL dans mon code
    Par MITCH31 dans le forum VB 6 et antérieur
    Réponses: 4
    Dernier message: 27/10/2005, 15h02
  2. [MySQL] Problème de requêtes SQL dans un script
    Par Nefret dans le forum PHP & Base de données
    Réponses: 8
    Dernier message: 08/09/2005, 15h08
  3. récupérer le résultat d'une requête sql dans un edit
    Par bertrand_declerck dans le forum Bases de données
    Réponses: 3
    Dernier message: 28/07/2005, 14h07
  4. Problème requête SQL dans page ASP
    Par rocs dans le forum ASP
    Réponses: 14
    Dernier message: 26/07/2005, 15h38
  5. Problème de requète SQL dans un Requery
    Par Keraccess dans le forum Requêtes et SQL.
    Réponses: 7
    Dernier message: 22/10/2004, 14h58

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