Précédent   Forum du club des développeurs et IT Pro > Dotnet > Accès aux données
Accès aux données Forum d'entraide sur les technologies d'accès aux données de Microsoft (ADO.NET, Linq, Entity Framework, etc.).
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 06/06/2006, 17h42   #1
YLF
Invité régulier
 
Inscription : février 2006
Messages : 13
Détails du profil
Informations forums :
Inscription : février 2006
Messages : 13
Points : 5
Points : 5
Par défaut [VB.Net] Comment copier une DataRow d'une table vers une autre ?

Bonjour à tous,
mon problème est le suivant :
Suite l'utilisation de l'objet Select sur la table d'une dataset,j'obtiens une array de datarow.
J'aimerais pouvoir copier chacune de ces datarow dans une autre table dans le but de réutiliser l'objet select sur cette nouvelle table.
Dans un premier temps,j'ai essayé d'insérer les row en utilisant DS.Table("NewTable").Add(DataRow)
mais le message d'erreur suivant apparait "This row already belongs to another table". Ce problème s'explique surement par le fait que les rows pointent sur la table initiale.
Dans un second temps,j'ai tenté de copier l'array de DataRow mais le même problème apparait.
Enfin j'aurais aimé faire une copie directe des row mais je n'y suis pas parvenu..
Alors si vous avez des idées...Merci d'avance
++
YLF est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 06/06/2006, 17h53   #2
m-mas
Membre chevronné
 
Avatar de m-mas
 
Homme
Inscription : février 2003
Messages : 550
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : Tunisie

Informations forums :
Inscription : février 2003
Messages : 550
Points : 663
Points : 663
la logique pour copier les datarow me parait correcte !!
Est ce que tu peux nous mettre tous le code que tu utilises pour copier les datarow ?
__________________
mon blog informatique http://m-mas.blogspot.com/

MCP VB.NET (70-305) - (70-306) - (70-310)
m-mas est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 06/06/2006, 18h00   #3
YLF
Invité régulier
 
Inscription : février 2006
Messages : 13
Détails du profil
Informations forums :
Inscription : février 2006
Messages : 13
Points : 5
Points : 5
Par défaut Code utilisé

Voici le code qui réalise la copie de l' Array
j'ai laissé le code utilisé pour les autres méthodes
j'espère que ce seras suffisament lisible...

Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
 
Dim ArraySize As Integer
Dim TestName As String
For i = 1 To NumberOfTable
 DS.Tables.Add(TablesArray(0, i - 1) & "_Bis")
 'DS.Tables.AddRange(TablesArray(4, (i - 1)))
 TestName = TablesArray(0, i - 1) & "_Bis"
 ArraySize = TablesArray(4, i - 1).Length
 Dim TempArray(ArraySize) As Object
 Array.Copy(TablesArray(4, (i - 1)), TempArray, TablesArray(4, (i -
 1)).Length)
 'TempArray = TablesArray(4, (i - 1))
 'For Each Row In TablesArray(4, (i - 1))
 For Each Row In TempArray
     Dim RowBis As Data.DataRow
     'RowBis = Row.Copy
     DS.Tables(TestName).Rows.Add(Row)
 Next
Next i
YLF est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 06/06/2006, 18h14   #4
m-mas
Membre chevronné
 
Avatar de m-mas
 
Homme
Inscription : février 2003
Messages : 550
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : Tunisie

Informations forums :
Inscription : février 2003
Messages : 550
Points : 663
Points : 663
je n'ai pas trés bien compris le code et ta question !!
si j'ai bien compris, tu as une collection de Row issue d'une commande Select dans un DataSet, tu veux copier le résultat de ce Select dans une DataTable !!

Pour moi, cela mérite 3 lignes de codes !! soit MyArrayRow ta collection de Row récupéré :
Code :
1
2
3
4
5
 
 Dim DT As New DataTable
        For Each DR As DataRow In MyArrayRow
            DT.Rows.Add(DR)
        Next
mais bon on est en fin de journée, c'est peut être moi
__________________
mon blog informatique http://m-mas.blogspot.com/

MCP VB.NET (70-305) - (70-306) - (70-310)
m-mas est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 06/06/2006, 18h29   #5
YLF
Invité régulier
 
Inscription : février 2006
Messages : 13
Détails du profil
Informations forums :
Inscription : février 2006
Messages : 13
Points : 5
Points : 5
les Array Contenant les datarow sont définis ainsi:

Code :
TablesArray(4, i) = DS.Tables(TablesArray(0, i)).Select(CurrentFilter)
Et j'ai testé le code conseillé :

Code :
1
2
3
4
5
6
For i = 1 To NumberOfTable
                Dim DT As New DataTable
                For Each DR As DataRow In TablesArray(4, i - 1)
                    DT.Rows.Add(DR)
                Next
            Next
Le message d'erreur suivant apparait :


Citation:
An unhandled exception of type 'System.ArgumentException' occurred in system.data.dll

Additional information: This row already belongs to another table.

je ne sais pas où est l'erreur.
Et désolé si je suis confu
YLF est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 07/06/2006, 10h29   #6
joefou
Membre habitué
 
Avatar de joefou
 
Inscription : février 2005
Messages : 239
Détails du profil
Informations personnelles :
Âge : 35

Informations forums :
Inscription : février 2005
Messages : 239
Points : 136
Points : 136
J'avais eut ce genre de problème, ou il me fallait copier quelques lignes d'une table vers une autre, qui devait avoir la même structure.
Essaye une copie item par item de chacune des DataRow de cette façon:

Code :
1
2
3
4
5
6
7
8
9
10
11
 
 
                BonsATraiter = SourceEtat.Bon.Clone()
                For Each Ligne In SourceEtat.Bon.Rows
                    NouvelleLigne = BonsATraiter.NewBonRow
                    'copie de chaque élément
                    For I = 0 To SourceEtat.Bon.Columns.Count() - 1
                        NouvelleLigne.Item(I) = Ligne.Item(I)
                    Next I
                    BonsATraiter.Rows.Add(NouvelleLigne)
                Next
SourceEtat.Bon est ma table source,
BonsATraiter est ma DataTable de destination,
En gros je créé une nouvelle ligne avec NewRow pour avoir le bon format de ligne (NewBonRow pour moi à cause d'un dataset typé ; mais le principe général y est), ensuite je rempli item par item, puis j'ajoute à ma table destination la nouvelle ligne remplie par un Rows.Add().
joefou est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 07/06/2006, 10h40   #7
YLF
Invité régulier
 
Inscription : février 2006
Messages : 13
Détails du profil
Informations forums :
Inscription : février 2006
Messages : 13
Points : 5
Points : 5
La copie Item par Item marche très bien.
Merci pour cette aide
++
YLF est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 05/09/2012, 23h23   #8
claudetom
Invité de passage
 
Homme Claude Thomas
Développeur .NET
Inscription : mars 2003
Messages : 5
Détails du profil
Informations personnelles :
Nom : Homme Claude Thomas
Localisation : France, Val d'Oise (Île de France)

Informations professionnelles :
Activité : Développeur .NET
Secteur : Distribution

Informations forums :
Inscription : mars 2003
Messages : 5
Points : 2
Points : 2
Envoyer un message via MSN à claudetom Envoyer un message via Yahoo à claudetom
Je confirme que pour la copie d'une datarow d'une dataSource vers une table cible, il faut passez par un Clone de l'objet Datatable sur un nouvelle objet et ensuite faire la copie item par item dans une nouvelle row de la table cible !
- Item par item car cela évite tout problème si les structures de dataSource <> dataCible
- Clone sur un nouvelle object tout simplement car de cette manière cela créer une copie complètement indépendante.
Essayé seulement la copie item par item, la copie va se faire mais si vous décidez de supprimer en suite la dataSouce (la ligne row) par l'instruction sur l'objet .delete, vous aurez un beau message qui indiquera que cette action ne peut être faite car cette ligne appartient à une autre table.
claudetom est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Cette discussion est résolue.
Outils de la discussion

Navigation rapide


Fuseau horaire GMT +2. Il est actuellement 15h02.


 
 
 
 
Partenaires

Hébergement Web