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 :

Comment additionner 2 DataTables ?


Sujet :

C#

  1. #1
    Membre averti Avatar de Contrec
    Homme Profil pro
    Inscrit en
    Mars 2005
    Messages
    597
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38

    Informations forums :
    Inscription : Mars 2005
    Messages : 597
    Points : 342
    Points
    342
    Par défaut Comment additionner 2 DataTables ?
    Bonjour, voila ma situation :

    J'ai une boucle qui remplit un DataSet DS1 avec n enregistrements (vide et re-remplit a chaque passage dans la boucle).

    Je souhaiterai avoir un DataSet DSTOTAL contenant l'addition des enregistrements de DS1.

    En fait j'aimerai bien faire un truc du genre :

    DSTOTAL = DSTOTAL + DS1;

    Comme ca mon DSTOTAL se remplit de plus en plus a chaque passage.

    J'ai essaye :

    foreach(DataSet.Rows MyRow in DS1.Rows)
    {
    DSTOTAL.Rows.Add(MyRow);
    }

    Mais il me dit que MyRow appartient deja a une table....

    Comment additionner des enregistrements de DataTables (sans faire de boucles si possible pour la performance) ?

    Merci d'avance
    Contrec

  2. #2
    Membre averti Avatar de Contrec
    Homme Profil pro
    Inscrit en
    Mars 2005
    Messages
    597
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38

    Informations forums :
    Inscription : Mars 2005
    Messages : 597
    Points : 342
    Points
    342
    Par défaut
    Personne ne voit comment ajouter des lignes d'un DataSet dans un autre comme si on faisait :

    DS1.Rows += DS2.Rows
    Contrec

  3. #3
    Membre éprouvé
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    764
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2007
    Messages : 764
    Points : 909
    Points
    909
    Par défaut
    On ne peut pas faire passer des DataRow d'une table à une autre comme ça, il faut les recopier...


    Mais à mon avis ton problème se situe à un autre niveau :
    J'ai une boucle qui remplit un DataSet DS1 avec n enregistrements (vide et re-remplit a chaque passage dans la boucle).
    c'est idiot comme fonctionnement ! il suffit d'ajouter le nouvel enregistrement sans vider la table et le tour est joué...
    => pourquoi agis-tu comme ceci ?

  4. #4
    Membre averti Avatar de Contrec
    Homme Profil pro
    Inscrit en
    Mars 2005
    Messages
    597
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38

    Informations forums :
    Inscription : Mars 2005
    Messages : 597
    Points : 342
    Points
    342
    Par défaut
    J'ai besoin de faire comme ca car je me sert de 2 DataSets :

    1 qui est recharge a chaque passage d'une boucle afin de construire la structure d'un TreeView a partir d'une requete sql

    1 qui est l'ensemble des valeurs additionnees dans le premier afin de faire des recherches et des updates par la suite.

    Je vais essayer d'illuster ca :

    DS1 possede Val 1
    Val 2
    Val 3 au premier passage de la boucle

    DS1 possede Val 1
    Val 4
    Val 8 au deuxieme passage de la boucle

    Si je remplit DS1 sans le vider, je creer des erreurs de cle primaire :

    DS1 aurait Val 1
    Val 1
    Val 2
    .
    .
    Val 8

    La portee de DS1 est locale a une methode.

    J'ai besoin de DS2 qui se remplit sans se vider avec les valeurs de DS1 (sans ajouter une ligne qui existe deja comme Val 1)

    DS2 doit avoir : Val 1
    Val 2
    Val 3
    Val 4
    Val 8

    Je pourrai avoir DS1 comme avant et DS2 que je remplit avec une requete generales mais il y a beaucoup de lignes et comme je les charges deja dans DS1, je voulais en profiter pour les copier (sans doublons) dans DS2.

    J'esoere avoir ete clair pcke j'en doute...
    Contrec

  5. #5
    Membre éprouvé
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    764
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2007
    Messages : 764
    Points : 909
    Points
    909
    Par défaut
    Es-tu vraiment obligé de passer par un DataSet pour remplir ton TreeView ? (je n'ai jamais utilisé de TreeView)

    Je verrais plutôt les choses ainsi :
    - tu récupères les données dans ta base (dans un DataReader je suppose) avec une de tes requêtes sql
    - tu lis chaque enregistrement dans le DataReader et tu copies les données dans le TreeView d'une part, dans le DataSet d'autre part (en vérifiant bien évidemment que la ligne n'y est pas déjà grâce à ta clé primaire)
    - et tu boucles...

    Tu peux montrer un peu ton code, qu'on voie mieux ce que tu fais ?

  6. #6
    Membre averti Avatar de Contrec
    Homme Profil pro
    Inscrit en
    Mars 2005
    Messages
    597
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38

    Informations forums :
    Inscription : Mars 2005
    Messages : 597
    Points : 342
    Points
    342
    Par défaut
    Peut etre que ta solution d'utiliser pour l'un un DataReader et pour l'autre un DataSet en ajoutant les lignes resoudra mon probleme.

    Pour le code :

    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
    // dS_TestAreaByProgramDevice correspond a mon DS1
    foreach (LMA_DataSets.DS_TestArea.T_TEST_AREARow MyTestAreaRow in dS_TestAreaByProgramDevice.T_TEST_AREA.Rows)
    {
    	// dS_TestAreaTree coorespond a mon DS2
    	if (dS_TestAreaTree.T_TEST_AREA.FindByTEST_AREA_NAME(MyTestAreaRow.TEST_AREA_NAME) == null)
    	{
    		dS_TestAreaTree.T_TEST_AREA.AddT_TEST_AREARow(MyTestAreaRow.TEST_AREA_NAME, MyTestAreaRow.TEST_AREA_PREFIX);
    	}
     
    	// Adds the TestAreas TreeNode
    	Tree.Nodes[MyTechnologyRow.TECHNOLOGY_NAME]
    		.Nodes[MyDeviceRow.DEVICE_NAME]
    		.Nodes.Add(MyTestAreaRow.TEST_AREA_NAME, MyTestAreaRow.TEST_AREA_NAME);
    	}
    }
    Sinon j'avais trouve la methode ImportRow qui peut fonctionner...
    Contrec

  7. #7
    Membre éprouvé
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    764
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2007
    Messages : 764
    Points : 909
    Points
    909
    Par défaut
    Hum... Ce sont des DatSet fortement typés, c'est ça ? Mon dieu que c'est illisible

    Ce que j'ai compris : quand tu remplis ton DataView, tu ne fais que recopier ce qui est dans le DataSet DS1... donc tu pourrais très bien le recopier directement depuis le DataReader au moment où tu récupères les données, avant de les avoir recopiées dans le DataSet...

    Ce qui donnerait un pseudo code de ce genre :
    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
    DataSet ds; // tables bien définies etc bien sûr
    foreach (requete à envoyer)
    {
       Command cmd; // = la requête SELECT à envoyer...
       IDataReader dr = cmd.ExecuteReader();
       while (dr.Read())
       {
          // remplissage de ds
          object key = dr["nom de la colonne de clé"];
          if (!ds.Tables["T_TestAREA"].Rows.Contains(key))
          {
             // copier dans ds
          }
     
          // remplissage de tree
          Tree.Nodes[truc].Nodes[chose].Nodes.Add(dr["TEST_AREA_NAME"], dr["TEST_AREA"]);
       }
    }

  8. #8
    Membre averti Avatar de Contrec
    Homme Profil pro
    Inscrit en
    Mars 2005
    Messages
    597
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38

    Informations forums :
    Inscription : Mars 2005
    Messages : 597
    Points : 342
    Points
    342
    Par défaut
    Ouais en fait je n'ai pas de DataReader car je fais tout par DataSets (avec des TableAdapters) car je ne veux pas voir de code SQL dans mes codes sources (Je les edite par designer Visual Studio). J'ai creuse et trouve une solution (pas optimale mais c'est deja pas mal et puis faut pas trop que je traine) :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    foreach (Dataset.Row MyRow in DS1.Rows)
    {
          if (DS2.FindByKey(MyRow.MyKey) == null)
          {
                DS2.ImportRow(MyRow);
     
          }
    }
    En fait le ImportRow DETACHE la Row de la table puis cree une nouvelle copy de cette qu'elle attache au nouveau DataSet ce qui corrige l'erreur que j'avais obtenue.


    Merci beaucoup d'avoir cherche, bonne journee (Je vai poser une autre discussion lol)
    Contrec

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

Discussions similaires

  1. Réponses: 5
    Dernier message: 09/02/2007, 18h46
  2. [C#] Comment remplir un DataTable typé avec un DataSet ?
    Par L`artiste dans le forum Accès aux données
    Réponses: 11
    Dernier message: 25/04/2006, 14h56
  3. [C#] Comment trier une DataTable ?
    Par royto dans le forum C#
    Réponses: 2
    Dernier message: 23/03/2006, 01h15
  4. [C#] Comment renvoyer un DataTable ?
    Par ALCINA dans le forum Services Web
    Réponses: 1
    Dernier message: 18/01/2006, 16h21

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