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

Accès aux données Discussion :

Comparaison de DataTable fortement typés


Sujet :

Accès aux données

  1. #1
    Membre à l'essai
    Homme Profil pro
    Assistant Projet Informatique
    Inscrit en
    Janvier 2014
    Messages
    16
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Assistant Projet Informatique
    Secteur : Industrie

    Informations forums :
    Inscription : Janvier 2014
    Messages : 16
    Points : 10
    Points
    10
    Par défaut Comparaison de DataTable fortement typés
    Bonjour,

    J'ai créé un petit morceau de code afin de comparer deux datatables fortement typés et d'insérer dans le 1er tout ce qu'il y est pas, par rapport au 2nd.
    Ce code fonctionne mais prend énormément de temps.

    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
    16
    17
    18
    19
    20
    21
    22
     
    DSC.HOFDataTable HOF = new DSC.HOFDataTable();                                  //datatable fortemment typé
    DSC.IMPOFDataTable IMPOF = new DSC.IMPOFDataTable();                            //datatable fortemment typé
    DSC.IMPOFDataTable dt = new DSC.IMPOFDataTable();                               //datatable temporaire (servira aux inserts)
    bool check = false;
     
    foreach (DSC.HOFRow DRHOF in HOF.Rows)                                          //on parcourt les lignes de HOF
                {
                    while (!check)
                    {
                        foreach (DSC.IMPOFRow DRIMPOF in IMPOF.Rows)
                        {
                                if (DRHOF["ORDNO"] == DRIMPOF["CODE_OF"])          //pour chaque ligne dans HOF on vérifie si l’équivalent IMPOF existe (CODE_OF et ORDNO sont les clés primaires)
                                {
                                    check = true;
                                    break;
                                }
                        }
                        if (!check)                                               //si check est true on continue et on passe à la ligne suivante
                            dt.Rows.Add(DRHOF.ItemArray);                         //sinon, on ajoute la ligne au datatable temporaire
                    }
                }
    Comme vous pouvez le remarquer, ce code n'est pas très propre (break), et a l'inconvénient majeur de prendre un temps infini dès qu'on commence à passer des centaines de lignes.
    J'ai donc besoin d'aide afin de l'améliorer.

    Merci aux courageux qui se pencheront sur le problème...

  2. #2
    Expert éminent Avatar de Graffito
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    5 993
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2006
    Messages : 5 993
    Points : 7 903
    Points
    7 903
    Par défaut
    Avant d'exploiter des DataView triées, ceci devrait améliorer les performances:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    ...
    int OrdnoIndex  = DSC.HOF.Columns["ORDNO"].Ordinal ;
    int CodeOfIndex = DSC.IMPOF.Columns["CODE_OF"].Ordinal ;
    for (int i=0;i<DSC.HOF.Rows.Count;i++)                        
    { //on parcourt les lignes de HOF
      bool check = false;
      int HofKey = DSC.HOF.Rows[i][OrdnoIndex] ; // int ou long suivant type de la colonne autoincrément
      //on parcourt les lignes de IMPHOF
      for (int j=0;j<DSC.IMPHOF.Rows.Count && !check;j++) check= HofKey == DSC.IMPHOF.Rows[j][CodeOfIndex]) ;
     //si non trouvée, on ajoute la ligne au datatable temporaire
      if (!check) dt.Rows.Add(DSC.HOF.Rows[i].ItemArray);                  
    }
    " Le croquemitaine ! Aaaaaah ! Où ça ? " ©Homer Simpson

  3. #3
    Membre à l'essai
    Homme Profil pro
    Assistant Projet Informatique
    Inscrit en
    Janvier 2014
    Messages
    16
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Assistant Projet Informatique
    Secteur : Industrie

    Informations forums :
    Inscription : Janvier 2014
    Messages : 16
    Points : 10
    Points
    10
    Par défaut Résolution
    Merci Graffito, tu as résolu mon problème. Les performances sont infiniment meilleures et le code est bcp plus "propre".
    Voici le code, à peine modifié, que j'ai utilisé, pour les prochains qui auront un soucis identique :

    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
    16
    17
    18
    19
     
    DSC.HOFDataTable HOF = new DSC.HOFDataTable();                                  //datatable fortemment typé
    DSC.IMPOFDataTable IMPOF = new DSC.IMPOFDataTable();                            //datatable fortemment typé
    DSC.IMPOFDataTable dt = new DSC.IMPOFDataTable();                               //datatable temporaire (servira aux inserts)
    bool check = false;
    string HofKey = String.Empty;                                                   //type fonction du champs clé primaire
     
    for (int i=0 ; i < HOF.Rows.Count ; i++)                        
                for (int i=0 ; i < HOF.Rows.Count ; i++)                        
                {                                                                           //on parcourt les lignes de HOF
                    check = false;
                    HofKey = (string) HOF.Rows[i][HOF.Columns["ORDNO"].Ordinal];
     
                    for (int j=0; j < IMPOF.Rows.Count && !check; j++)                      //on parcourt les lignes de IMPHOF
                        check = HofKey == (string) IMPOF.Rows[j][IMPOF.Columns["CODE_OF"].Ordinal];
     
                    if (!check)                                     //si non trouvée, on ajoute la ligne au datatable temporaire
                        dt.Rows.Add(HOF.Rows[i].ItemArray);
                }

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

Discussions similaires

  1. Methode find sur Dataset fortement typé
    Par stdebordeau dans le forum Windows Forms
    Réponses: 7
    Dernier message: 12/05/2009, 18h41
  2. Utilisation du dataset fortement typé
    Par s.n.a.f.u dans le forum Général Dotnet
    Réponses: 2
    Dernier message: 06/04/2007, 19h39
  3. Pb avec un dataset fortement typé
    Par chris81 dans le forum Windows Forms
    Réponses: 14
    Dernier message: 05/03/2007, 14h29
  4. [ADO.net][VB.net] DataSet fortement typé à la main
    Par RaelRiaK dans le forum Accès aux données
    Réponses: 2
    Dernier message: 11/01/2007, 09h48
  5. Réponses: 2
    Dernier message: 19/09/2006, 13h26

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