Publicité
+ Répondre à la discussion
Affichage des résultats 1 à 14 sur 14
  1. #1
    Candidat au titre de Membre du Club
    Inscrit en
    avril 2008
    Messages
    96
    Détails du profil
    Informations personnelles :
    Âge : 27

    Informations forums :
    Inscription : avril 2008
    Messages : 96
    Points : 13
    Points
    13

    Par défaut Mis a jour du table à patir de datatable

    Bonjour

    j'essaye d'éliminer les doublons dans une table dans la BD

    alors j'ai fait ce code

    Code :
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
     
     SqlDataAdapter adapter = new SqlDataAdapter(queryString, Con);
     SqlCommandBuilder cbd = new SqlCommandBuilder(adapter);
     DataTable Dtables = new DataTable();
     adapter.Fill(Dtables);
     
                  DataColumn[] keyColumns = new DataColumn[]{Dtables.Columns[field]};
     
                  Console.WriteLine("before delete dup > count =" + Dtables.Rows.Count);
     
                  base.RemoveDuplicates(Dtables, keyColumns);
     
                  Console.WriteLine("after delete dup > count =" +Dtables.Rows.Count);
     
                Dtables.AcceptChanges();
                adapter.Update(Dtables);
    la fonction duplicate fonctionne et elle modifier la datatable correctement
    mais la mise a jour vers la table ne fonctionne pas

    qu'est ce que manque dans mon code ?


    Merci d'avance

  2. #2
    Modérateur
    Avatar de h2s84
    Homme Profil pro Holty Samba SOW
    Développeur .NET
    Inscrit en
    mars 2007
    Messages
    3 000
    Détails du profil
    Informations personnelles :
    Nom : Homme Holty Samba SOW
    Âge : 29
    Localisation : Sénégal

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : mars 2007
    Messages : 3 000
    Points : 6 531
    Points
    6 531

    Par défaut



    Peux-t-on voir l'implémentation de ta fonction base.RemoveDuplicates ?
    Consultant .Net chez SoftFluent
    Découvrir notre produit CodeFluent Entities

    Adhérer à l'association Fier d'être développeur
    Les FAQ sur les technologies .Net voir ici
    Les cours et tutos sur les technologies .Net voir ici
    Les critiques sur les livres parlant des technologies .Net voir ici
    Pensez à la balise [CODE]
    Pensez au tag si votre problème est résolu

  3. #3
    Candidat au titre de Membre du Club
    Inscrit en
    avril 2008
    Messages
    96
    Détails du profil
    Informations personnelles :
    Âge : 27

    Informations forums :
    Inscription : avril 2008
    Messages : 96
    Points : 13
    Points
    13

    Par défaut

    Citation Envoyé par h2s84 Voir le message


    Peux-t-on voir l'implémentation de ta fonction base.RemoveDuplicates ?
    D'accord mais, je crois c'est pas ladans prob

    voila les fonctions :
    Code C# :
    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
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
     
     public  void RemoveDuplicates(DataTable tbl, DataColumn[] keyColumns)
            {
     
                int rowNdx = 0;
                int k = 0;
                while (rowNdx < tbl.Rows.Count - 1)
                {
     
                    DataRow[] dups = FindDups(tbl, rowNdx, keyColumns);
     
                    if (dups.Length > 0)
                    {
     
                        foreach (DataRow dup in dups)
                        {
                            k++;
                            tbl.Rows.Remove(dup);
     
                        }
     
                    }
     
                    else
                    {
     
                        rowNdx++;
     
                    }
     
                }
                Console.WriteLine("duppppp=+" + k);
            }
     
            private  DataRow[] FindDups(DataTable tbl,int sourceNdx,DataColumn[] keyColumns)
            {
     
                ArrayList retVal = new ArrayList();
     
                DataRow sourceRow = tbl.Rows[sourceNdx];
                int k = 0;
                for (int i = sourceNdx + 1; i < tbl.Rows.Count; i++)
                {
     
                    DataRow targetRow = tbl.Rows[i];
     
                    if (IsDup(sourceRow, targetRow, keyColumns))
                    {
     
                        retVal.Add(targetRow);
                        k++;
                    }
     
                }
                Console.WriteLine("duplicate = " + k);
                return (DataRow[])retVal.ToArray(typeof(DataRow));
     
            }
     
            private  bool IsDup(DataRow sourceRow,DataRow targetRow,DataColumn[] keyColumns)
            {
                int i = 0;
                bool retVal = true;
     
                foreach (DataColumn column in keyColumns)
                {
                    i++;
     
                    retVal = retVal && sourceRow[column].Equals(targetRow[column]);
     
                    if (!retVal) break;
     
                }
     
                return retVal;
     
            }

  4. #4
    Modérateur
    Avatar de h2s84
    Homme Profil pro Holty Samba SOW
    Développeur .NET
    Inscrit en
    mars 2007
    Messages
    3 000
    Détails du profil
    Informations personnelles :
    Nom : Homme Holty Samba SOW
    Âge : 29
    Localisation : Sénégal

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : mars 2007
    Messages : 3 000
    Points : 6 531
    Points
    6 531

    Par défaut

    Citation Envoyé par sayfouche Voir le message
    D'accord mais, je crois c'est pas ladans prob
    Bah la méthode Remove sur la DataRowCollection table.Rows ne modifie pas l'état de la ligne mais la retire uniquement de la collection. ADO.Net se base sur l'état des lignes pour mettre à jour, ajouter ou supprimer des données sur la base de données cible. Pour que ton code marche il faut que tu utilises la méthode Delete de la ligne elle-même qui modifiera l'état de celle-ci. En gros tu remplaces la ligne tbl.Rows.Remove(dup); par dup.Delete();
    Consultant .Net chez SoftFluent
    Découvrir notre produit CodeFluent Entities

    Adhérer à l'association Fier d'être développeur
    Les FAQ sur les technologies .Net voir ici
    Les cours et tutos sur les technologies .Net voir ici
    Les critiques sur les livres parlant des technologies .Net voir ici
    Pensez à la balise [CODE]
    Pensez au tag si votre problème est résolu

  5. #5
    Candidat au titre de Membre du Club
    Inscrit en
    avril 2008
    Messages
    96
    Détails du profil
    Informations personnelles :
    Âge : 27

    Informations forums :
    Inscription : avril 2008
    Messages : 96
    Points : 13
    Points
    13

    Par défaut

    Citation Envoyé par h2s84 Voir le message
    Bah la méthode Remove sur la DataRowCollection table.Rows ne modifie pas l'état de la ligne mais la retire uniquement de la collection. ADO.Net se base sur l'état des lignes pour mettre à jour, ajouter ou supprimer des données sur la base de données cible. Pour que ton code marche il faut que tu utilises la méthode Delete de la ligne elle-même qui modifiera l'état de celle-ci. En gros tu remplaces la ligne tbl.Rows.Remove(dup); par dup.Delete();
    D'accord !! mais si je fais ça, je peu pas terminer la recherche des dup
    il m'affiche l'exeption suivante
    Deleted row information cannot be accessed through the row.
    sur le ligne de code suivant :
    retVal = retVal && sourceRow[column].Equals(targetRow[column]); de la methode isDup()

  6. #6
    Modérateur
    Avatar de h2s84
    Homme Profil pro Holty Samba SOW
    Développeur .NET
    Inscrit en
    mars 2007
    Messages
    3 000
    Détails du profil
    Informations personnelles :
    Nom : Homme Holty Samba SOW
    Âge : 29
    Localisation : Sénégal

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : mars 2007
    Messages : 3 000
    Points : 6 531
    Points
    6 531

    Par défaut

    Alors pour faire simple, au lieu de retirer les lignes dupliquées, tu les stockes dans une collection qui te sera retourner par ta méthode base.RemoveDuplicates. Ensuite tu parcours cette collection pour faire appel à la méthode Delete de chaque DataRow dupliquée.
    Consultant .Net chez SoftFluent
    Découvrir notre produit CodeFluent Entities

    Adhérer à l'association Fier d'être développeur
    Les FAQ sur les technologies .Net voir ici
    Les cours et tutos sur les technologies .Net voir ici
    Les critiques sur les livres parlant des technologies .Net voir ici
    Pensez à la balise [CODE]
    Pensez au tag si votre problème est résolu

  7. #7
    Candidat au titre de Membre du Club
    Inscrit en
    avril 2008
    Messages
    96
    Détails du profil
    Informations personnelles :
    Âge : 27

    Informations forums :
    Inscription : avril 2008
    Messages : 96
    Points : 13
    Points
    13

    Par défaut

    Citation Envoyé par h2s84 Voir le message
    Alors pour faire simple, au lieu de retirer les lignes dupliquées, tu les stockes dans une collection qui te sera retourner par ta méthode base.RemoveDuplicates. Ensuite tu parcours cette collection pour faire appel à la méthode Delete de chaque DataRow dupliquée.
    voila le code modifié
    Code :
    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
     
     
    public  List<DataRow> RemoveDuplicates(DataTable tbl, DataColumn[] keyColumns)
            {
                List<DataRow> list = new List<DataRow>();
                int rowNdx = 0;
                int k = 0;
                while (rowNdx < tbl.Rows.Count - 1)
                {
     
                    DataRow[] dups = FindDups(tbl, rowNdx, keyColumns);
     
                    if (dups.Length > 0)
                    {
     
                        foreach (DataRow dup in dups)
                        {
                            list.add(dup);
                            tbl.Rows.Remove(dup);
     
                        }
     
                    }
     
                    else
                    {
     
                        rowNdx++;
     
                    }
     
                }
                return list;
            }
    et dans l'appel à cete fonction, je fe :

    Code :
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
     
     
    string queryString = "SELECT * FROM "+ TableName + " order by "+field +" asc";
                SqlDataAdapter adapter = new SqlDataAdapter(queryString, Con);
                SqlCommandBuilder cbd = new SqlCommandBuilder(adapter);
                DataTable Dtables = new DataTable();
                adapter.Fill(Dtables);        
     
                  DataColumn[] keyColumns =
     
                                  new DataColumn[]{Dtables.Columns[field]
                                                   };
                  Console.WriteLine("before delete dup > count =" + Dtables.Rows.Count);
                  List<DataRow> list = base.RemoveDuplicates(Dtables, keyColumns);
                  Console.WriteLine(list.Count);
                  foreach (DataRow dr in list)
                  {
                      dr.delete();
                  }
                  Console.WriteLine("after delete dup > count =" +Dtables.Rows.Count);
     
                Dtables.AcceptChanges();
                adapter.Update(Dtables);
    malgrè ça rien n'est passer dans ma table

  8. #8
    Modérateur
    Avatar de h2s84
    Homme Profil pro Holty Samba SOW
    Développeur .NET
    Inscrit en
    mars 2007
    Messages
    3 000
    Détails du profil
    Informations personnelles :
    Nom : Homme Holty Samba SOW
    Âge : 29
    Localisation : Sénégal

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : mars 2007
    Messages : 3 000
    Points : 6 531
    Points
    6 531

    Par défaut

    J'ai comme l'impression que c'est l'instruction Dtables.AcceptChanges(); qui fout la merde. Cette instruction doit être appelée une fois que la mise à jour vers la BDD est effectuée.
    Normalement tu n'as pas à effectuer l'appel à cette fonction vu qu'elle sera appelée par l'adaptateur. Si tu veux toujours l'appeler alors fais le après l'instruction adapter.Update(Dtables);.
    Consultant .Net chez SoftFluent
    Découvrir notre produit CodeFluent Entities

    Adhérer à l'association Fier d'être développeur
    Les FAQ sur les technologies .Net voir ici
    Les cours et tutos sur les technologies .Net voir ici
    Les critiques sur les livres parlant des technologies .Net voir ici
    Pensez à la balise [CODE]
    Pensez au tag si votre problème est résolu

  9. #9
    Candidat au titre de Membre du Club
    Inscrit en
    avril 2008
    Messages
    96
    Détails du profil
    Informations personnelles :
    Âge : 27

    Informations forums :
    Inscription : avril 2008
    Messages : 96
    Points : 13
    Points
    13

    Par défaut

    Citation Envoyé par h2s84 Voir le message
    J'ai comme l'impression que c'est l'instruction Dtables.AcceptChanges(); qui fout la merde. Cette instruction doit être appelée une fois que la mise à jour vers la BDD est effectuée.
    Normalement tu n'as pas à effectuer l'appel à cette fonction vu qu'elle sera appelée par l'adaptateur. Si tu veux toujours l'appeler alors fais le après l'instruction adapter.Update(Dtables);.
    Bizare !! meme si j'ai inverser l'order entre update et acceptchanges !!
    y'a rien que se change !

  10. #10
    Modérateur
    Avatar de h2s84
    Homme Profil pro Holty Samba SOW
    Développeur .NET
    Inscrit en
    mars 2007
    Messages
    3 000
    Détails du profil
    Informations personnelles :
    Nom : Homme Holty Samba SOW
    Âge : 29
    Localisation : Sénégal

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : mars 2007
    Messages : 3 000
    Points : 6 531
    Points
    6 531

    Par défaut

    Si ça ne marche pas cela veut tout simplement dire que les lignes mises à jour ne sont pas celles de la DataTable sur laquelle est appelée la méthode Update de ton adaptateur.
    En regardant l'implémentation de ta fonction FindDups tu ne récupérés pas la ligne de ta DataTable qui est sourceRow mais plutôt targetRow. Donc par la suite tu n'agis pas sur l'état de la ligne de ta DataTable mais sur la copie qui ne trouve pas dans cette même objet DataTable.
    Bref ta ligne suivante retVal.Add(targetRow); devrait être retVal.Add(sourceRow); si t'es sûr que les modifications apportées doivent s'appliquer sur le contenu de ton objet Dtables
    Consultant .Net chez SoftFluent
    Découvrir notre produit CodeFluent Entities

    Adhérer à l'association Fier d'être développeur
    Les FAQ sur les technologies .Net voir ici
    Les cours et tutos sur les technologies .Net voir ici
    Les critiques sur les livres parlant des technologies .Net voir ici
    Pensez à la balise [CODE]
    Pensez au tag si votre problème est résolu

  11. #11
    Candidat au titre de Membre du Club
    Inscrit en
    avril 2008
    Messages
    96
    Détails du profil
    Informations personnelles :
    Âge : 27

    Informations forums :
    Inscription : avril 2008
    Messages : 96
    Points : 13
    Points
    13

    Par défaut

    Citation Envoyé par h2s84 Voir le message
    Si ça ne marche pas cela veut tout simplement dire que les lignes mises à jour ne sont pas celles de la DataTable sur laquelle est appelée la méthode Update de ton adaptateur.
    En regardant l'implémentation de ta fonction FindDups tu ne récupérés pas la ligne de ta DataTable qui est sourceRow mais plutôt targetRow. Donc par la suite tu n'agis pas sur l'état de la ligne de ta DataTable mais sur la copie qui ne trouve pas dans cette même objet DataTable.
    Bref ta ligne suivante retVal.Add(targetRow); devrait être retVal.Add(sourceRow); si t'es sûr que les modifications apportées doivent s'appliquer sur le contenu de ton objet Dtables
    tout le deux source et target sont des compie et sont initialiser par l'objet tbl qui est une copie de datatable souhaité

    source c'est l'enregistrement source q'on doit pas modifier puisque c'est la 1ère
    et target contient chq fois l'enregistrement dupliqué q'on doit le supprimer
    cad source contient la 1ere ebregistrement à garder et target les autres enregistrement duliqués

  12. #12
    Modérateur
    Avatar de h2s84
    Homme Profil pro Holty Samba SOW
    Développeur .NET
    Inscrit en
    mars 2007
    Messages
    3 000
    Détails du profil
    Informations personnelles :
    Nom : Homme Holty Samba SOW
    Âge : 29
    Localisation : Sénégal

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : mars 2007
    Messages : 3 000
    Points : 6 531
    Points
    6 531

    Par défaut

    Alors je peux plus t'aider J'ai épuisé mes billes. Bonne chance.
    Consultant .Net chez SoftFluent
    Découvrir notre produit CodeFluent Entities

    Adhérer à l'association Fier d'être développeur
    Les FAQ sur les technologies .Net voir ici
    Les cours et tutos sur les technologies .Net voir ici
    Les critiques sur les livres parlant des technologies .Net voir ici
    Pensez à la balise [CODE]
    Pensez au tag si votre problème est résolu

  13. #13
    Candidat au titre de Membre du Club
    Inscrit en
    avril 2008
    Messages
    96
    Détails du profil
    Informations personnelles :
    Âge : 27

    Informations forums :
    Inscription : avril 2008
    Messages : 96
    Points : 13
    Points
    13

    Par défaut

    Citation Envoyé par h2s84 Voir le message
    Alors je peux plus t'aider J'ai épuisé mes billes. Bonne chance.
    Merci pour l'aide

  14. #14
    Membre Expert
    Avatar de Kropernic
    Homme Profil pro
    Analyste / Programmeur / DBA
    Inscrit en
    juillet 2006
    Messages
    2 641
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 31
    Localisation : Belgique

    Informations professionnelles :
    Activité : Analyste / Programmeur / DBA
    Secteur : Distribution

    Informations forums :
    Inscription : juillet 2006
    Messages : 2 641
    Points : 2 477
    Points
    2 477

    Par défaut

    Apparemment, tu travailles sur base de type sql server.

    A moins d'être vraiment obliger de faire cela par code dans le cadre d'une application (mais pourquoi créerait-elle des doublons en premier lieu dans ce cas 0_0), pourquoi ne pas le faire directement en sql ?

    Si c'est envisageable, voilà un article détaillé sur la manière de procédé : http://sqlpro.developpez.com/cours/doublons/
    Kropernic (anciennement Griftou).

Liens sociaux

Règles de messages

  • Vous ne pouvez pas créer de nouvelles discussions
  • Vous ne pouvez pas envoyer des réponses
  • Vous ne pouvez pas envoyer des pièces jointes
  • Vous ne pouvez pas modifier vos messages
  •