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 : 28

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

    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
    Invité
    Invité(e)

    Par défaut



    Peux-t-on voir l'implémentation de ta fonction base.RemoveDuplicates ?

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

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

    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
    Invité
    Invité(e)

    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();

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

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

    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
    Invité
    Invité(e)

    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.

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

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

    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
    Invité
    Invité(e)

    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);.

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

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

    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
    Invité
    Invité(e)

    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

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

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

    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
    Invité
    Invité(e)

    Par défaut

    Alors je peux plus t'aider J'ai épuisé mes billes. Bonne chance.

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

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

    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
    Expert Confirmé
    Avatar de Kropernic
    Homme Profil pro
    Analyste / Programmeur / DBA
    Inscrit en
    juillet 2006
    Messages
    3 027
    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 : 3 027
    Points : 2 871
    Points
    2 871

    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
  •