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

Windows Forms Discussion :

[VB.NET] Pb pour la copie d'une datatable...


Sujet :

Windows Forms

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Avril 2005
    Messages
    46
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2005
    Messages : 46
    Par défaut [VB.NET] Pb pour la copie d'une datatable...
    Bonjour à tous, je souhaite copier simplement quelques colonnes d'un datatable, vers un autre datatable, afin d'en avoir un nouveau conforme à mes attentes.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
            MaTable = MaConnexion.GetOleDbSchemaTable(OleDbSchemaGuid.Columns, Restriction)
            MaConnexion.Close()
            For i = 0 To MaTable.Columns.Count - 1
     
                Select Case i
                    Case 2, 3, 6, 7, 8, 10, 11, 13, 15
                        MaTableResultat.Columns.Add(MaTable.Columns(i))
                End Select
            Next
            Return MaTableResultat
    Selement voilà, ce code ne marche pas ! Ce qui doit être normale. Mais pourquoi?
    Voici le message windows
    Column 'TABLE_NAME' already belongs to another DataTable.

    Merci pour votre aide. Si le message n'est pas clair, n'hésitez pas.
    Bisounux

  2. #2
    Membre éprouvé Avatar de graphicsxp
    Profil pro
    Inscrit en
    Avril 2004
    Messages
    758
    Détails du profil
    Informations personnelles :
    Âge : 45
    Localisation : Luxembourg

    Informations forums :
    Inscription : Avril 2004
    Messages : 758
    Par défaut
    Salut,
    Tu ne peux pas ajouter une datacolumn appartenant déjà à une datatable, à une autre datatable, d'ou le message d'erreur...

    Utilise la méthode Copy si tu veux faire une copie de ton datatable.

    @+

  3. #3
    Membre averti
    Profil pro
    Inscrit en
    Avril 2005
    Messages
    46
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2005
    Messages : 46
    Par défaut
    Le problème avec la méthode 'Copy' c'est que la copie du datatable est compléte, or, comme le montre le code, je souhaite uniquement copier les colonnes énumérées dans le 'Select Case', pour créer un autre datatable plus pertinent...

  4. #4
    Membre éclairé
    Profil pro
    Inscrit en
    Juillet 2004
    Messages
    344
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations forums :
    Inscription : Juillet 2004
    Messages : 344
    Par défaut
    Voici une proposition ...

    Conserve ton code mais modifiant la ligne de copie de colonne.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    Select Case i
       Case 2, 3, 6, 7, 8, 10, 11, 13, 15
          MaTableResultat.Columns.Add(New DataColumn( ..... ))
    End Select
    Utilise les propriétés des colonnes de table à copier comme paramètre de la nouvelle colonne.

  5. #5
    Expert confirmé
    Avatar de neguib
    Profil pro
    Inscrit en
    Mai 2005
    Messages
    3 627
    Détails du profil
    Informations personnelles :
    Âge : 65
    Localisation : Suisse

    Informations forums :
    Inscription : Mai 2005
    Messages : 3 627
    Par défaut
    Mais souhaites-tu simplement avoir un Clone de la structure ou y compris les données (Rows) :

  6. #6
    Membre éclairé
    Profil pro
    Inscrit en
    Juillet 2004
    Messages
    344
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations forums :
    Inscription : Juillet 2004
    Messages : 344
    Par défaut
    Si tu souhaites faire un clone (comme le dit neguib) il te faut faire une autre boucle insérant les lignes dans ton nouveau DataTable (utilisation de la méthode NewRow du DataTable).

  7. #7
    Expert confirmé
    Avatar de neguib
    Profil pro
    Inscrit en
    Mai 2005
    Messages
    3 627
    Détails du profil
    Informations personnelles :
    Âge : 65
    Localisation : Suisse

    Informations forums :
    Inscription : Mai 2005
    Messages : 3 627
    Par défaut
    Citation Envoyé par leSeb
    Si tu souhaites faire un clone (comme le dit neguib) il te faut faire une autre boucle insérant les lignes dans ton nouveau DataTable (utilisation de la méthode NewRow du DataTable).
    C'est pas vraiment ce dont je voulais parler
    Le clone est une simple copie de la structure sans les données justement, directement accessible par la méthode DataTable.Clone, donc au lieu d'ajouter des DataColumns, il faudra en retirer c'est tout aussi judicieux.

    Par contre s'il veut faire une copie de toutes les données exceptées certains champs, il faudra ajouter une implémentation particulière de la méthode ImportRow après avoir construit la structure des colonnes par une méthode inspirée de la tienne:
    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
     
    Private Function GetNewTable(ByVal origin As DataTable) As DataTable
     Dim columns() As Integer = New Integer(){2, 3, 6, 7, 8, 10, 11, 13, 15}
     Dim newTable As New DataTable(origin.TableName)
     Dim index As Integer
     
     For Each index In columns
       With origin.Columns(index)
         newTable.Columns.Add(New DataColumn(.ColumnName, .DataType))
       End With
     Next
     
     '...code necessaire si besoin des données
     
     Return newTable
    End Function

  8. #8
    Membre averti
    Profil pro
    Inscrit en
    Avril 2005
    Messages
    46
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2005
    Messages : 46
    Par défaut
    J'ai essayé toutes sortes de choses dont ça :
    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
    35
    36
    37
    38
    39
    40
    41
      Public Function LireTout() As DataTable
            Dim Restriction() As Object = Nothing '{Nothing, Nothing, Nothing, "TABLE"}
            Dim MaTableResultat As New DataTable("Resultat")
            Dim MesResCollection As New Collection
            Dim test As New Object()
            Dim i As Int16
            Dim j As Int16
            Dim k As Int16
     
            ConnexionBdd()
            MaTable = New DataTable("Test")
            MaTable = MaConnexion.GetOleDbSchemaTable(OleDbSchemaGuid.Columns, Restriction)
            MaConnexion.Close()
     
            MaTableResultat.Columns.Add("NomTable", Type.GetType("System.String"))
            MaTableResultat.Columns.Add("NomColonne", Type.GetType("System.String"))
            MaTableResultat.Columns.Add("PositionOrdinal", Type.GetType("System.Int32"))
            MaTableResultat.Columns.Add("ColonneDefault", Type.GetType("System.Boolean"))
            MaTableResultat.Columns.Add("ValeurDefaut", Type.GetType("System.String"))
            MaTableResultat.Columns.Add("TypeDonnee", Type.GetType("System.Int32"))
            MaTableResultat.Columns.Add("MaxiCaractere", Type.GetType("System.String"))
            MaTableResultat.NewRow()
     
            For i = 0 To MaTable.Rows.Count - 1
                k = 0
                For j = 0 To MaTable.Columns.Count - 1
                    Select Case j ' ça plante ici malgré de nombreuses tentatives...Je n'arrive pas à faire ce que je veux!
                        Case 2, 3, 6, 7, 8, 11, 13
                            MesResCollection.Add(MaTable.Rows(i).Item(j))
                            k = k + 1
                    End Select
                Next
     
                MaTableResultat.Rows.Add(test).
     
            Next
     
     
            Return MaTableResultat
     
        End Function
    Bref, je vais m'empresser de faire ça avec ton code neguid. J'espère que ça va marcher. Ca commence à m'énerver alors que c'est plutôt simple...
    Merci. Je vous tiens au courant.

  9. #9
    Expert confirmé
    Avatar de neguib
    Profil pro
    Inscrit en
    Mai 2005
    Messages
    3 627
    Détails du profil
    Informations personnelles :
    Âge : 65
    Localisation : Suisse

    Informations forums :
    Inscription : Mai 2005
    Messages : 3 627
    Par défaut
    Citation Envoyé par bisounux
    Ca commence à m'énerver alors que c'est plutôt simple....
    Hmm à la condition d'avoir écrit son algorithme, et d'avoir choisit le bon

  10. #10
    Membre averti
    Profil pro
    Inscrit en
    Avril 2005
    Messages
    46
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2005
    Messages : 46
    Par défaut
    Le problème c'est que la méthode 'Columns.Add' n'ajoute que les colonnes ce qui est déjà bien. D'ailleurs merci beaucoup... Mais le problème est d'ajouté la 'Row' de la même manière dans les nouvelles colonnes. Exemple :
    MonAncienDataTable :
    Colonne1 Col2 Col3 Col4 Col 5
    Item1 Rien Item2 Rien Item3
    MonNouveauDataTable :
    Colonne1 Col3 Col5
    Item1 Item2 Item3

    En effet, j'essaye de créer soit un DataRow, soit un Objet pour pouvoir utiliser la méthode 'MaTableResultat.Rows.Add'. Mais dès lors que j'essaye de construire un tableau d'objet ça plante :
    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
     Dim MonTableauObjetTemps As New Object ()
     
            For i = 0 To MaTable.Rows.Count - 1 'Ca boucle autant de fois que le nombre de ligne contenu dans l'ancienne table
                k = 0 'Initialisation de k, un compteur pour le tableau d'objets
                For j = 0 To MaTable.Columns.Count - 1 'Ca boucle autant de fois que le nombre de colonne dans l'ancienne table
                    Select Case j 'On choisit uniquement les colonnes qui nous interresse
                        Case 2, 3, 6, 7, 8, 11, 13 'C'est à dire le Case
                            MonTableauObjetTemps(k) = MaTable.Rows(i).Item(j) 'On entre dans un tableau d'objet l'item de la ligne i et de la colonne j, ça plante ici
                            k = k + 1 'on incrémente la valeur pour le tableau d'objet
                    End Select
                Next 'Donc on boucle que sur un ligne i et on choisit la colonne j
                ' Dès que c'est fini...
                MaTableResultat.Rows.Add(MonTableauObjetTemps) 'On ajoute le tableau d'objet à la nouvelle table pour construire la row
                MonTableauObjetTemps = Nothing 'on initialise le tableau d'objet...
     
            Next 'Une ligne de la nouvelle table a été rajoutée, on passe à la suivante.....
    Mon prolème réside essentiellement dans la déclaration d'objet intermédiaire (comme un tableau d'objet, un datarow, un datarowcollection), à chaque fois ou presque une 'Null Reference Exception' apparait.... Dans ma tête (surement petite il faut le croire), le tableau d'ojet serait l'équivalent de {Row(1).Item(2),Row(1).Item(3),Row(1).Item(5),...}
    Voila

  11. #11
    Membre averti
    Profil pro
    Inscrit en
    Avril 2005
    Messages
    46
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2005
    Messages : 46
    Par défaut
    Dans l'algo précédent :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    Case 2, 3, 6, 7, 8, 11, 13 'C'est à dire le Case 
                            MonTableauObjetTemps(k) = MaTable.Rows(i).Item(j) 'On entre dans un tableau d'objet l'item de la ligne i et de la colonne j, ça plante ici
    j'ai une erreur de ce type là :
    No default member found for type 'Object'.
    c'est une missing member exception....

  12. #12
    Expert confirmé
    Avatar de neguib
    Profil pro
    Inscrit en
    Mai 2005
    Messages
    3 627
    Détails du profil
    Informations personnelles :
    Âge : 65
    Localisation : Suisse

    Informations forums :
    Inscription : Mai 2005
    Messages : 3 627
    Par défaut
    Arf
    reprenons mon code precedent et complétons donc
    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
     
    Private Function GetNewTable(ByVal origin As DataTable) As DataTable 
     Dim columns() As Integer = New Integer(){2, 3, 6, 7, 8, 10, 11, 13, 15} 
     Dim newTable As New DataTable(origin.TableName) 
     Dim index As Integer 
     
     For Each index In columns 
       With origin.Columns(index) 
         newTable.Columns.Add(New DataColumn(.ColumnName, .DataType)) 
       End With 
     Next 
     
     'code necessaire si besoin des données
     Dim baseRow As DataRow
     Dim dr As DataRow
     Dim colonne As Integer
     
     For Each baseRow In origin.Rows
        dr = newTable.NewRow()
        colonne = 0
        For Each index In columns
          dr(colonne) = baseRow(index)
          colonne += 1
        Next
        newTable.Rows.Add(dr)
     Next
     Return newTable 
    End Function

  13. #13
    Membre averti
    Profil pro
    Inscrit en
    Avril 2005
    Messages
    46
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2005
    Messages : 46
    Par défaut
    Comment dire..... vu comme ça..... MERCI MERCI MERCI
    Victoire Franchement merci
    Bisounux.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. une fonction pour le bgcolor dans une datatable
    Par ghnawfal dans le forum JSF
    Réponses: 2
    Dernier message: 09/04/2008, 13h33
  2. [VB.Net] Timer pour fermer et ouvrir une form
    Par badnane2 dans le forum Windows Forms
    Réponses: 4
    Dernier message: 09/08/2006, 13h09
  3. [VB.NET] DataValueField avec 2 colonnes d'une datatable
    Par franculo_caoulene dans le forum ASP.NET
    Réponses: 2
    Dernier message: 20/02/2006, 17h00
  4. [VB.NET] Problème pour alimenter une listbox.
    Par gueguen23 dans le forum Windows Forms
    Réponses: 6
    Dernier message: 17/01/2005, 14h05
  5. [VB.NET] Copie d'une table d'une DB vers une autre
    Par SergeF dans le forum Windows Forms
    Réponses: 9
    Dernier message: 20/11/2004, 09h54

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