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

ADO.NET Discussion :

Mis a jour du table à patir de datatable


Sujet :

ADO.NET

  1. #1
    Membre du Club
    Inscrit en
    Avril 2008
    Messages
    96
    Détails du profil
    Informations personnelles :
    Âge : 37

    Informations forums :
    Inscription : Avril 2008
    Messages : 96
    Points : 44
    Points
    44
    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 : 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
     
     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
    Membre du Club
    Inscrit en
    Avril 2008
    Messages
    96
    Détails du profil
    Informations personnelles :
    Âge : 37

    Informations forums :
    Inscription : Avril 2008
    Messages : 96
    Points : 44
    Points
    44
    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# : 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
    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
    Membre du Club
    Inscrit en
    Avril 2008
    Messages
    96
    Détails du profil
    Informations personnelles :
    Âge : 37

    Informations forums :
    Inscription : Avril 2008
    Messages : 96
    Points : 44
    Points
    44
    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
    Membre du Club
    Inscrit en
    Avril 2008
    Messages
    96
    Détails du profil
    Informations personnelles :
    Âge : 37

    Informations forums :
    Inscription : Avril 2008
    Messages : 96
    Points : 44
    Points
    44
    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 : 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
     
     
    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 : 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
     
     
    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
    Membre du Club
    Inscrit en
    Avril 2008
    Messages
    96
    Détails du profil
    Informations personnelles :
    Âge : 37

    Informations forums :
    Inscription : Avril 2008
    Messages : 96
    Points : 44
    Points
    44
    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
    Membre du Club
    Inscrit en
    Avril 2008
    Messages
    96
    Détails du profil
    Informations personnelles :
    Âge : 37

    Informations forums :
    Inscription : Avril 2008
    Messages : 96
    Points : 44
    Points
    44
    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
    Membre du Club
    Inscrit en
    Avril 2008
    Messages
    96
    Détails du profil
    Informations personnelles :
    Âge : 37

    Informations forums :
    Inscription : Avril 2008
    Messages : 96
    Points : 44
    Points
    44
    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 932
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : Belgique

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

    Informations forums :
    Inscription : Juillet 2006
    Messages : 3 932
    Points : 4 239
    Points
    4 239
    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

Discussions similaires

  1. Réponses: 0
    Dernier message: 24/09/2013, 15h30
  2. h:datatable non mis a jour
    Par pepero dans le forum JSF
    Réponses: 10
    Dernier message: 27/06/2011, 12h28
  3. mis à jour des tables access avec un dossier excel
    Par sweetty dans le forum Modélisation
    Réponses: 1
    Dernier message: 12/07/2007, 11h34
  4. Réponses: 10
    Dernier message: 24/08/2006, 20h52
  5. Mise à jour de table impossible après requête avec jointure
    Par sto dans le forum Bases de données
    Réponses: 5
    Dernier message: 17/03/2004, 14h24

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