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 :

Select sur un DataSet


Sujet :

C#

  1. #1
    Membre régulier
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    187
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2006
    Messages : 187
    Points : 73
    Points
    73
    Par défaut Select sur un DataSet
    Bonjour,

    Je suis en train de développer une classe me retournant un classement sportif. Pour se faire, je récupère dans une base de données :
    - une liste d'équipes engagées
    - une liste de matchs
    - un ensemble de paramètres

    Les différents critères m'imposent de faire différents calculs pour obtenir un classement final. Je dois par exemple parcourir une première fois toutes les équipes engagées, puis en cas d'égalité établir un "mini classement" entre les équipes à égalité, afin de les départager.

    Pour éviter de multiplier les accès à la base j'essaie de filtrer la liste des matchs avec une copie du DataSet, que j'essaie de filtrer :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    //maSousRequeteMatchs contient la liste des identifiants des équipes à filtrer (-> exemple : 15,18,22)
    DataSet dsMatchsJouesDiffPart = dsMatchsJoues.Copy();
    string maRequeteMatchs = "(M_EQUIPE_A_ID not in (" + maSousRequeteMatchs.ToString() + ") AND M_EQUIPE_B_ID not in (" + maSousRequeteMatchs.ToString() +"))";
    DataRow[] selMatchsDiffPartASuppr = dsMatchsJouesDiffPart.Tables[0].Select(maRequeteMatchs);
    foreach (DataRow dr in selMatchsDiffPartASuppr)
    {
    dsMatchsJouesDiffPart.Tables[0].Rows.Remove(dr);
    }
    Ce que je ne comprends pas, c'est que je n'ai pas du tout le même résultat qu'avec mon éditeur SQL, qui me filtrait bien les matchs sur les n équipes contenues dans maSousRequeteMatchs...

    J'en déduis que le Select n'aime pas les in/not in. Mais quelle est l'alternative?

  2. #2
    Membre régulier
    Profil pro
    Inscrit en
    Septembre 2007
    Messages
    82
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations forums :
    Inscription : Septembre 2007
    Messages : 82
    Points : 89
    Points
    89
    Par défaut
    À première vu tu pourrais t'en sortir avec du sql.
    Par quelques petits order by bien fait.

  3. #3
    Membre régulier
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    187
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2006
    Messages : 187
    Points : 73
    Points
    73
    Par défaut
    Mais je voulais éviter de refaire appel à du SQL, car les performance sont déja un peu "limites" avec de multiples accès à la base...
    Donc finalement au lieu de remplir un DataSet "cloné" avec les lignes à supprimer comme je voulais le faire, je remplis un DataSet "cloné" avec les copiées :

    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
     
    //->récupération des matchs
    DataSet dsMatchsJouesDiffPart2 = dsMatchsJoues.Clone();
    maRequeteMatchs = "(M_EQUIPE_A_ID in (" + maSousRequeteMatchs.ToString() + ") AND M_EQUIPE_B_ID in (" + maSousRequeteMatchs.ToString() + "))";
    DataRow[] selMatchsDiffPartASuppr = dsMatchsJoues.Tables[0].Select(maRequeteMatchs);
    foreach (DataRow dr in selMatchsDiffPartASuppr)
    {
    DataRow newRow = dsMatchsJouesDiffPart2.Tables[0].NewRow();
    for (int i = 0; i < dr.ItemArray.Length; i++)
    {
    if (!(dr.ItemArray[i] is System.DBNull))
    newRow[dr.Table.Columns[i].ColumnName] = dr.ItemArray[i];
    }
    dsMatchsJouesDiffPart2.Tables[0].Rows.Add(newRow);
    }
    En effet, le select ne me donne pas les bon résultats avec "not in (.,.,.)" mais marche bien pour "in (.,.,.)".

  4. #4
    Membre régulier Avatar de SetaSensei
    Homme Profil pro
    Inscrit en
    Juin 2006
    Messages
    78
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France

    Informations forums :
    Inscription : Juin 2006
    Messages : 78
    Points : 104
    Points
    104
    Par défaut
    Citation Envoyé par Gold.strike Voir le message
    Mais je voulais éviter de refaire appel à du SQL, car les performance sont déja un peu "limites" avec de multiples accès à la base...
    Quand vous parlez de "limite", c'est une question de performances SQL pures ou en termes de trafic réseau ?
    Pour revenir à la réflexion de girouxv, effectivement il serait bien plus intéressant de passer par le SQL directement.
    Votre base est-elle si volumineuse que ça et faites vous tant d'appels que ça dessus ?
    Si vraiment vous tenez à tout prix à utiliser le C# pour vos sous requêtes, vous pouvez essayer de vous tourner vers du Linq : http://introducinglinq.com/blogs/mar...nq-to-sql.aspx

    Mais je serai d'avis de se pencher sur ce problème de performances "limites" en SQL au premier abord. Je trouve étonnant que vous ayez de tels problèmes, surtout si vous êtes en phase de développement :
    * Quel est le moteur utilisé ?
    * Avez vous indexé vos tables ?

  5. #5
    Membre régulier
    Profil pro
    Inscrit en
    Septembre 2007
    Messages
    82
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations forums :
    Inscription : Septembre 2007
    Messages : 82
    Points : 89
    Points
    89
    Par défaut
    Si ta base de données est sqlserver une belle petite procédure stockée bien fait ne ferait qu'une seule requête au serveur. Il faut cependant éviter les cursor dans ton code.

  6. #6
    Membre régulier
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    187
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2006
    Messages : 187
    Points : 73
    Points
    73
    Par défaut
    La base de donnée est PostgreSQL.

    Il y a quelques points qui expliquent que les performances de la base ne sont pas "optimales" :
    - il y a de nombreuses images ou logos stockées, qui nous ont déja nécessité de développer un "cache"
    - ensuite l'application a été prévue pour que la base soit stockée sur un serveur "interne". Mais dans certains cas les utilisateurs accèdent directement à meur base depuis notre serveur via une connexion internet, ce qui nécessite encore plus de réduire les accès à la base...

    Dans le cas précédent, la table "match" contient donc l'ensemble des matchs de toutes les équipes engagées dans une compétition. Il me semble plus simple de la récupérer une fois, puis de procéder par copies et filtres pour chaque équipe que de multiplier les accès à la BDD...

  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 : 62
    Localisation : France

    Informations professionnelles :
    Activité : Chef de projet NTIC

    Informations forums :
    Inscription : Janvier 2007
    Messages : 6 604
    Points : 13 314
    Points
    13 314
    Par défaut
    Citation Envoyé par girouxv Voir le message
    Si ta base de données est sqlserver une belle petite procédure stockée bien fait ne ferait qu'une seule requête au serveur.
    Ce n'est pas spécifique à Sql Server et c'est valable pour tous les "vrais" SGBD.

    Je ne réponds pas aux questions techniques par MP ! Le forum est là pour ça...


    Une réponse vous a aidé ? utiliser le bouton

    "L’ennui dans ce monde, c’est que les idiots sont sûrs d’eux et les gens sensés pleins de doutes". B. Russel

Discussions similaires

  1. [Débutant] Faire un tri sur un dataset d'après la selection dans une combobox
    Par j_quillet dans le forum C#
    Réponses: 0
    Dernier message: 28/03/2015, 23h22
  2. Réponses: 7
    Dernier message: 27/01/2012, 15h32
  3. Affichage de SELECT sur DataSet
    Par BlAcKWiNgS027 dans le forum ASP.NET
    Réponses: 1
    Dernier message: 10/08/2009, 17h23
  4. select sur un champ de type LONG
    Par ppd dans le forum Langage SQL
    Réponses: 2
    Dernier message: 03/09/2004, 18h19
  5. select sur plusieurs table, question sur jointure
    Par Schulman dans le forum Langage SQL
    Réponses: 7
    Dernier message: 03/09/2004, 13h54

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