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 :

comparer 2 datatables


Sujet :

C#

  1. #1
    Membre régulier
    Profil pro
    Inscrit en
    Janvier 2013
    Messages
    8
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Janvier 2013
    Messages : 8
    Par défaut comparer 2 datatables
    Bonjour,

    J'aimerais récupérer les lignes différentes de 2 datatables.
    Pour ce faire, je mets à true un tableau de boolean et à chaque fois que je trouve une égalité de datarow, je mets le boolean correspondant à false.
    Ensuite, je récupère le tableau de boolean et j'ajoute les datarows qui restent à true.
    voici le bout de code :

    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
    22
    23
    24
    25
    IEqualityComparer<DataRow> comparer = DataRowComparer.Default;
                    foreach (DataRow row1 in table1.Rows)
                    {
     
                        foreach (DataRow row2 in table2.Rows)
                        {
     
                            if (comparer.Equals(row1, row2))
                            {
     
                                found[curRow1] = false;    
     
                            }
     
                        }
                        curRow1++;
                    }
                    for (int i = 0; i < found.Length; i++)
                    {
                        if (found[i])
                        {
                            difference.Rows.Add(table1.Rows[i]);
                        }
     
                    }

  2. #2
    Membre Expert
    Avatar de azstar
    Homme Profil pro
    Architecte Technique BizTalk/.NET
    Inscrit en
    Juillet 2008
    Messages
    1 198
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Canada

    Informations professionnelles :
    Activité : Architecte Technique BizTalk/.NET
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2008
    Messages : 1 198
    Par défaut
    et le probleme ??

  3. #3
    Membre régulier
    Profil pro
    Inscrit en
    Janvier 2013
    Messages
    8
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Janvier 2013
    Messages : 8
    Par défaut Tableau de boolean à false
    Le problème est que les différences ne sont pas pris en compte
    j'ai deux datatables différentes avec la même structure mais le code met tout à false, arff

  4. #4
    Membre Expert
    Avatar de azstar
    Homme Profil pro
    Architecte Technique BizTalk/.NET
    Inscrit en
    Juillet 2008
    Messages
    1 198
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Canada

    Informations professionnelles :
    Activité : Architecte Technique BizTalk/.NET
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2008
    Messages : 1 198
    Par défaut
    il faut faire
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
     
     if (!comparer.Equals(row1, row2))

    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
    23
    24
    25
    26
     
    IEqualityComparer<DataRow> comparer = DataRowComparer.Default;
                    foreach (DataRow row1 in table1.Rows)
                    {
     
                        foreach (DataRow row2 in table2.Rows)
                        {
     
                            if (!comparer.Equals(row1, row2))
                            {
     
                                found[curRow1] = false;    
     
                            }
     
                        }
                        curRow1++;
                    }
                    for (int i = 0; i < found.Length; i++)
                    {
                        if (found[i])
                        {
                            difference.Rows.Add(table1.Rows[i]);
                        }
     
                    }

  5. #5
    Membre régulier
    Profil pro
    Inscrit en
    Janvier 2013
    Messages
    8
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Janvier 2013
    Messages : 8
    Par défaut
    en mettant la condition not equal !comparer.Equals(row1, row2), dès la première différence de row, on met false.
    Or, je voudrais mettre à false toutes les rows égalent.
    Et récuperer les lignes laissées à true pour en faire un datatable : difference.

  6. #6
    Membre Expert
    Avatar de azstar
    Homme Profil pro
    Architecte Technique BizTalk/.NET
    Inscrit en
    Juillet 2008
    Messages
    1 198
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Canada

    Informations professionnelles :
    Activité : Architecte Technique BizTalk/.NET
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2008
    Messages : 1 198
    Par défaut
    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
    23
    24
    25
    26
    27
     
     
    IEqualityComparer<DataRow> comparer = DataRowComparer.Default;
                    foreach (DataRow row1 in table1.Rows)
                    {
     
                        foreach (DataRow row2 in table2.Rows)
                        {
     
                            if (!comparer.Equals(row1, row2))
                            {
     
                                found[curRow1] = false;    
     
                            }
                            curRow1++;
                        }
     
                    }
                    for (int i = 0; i < found.Length; i++)
                    {
                        if (found[i])
                        {
                            difference.Rows.Add(table1.Rows[i]);
                        }
     
                    }

  7. #7
    Membre régulier
    Profil pro
    Inscrit en
    Janvier 2013
    Messages
    8
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Janvier 2013
    Messages : 8
    Par défaut index hors limite
    J'ai maintenant un problème d'index curRow1=1612, mais j'ai 1612 lignes ???. j'ai donc une exception !

  8. #8
    Membre régulier
    Profil pro
    Inscrit en
    Janvier 2013
    Messages
    8
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Janvier 2013
    Messages : 8
    Par défaut index de table 1 dans table 2
    l'index curRow1 s'incrémente dans table2, est ce normal ???
    j'ai essayer les deux façons (dans table1 et table2) mais toujours rien!

  9. #9
    Membre Expert
    Avatar de azstar
    Homme Profil pro
    Architecte Technique BizTalk/.NET
    Inscrit en
    Juillet 2008
    Messages
    1 198
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Canada

    Informations professionnelles :
    Activité : Architecte Technique BizTalk/.NET
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2008
    Messages : 1 198
    Par défaut
    pour comparer deux tables il faut se base sur le ID (primary Key ) du table c'est mieux

    la clé primaire de la table ??

  10. #10
    Membre régulier
    Profil pro
    Inscrit en
    Janvier 2013
    Messages
    8
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Janvier 2013
    Messages : 8
    Par défaut clé primaire
    chaque ligne est unique et la clé primaire est sur 3 colonnes :
    "table_name","column_name","data_type_name"

  11. #11
    Membre Expert
    Avatar de azstar
    Homme Profil pro
    Architecte Technique BizTalk/.NET
    Inscrit en
    Juillet 2008
    Messages
    1 198
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Canada

    Informations professionnelles :
    Activité : Architecte Technique BizTalk/.NET
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2008
    Messages : 1 198
    Par défaut
    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
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
     
       IEqualityComparer<DataRow> comparer = DataRowComparer.Default;
                foreach (DataRow row1 in table1.Rows)
                {
                   //"table_name","column_name","data_type_name"
                    bool IfoundIt = false;
                    foreach (DataRow row2 in table2.Rows)
                    {
     
                        if (row1.Field<string>("table_name") == row2.Field<string>("table_name")
                            && row1.Field<string>("column_name") == row2.Field<string>("column_name")
                            && row1.Field<string>("data_type_name") == row2.Field<string>("data_type_name"))
                        {
                            if (!comparer.Equals(row1, row2))
                            {
                                found[curRow1] = false;
                                break;
                            }
                            else
                            {
                                found[curRow1] = true;
                                break;
                            }
                            IfoundIt = true;
                        }
                    }
                    if (!IfoundIt)
                        found[curRow1] = false;///ca vx dire que je n'ai pas trouver cette ligne dans la table2
                    curRow1++;
                }
                for (int i = 0; i < found.Length; i++)
                {
                    if (found[i])
                    {
                        difference.Rows.Add(table1.Rows[i]);
                    }
     
                }

  12. #12
    Membre régulier
    Profil pro
    Inscrit en
    Janvier 2013
    Messages
    8
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Janvier 2013
    Messages : 8
    Par défaut test en ajoutant une ligne failed !
    j'ai fait un test en ajoutant une ligne supplémentaire mais la fonction ne me retourne rien (dans les deux sens).

  13. #13
    Membre extrêmement actif
    Inscrit en
    Avril 2008
    Messages
    2 573
    Détails du profil
    Informations personnelles :
    Âge : 65

    Informations forums :
    Inscription : Avril 2008
    Messages : 2 573
    Par défaut
    bonjour ouzzy

    Mauvais usage de DataRowComparer apparement .
    DataRowComparer doit etre utilise avec LINQ pour faire des comparaisons par valeurs (et non des references ce que tu fais actuellement)...
    code exemple microsoft:
    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
    23
    24
    25
    26
    27
    28
    29
    30
    31
     
    // Fill the DataSet.
    DataSet ds = new DataSet();
    ds.Locale = CultureInfo.InvariantCulture;
    FillDataSet(ds);
     
    DataTable contactTable = ds.Tables["Contact"];
     
    // Create two tables.
    IEnumerable<DataRow> query1 = from contact in contactTable.AsEnumerable()
                                  where contact.Field<string>("Title") == "Ms."
                                  select contact;
     
    IEnumerable<DataRow> query2 = from contact in contactTable.AsEnumerable()
                                  where contact.Field<string>("FirstName") == "Sandra"
                                  select contact;
     
     
    DataTable contacts1 = query1.CopyToDataTable();
    DataTable contacts2 = query2.CopyToDataTable();
     
    // Find the intersection of the two tables.
    var contacts = contacts1.AsEnumerable().Intersect(contacts2.AsEnumerable(),
                                                        DataRowComparer.Default);
     
    Console.WriteLine("Intersection of contacts tables");
    foreach (DataRow row in contacts)
    {
        Console.WriteLine("Id: {0} {1} {2} {3}",
            row["ContactID"], row["Title"], row["FirstName"], row["LastName"]);
    }
    sur le lien msdn qui suit voici ce qui est dit:

    These operators compare source elements by calling the GetHashCode and Equals methods on each collection of elements. In the case of a DataRow, these operators perform a reference comparison, which is generally not the ideal behavior for set operations over tabular data

    lien msdn:
    http://www.google.fr/url?q=http://ms..._uwNNTQq1gpWgA

    bon code....

  14. #14
    Membre Expert
    Avatar de azstar
    Homme Profil pro
    Architecte Technique BizTalk/.NET
    Inscrit en
    Juillet 2008
    Messages
    1 198
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Canada

    Informations professionnelles :
    Activité : Architecte Technique BizTalk/.NET
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2008
    Messages : 1 198
    Par défaut
    Citation Envoyé par ouzzy Voir le message
    chaque ligne est unique et la clé primaire est sur 3 colonnes :
    "table_name","column_name","data_type_name"
    a tu sûr que ce sont les noms des champs clé de votre table ?


    tu peux me donner le structure complète de la table ?

  15. #15
    Membre régulier
    Profil pro
    Inscrit en
    Janvier 2013
    Messages
    8
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Janvier 2013
    Messages : 8
    Par défaut structure de table
    c'est exactement les noms des colonnes que j'ai.
    Comme tu le vois, il s'agit de toutes les tables avec leurs noms de colonnes et types relatifs de mon schémas.

    l'id n'est pas repris dans cette sous_table des tables sys.schemas, sys.tables, sys.columns...

  16. #16
    Membre Expert
    Avatar de azstar
    Homme Profil pro
    Architecte Technique BizTalk/.NET
    Inscrit en
    Juillet 2008
    Messages
    1 198
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Canada

    Informations professionnelles :
    Activité : Architecte Technique BizTalk/.NET
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2008
    Messages : 1 198
    Par défaut
    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
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
     
     IEqualityComparer<DataRow> comparer = DataRowComparer.Default;
            int curRow1 = 0;
            foreach (DataRow row1 in table1.Rows)
            {
     
                //"table_name","column_name","data_type_name"
                string table_name = row1["table_name"].ToString();
                string column_name = row1["column_name"].ToString();
                string data_type_name = row1["data_type_name"].ToString();
     
                bool IfoundIt = false;
                foreach (DataRow row2 in table2.Rows)
                {
     
                    if (row2["table_name"].ToString() == table_name
                        && row2["column_name"].ToString() == column_name
                        && row2["data_type_name"].ToString() == data_type_name)
                    {
                        IfoundIt = true;
                        if (!comparer.Equals(row1, row2))
                        {
                            found[curRow1] = false;
                            break;
                        }
                        else
                        {
                            found[curRow1] = true;
                            break;
                        }
     
                    }
                }
                if (!IfoundIt)
                    found[curRow1] = false;///ca vx dire que je n'ai pas trouver cette ligne dans la table2
                curRow1++;
            }
            for (int i = 0; i < found.Length; i++)
            {
                if (found[i])
                {
                    difference.Rows.Add(table1.Rows[i]);
                }
     
            }
    je ne trouve pas ou mon code est ne pas bon

    Essaie de faire un débogage de code ça va t'aider a identifier le probleme

Discussions similaires

  1. [C#]Changer le "compare" d'un DataTable
    Par anitshka dans le forum C#
    Réponses: 2
    Dernier message: 27/08/2010, 16h13
  2. Problème pour Comparer 2 Datatables et mise à jour
    Par Jean-Marc68 dans le forum C#
    Réponses: 4
    Dernier message: 21/11/2007, 19h28
  3. Réponses: 4
    Dernier message: 26/07/2007, 10h49
  4. [langage] Comparer Perl avec d'autres langages comme C ?
    Par Anonymous dans le forum Langage
    Réponses: 3
    Dernier message: 10/08/2002, 23h52
  5. Comparer des fichiers de données : Quel Langage ?
    Par Anonymous dans le forum Langages de programmation
    Réponses: 6
    Dernier message: 24/04/2002, 22h37

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