Précédent   Forum du club des développeurs et IT Pro > Dotnet > Accès aux données > ADO.NET
ADO.NET Forum d'entraide sur le développement avec les services d'accès aux données disponibles avec ADO.NET.
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse
 
Outils de la discussion
Publicité
'
Vieux 16/04/2012, 12h27   #1
sayfouche
Futur Membre du Club
 
Inscription : avril 2008
Messages : 96
Détails du profil
Informations personnelles :
Âge : 26

Informations forums :
Inscription : avril 2008
Messages : 96
Points : 16
Points : 16
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
sayfouche est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 16/04/2012, 16h26   #2
h2s84
Modérateur
 
Avatar de h2s84
 
Homme Holty Samba SOW
Développeur .NET
Inscription : mars 2007
Messages : 2 748
Détails du profil
Informations personnelles :
Nom : Homme Holty Samba SOW
Âge : 28
Localisation : Sénégal

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

Informations forums :
Inscription : mars 2007
Messages : 2 748
Points : 5 196
Points : 5 196
Envoyer un message via MSN à h2s84 Envoyer un message via Skype™ à h2s84


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 FAQs 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
h2s84 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 16/04/2012, 16h57   #3
sayfouche
Futur Membre du Club
 
Inscription : avril 2008
Messages : 96
Détails du profil
Informations personnelles :
Âge : 26

Informations forums :
Inscription : avril 2008
Messages : 96
Points : 16
Points : 16
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;
 
        }
sayfouche est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 16/04/2012, 17h07   #4
h2s84
Modérateur
 
Avatar de h2s84
 
Homme Holty Samba SOW
Développeur .NET
Inscription : mars 2007
Messages : 2 748
Détails du profil
Informations personnelles :
Nom : Homme Holty Samba SOW
Âge : 28
Localisation : Sénégal

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

Informations forums :
Inscription : mars 2007
Messages : 2 748
Points : 5 196
Points : 5 196
Envoyer un message via MSN à h2s84 Envoyer un message via Skype™ à h2s84
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 FAQs 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
h2s84 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 16/04/2012, 17h34   #5
sayfouche
Futur Membre du Club
 
Inscription : avril 2008
Messages : 96
Détails du profil
Informations personnelles :
Âge : 26

Informations forums :
Inscription : avril 2008
Messages : 96
Points : 16
Points : 16
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
Citation:
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()
sayfouche est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 16/04/2012, 17h41   #6
h2s84
Modérateur
 
Avatar de h2s84
 
Homme Holty Samba SOW
Développeur .NET
Inscription : mars 2007
Messages : 2 748
Détails du profil
Informations personnelles :
Nom : Homme Holty Samba SOW
Âge : 28
Localisation : Sénégal

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

Informations forums :
Inscription : mars 2007
Messages : 2 748
Points : 5 196
Points : 5 196
Envoyer un message via MSN à h2s84 Envoyer un message via Skype™ à h2s84
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 FAQs 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
h2s84 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 17/04/2012, 10h28   #7
sayfouche
Futur Membre du Club
 
Inscription : avril 2008
Messages : 96
Détails du profil
Informations personnelles :
Âge : 26

Informations forums :
Inscription : avril 2008
Messages : 96
Points : 16
Points : 16
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
sayfouche est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 17/04/2012, 10h38   #8
h2s84
Modérateur
 
Avatar de h2s84
 
Homme Holty Samba SOW
Développeur .NET
Inscription : mars 2007
Messages : 2 748
Détails du profil
Informations personnelles :
Nom : Homme Holty Samba SOW
Âge : 28
Localisation : Sénégal

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

Informations forums :
Inscription : mars 2007
Messages : 2 748
Points : 5 196
Points : 5 196
Envoyer un message via MSN à h2s84 Envoyer un message via Skype™ à h2s84
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 FAQs 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
h2s84 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 17/04/2012, 11h56   #9
sayfouche
Futur Membre du Club
 
Inscription : avril 2008
Messages : 96
Détails du profil
Informations personnelles :
Âge : 26

Informations forums :
Inscription : avril 2008
Messages : 96
Points : 16
Points : 16
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 !
sayfouche est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 17/04/2012, 12h10   #10
h2s84
Modérateur
 
Avatar de h2s84
 
Homme Holty Samba SOW
Développeur .NET
Inscription : mars 2007
Messages : 2 748
Détails du profil
Informations personnelles :
Nom : Homme Holty Samba SOW
Âge : 28
Localisation : Sénégal

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

Informations forums :
Inscription : mars 2007
Messages : 2 748
Points : 5 196
Points : 5 196
Envoyer un message via MSN à h2s84 Envoyer un message via Skype™ à h2s84
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 FAQs 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
h2s84 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 17/04/2012, 12h50   #11
sayfouche
Futur Membre du Club
 
Inscription : avril 2008
Messages : 96
Détails du profil
Informations personnelles :
Âge : 26

Informations forums :
Inscription : avril 2008
Messages : 96
Points : 16
Points : 16
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
sayfouche est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 17/04/2012, 13h28   #12
h2s84
Modérateur
 
Avatar de h2s84
 
Homme Holty Samba SOW
Développeur .NET
Inscription : mars 2007
Messages : 2 748
Détails du profil
Informations personnelles :
Nom : Homme Holty Samba SOW
Âge : 28
Localisation : Sénégal

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

Informations forums :
Inscription : mars 2007
Messages : 2 748
Points : 5 196
Points : 5 196
Envoyer un message via MSN à h2s84 Envoyer un message via Skype™ à h2s84
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 FAQs 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
h2s84 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 17/04/2012, 13h43   #13
sayfouche
Futur Membre du Club
 
Inscription : avril 2008
Messages : 96
Détails du profil
Informations personnelles :
Âge : 26

Informations forums :
Inscription : avril 2008
Messages : 96
Points : 16
Points : 16
Citation:
Envoyé par h2s84 Voir le message
Alors je peux plus t'aider J'ai épuisé mes billes. Bonne chance.
Merci pour l'aide
sayfouche est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 24/04/2012, 14h17   #14
Kropernic
Membre Expert
 
Avatar de Kropernic
 
Homme
Analyste / Programmeur / DBA
Inscription : juillet 2006
Messages : 1 935
Détails du profil
Informations personnelles :
Sexe : Homme
Âge : 30
Localisation : Belgique

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

Informations forums :
Inscription : juillet 2006
Messages : 1 935
Points : 1 470
Points : 1 470
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).
Kropernic est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse
Outils de la discussion

Navigation rapide


Fuseau horaire GMT +2. Il est actuellement 17h28.


 
 
 
 
Partenaires

Hébergement Web