none
Stocker une valeur dans une variable issue d'une List Of d'une Structure elle même issue d'une Structure RRS feed

  • Question

  • Bonjour,

    J'ai 1 bug.

    Je cherche à stocker une valeur dans une variable issue d'une List Of d'une Structure elle même issue d'une Structure.

    Pour ne pas partir dans de grandes explications, je vous copie ci-dessous 1 partie des 2 classes concernées. (Difficile également de pourvoir tester le code ci-dessous sans ajouter d'autres classes utilisées dans le code et sans 1 base de données)

    Le bug est noté en commentaire.

    Je vous remercie d'avance pour votre aide.

    Stéphane


    Public Class Classe_BDD

        Structure Structure_Table

            Dim Nom As String

            Dim NuméroAuto As Structure_Champs

            Dim Champs As List(Of Structure_Champs)

        End Structure

        Structure Structure_Champs

            Dim Nom As String

            Dim Valeur As String

            Dim Défaut As String

        End Structure

        '...

    End Class

    Public Class Classe_Client

        Private Table As Structure_Table

        Sub New(numero_auto_client As Integer)

            init()

            Charge_client(numero_auto_client)

        End Sub

        Sub init()

            Dim Champ As Structure_Champs

            table = New Structure_Table

            With table

                .Nom = "clients"

                .NuméroAuto = New Structure_Champs

                .NuméroAuto.Nom = "numero_auto_client"

                .Champs = New List(Of Structure_Champs)

                Champ = New Structure_Champs

                Champ.Nom = "societe"

                Champ.Défaut = ""

                .Champs.Add(Champ)

                Champ = New Structure_Champs

                Champ.Nom = "adresse_siege_social"

                Champ.Défaut = ""

                .Champs.Add(Champ)

            End With

        End Sub

        Sub Charge_client(numero_auto_client As Integer)

            NuméroAuto = numero_auto_client

            Try

                Dim sdr As MySqlDataReader = bdd.ExecuteReader("select * from " & Table.Nom & " where " & Table.NuméroAuto.Nom & " = " & NuméroAuto)

                With sdr

                    If .Read Then

                        For Each Champ As Structure_Champs In Table.Champs

                            Try

                                Champ.Valeur = .Item(Champ.Nom).ToString 'bug : champ.valeur obtient bien la donnée stockée dans la base de données, mais l'occurence concernée dans table.champs n'est pas modifiée (Champ semble être géré comme ByVal alors que je cherche à gérer comme ByRef)

                            Catch ex As Exception

                                Champ.Valeur = Champ.Défaut

                            End Try

                        Next

                    End If

                    .Close()

                End With

            Catch ex As Exception

            End Try

        End Sub

        '...

    End Class

    mercredi 6 mars 2013 14:33

Réponses

  • Bonjour,

    Qu'est ce que cela donne si on change la structure en classe ? (une structure est un type "valeur", une classe est un type "référence"). Ou alors remettez la structure copiée dans la liste (actuellement l'assignation de l'entrée de liste en cours à la variable Champ via la boucle foreach va faire une *copie* de la valeur et c'est cette copie que l'on modifie, la valeur stockée dans la liste reste donc inchangée).

    Accessoirement, un catch vide est sans doute une mauvaise idée. Si vous voulez vraiment ignorer des erreurs essayer de n'ignorer que les erreurs voulues en indiquant un type d'exception le plus précis possible plutôt que Exception.

    Selon ce que vous cherchez à faire "EntityFramework" pourrait vous être utile (le but est d'exposer les données de la base sous forme d'objets .NET).


    Please always mark whatever response solved your issue so that the thread is properly marked as "Answered".

    • Marqué comme réponse Stéphane2009 mercredi 6 mars 2013 15:57
    mercredi 6 mars 2013 15:25
    Modérateur
  • Bonjour,

    Qu'est ce que cela donne si on change la structure en classe ? (une structure est un type "valeur", une classe est un type "référence"). Ou alors remettez la structure copiée dans la liste (actuellement l'assignation de l'entrée de liste en cours à la variable Champ via la boucle foreach va faire une *copie* de la valeur et c'est cette copie que l'on modifie, la valeur stockée dans la liste reste donc inchangée).

    Accessoirement, un catch vide est sans doute une mauvaise idée. Si vous voulez vraiment ignorer des erreurs essayer de n'ignorer que les erreurs voulues en indiquant un type d'exception le plus précis possible plutôt que Exception.

    Selon ce que vous cherchez à faire "EntityFramework" pourrait vous être utile (le but est d'exposer les données de la base sous forme d'objets .NET).


    Please always mark whatever response solved your issue so that the thread is properly marked as "Answered".

    Merci Patrice.

    A mon avis, en Classe_Table comme vous me le proposez, le problème devrait être résolu.

    C'est noté pour le catch vide, merci.

    Je vais regarder aussi du côté EntityFramework que je ne connais pas du tout.

    Sinon, pour information, j'ai également réussi  à résoudre mon problème ainsi :

                        For i As Integer = 0 To Table.Champs.Count - 1
    
                            Dim Champ As Structure_Champs = Table.Champs(i)
    
                            Try
                                Champ.Valeur = .Item(Champ.Nom).ToString
    
                            Catch ex As Exception
                                Champ.Valeur = Champ.Défaut
    
                            End Try
    
                            Table.Champs(i) = Champ
    
                        Next
    

    J'ai donc supprimé le For each en le remplaçant par 1 For

    Et je réassigne l’occurrence concernée par l'élément modifié.

    • Marqué comme réponse Stéphane2009 mercredi 6 mars 2013 15:57
    mercredi 6 mars 2013 15:56

Toutes les réponses

  • Bonjour,

    Qu'est ce que cela donne si on change la structure en classe ? (une structure est un type "valeur", une classe est un type "référence"). Ou alors remettez la structure copiée dans la liste (actuellement l'assignation de l'entrée de liste en cours à la variable Champ via la boucle foreach va faire une *copie* de la valeur et c'est cette copie que l'on modifie, la valeur stockée dans la liste reste donc inchangée).

    Accessoirement, un catch vide est sans doute une mauvaise idée. Si vous voulez vraiment ignorer des erreurs essayer de n'ignorer que les erreurs voulues en indiquant un type d'exception le plus précis possible plutôt que Exception.

    Selon ce que vous cherchez à faire "EntityFramework" pourrait vous être utile (le but est d'exposer les données de la base sous forme d'objets .NET).


    Please always mark whatever response solved your issue so that the thread is properly marked as "Answered".

    • Marqué comme réponse Stéphane2009 mercredi 6 mars 2013 15:57
    mercredi 6 mars 2013 15:25
    Modérateur
  • J'ai fait 1 procédure de test beaucoup plus simple.

    Les tests 1 à 3 concernent 1 liste de type String : les tests 1 et 2 ne modifient pas la liste mais le test 3 modifie bien la liste comme je souhaite mais hélas, je veux 1 liste de type Structure.

    Les tests 4 à 6 concernent 1 liste de type Structure et fonctionnent comme les tests 1 à 3 : les tests 4 et 5 ne modifient pas la liste et le test 6 génère 1 erreur de syntaxe.

    Je vous remercie d'avance pour votre aide.

    Stéphane

        Private Sub TestsToolStripMenuItem1_Click(sender As System.Object, e As System.EventArgs) Handles TestsToolStripMenuItem1.Click
    
            'nouveau test
    
            Dim liste As New List(Of String)
            Dim donnée As String
    
            donnée = "a"
            liste.Add(donnée)
    
            donnée = "b"
            liste.Add(donnée)
    
            donnée = "c"
            liste.Add(donnée)
    
            MsgBox("init")
    
            For Each donnée In liste
    
                MsgBox(donnée)
    
            Next
    
            For Each donnée In liste
    
                donnée = donnée.ToUpper
    
            Next
    
            MsgBox("test 1 : for each => La liste n'est pas modifiée")
    
            For Each donnée In liste
    
                MsgBox(donnée)
    
            Next
    
            For i As Integer = 0 To liste.Count - 1
    
                donnée = liste.Item(i).ToUpper
    
            Next
    
            MsgBox("test 2 : for => La liste n'est pas modifiée")
    
            For Each donnée In liste
    
                MsgBox(donnée)
    
            Next
    
            For i As Integer = 0 To liste.Count - 1
    
                liste.Item(i) = liste.Item(i).ToUpper
    
            Next
    
            MsgBox("test 3 OK : for => La liste est modifiée")
    
            For Each donnée In liste
    
                MsgBox(donnée)
    
            Next
    
            Dim liste2 As New List(Of structure_test)
            Dim donnée2 As structure_test
    
            donnée2 = New structure_test
            donnée2.donnée = "a"
            liste2.Add(donnée2)
            
            donnée2 = New structure_test
            donnée2.donnée = "b"
            liste2.Add(donnée2)
    
            donnée2 = New structure_test
            donnée2.donnée = "c"
            liste2.Add(donnée2)
    
            MsgBox("init")
    
            For Each donnée2 In liste2
    
                MsgBox(donnée2.donnée)
    
            Next
    
            For Each donnée2 In liste2
    
                donnée = donnée.ToUpper
    
            Next
    
            MsgBox("test 4 : for each => La liste n'est pas modifiée")
    
            For Each donnée2 In liste2
    
                MsgBox(donnée2.donnée)
    
            Next
    
            For i As Integer = 0 To liste2.Count - 1
    
                donnée2.donnée = liste2(i).donnée.ToUpper
    
            Next
    
            MsgBox("test 5 : for => La liste n'est pas modifiée")
    
            For Each donnée2 In liste2
    
                MsgBox(donnée2.donnée)
    
            Next
    
            For i As Integer = 0 To liste2.Count - 1
    
                'liste2(i).donnée = liste2(i).donnée.ToUpper
    
            Next
    
            MsgBox("test 6 impossible : for")
    
            For Each donnée2 In liste2
    
                MsgBox(donnée2.donnée)
    
            Next
    
        End Sub
    
        Structure structure_test
    
            Dim donnée As String
    
        End Structure
    

    les tests 1 à 3 concernent 1 liste de type String : les tests 1 et 2 ne modifie pas la liste mais le test 3 modifie bien la liste comme je souhaite mais hélas, je veux 1 liste de type Structure
    mercredi 6 mars 2013 15:34
  • Bonjour,

    Qu'est ce que cela donne si on change la structure en classe ? (une structure est un type "valeur", une classe est un type "référence"). Ou alors remettez la structure copiée dans la liste (actuellement l'assignation de l'entrée de liste en cours à la variable Champ via la boucle foreach va faire une *copie* de la valeur et c'est cette copie que l'on modifie, la valeur stockée dans la liste reste donc inchangée).

    Accessoirement, un catch vide est sans doute une mauvaise idée. Si vous voulez vraiment ignorer des erreurs essayer de n'ignorer que les erreurs voulues en indiquant un type d'exception le plus précis possible plutôt que Exception.

    Selon ce que vous cherchez à faire "EntityFramework" pourrait vous être utile (le but est d'exposer les données de la base sous forme d'objets .NET).


    Please always mark whatever response solved your issue so that the thread is properly marked as "Answered".

    Merci Patrice.

    A mon avis, en Classe_Table comme vous me le proposez, le problème devrait être résolu.

    C'est noté pour le catch vide, merci.

    Je vais regarder aussi du côté EntityFramework que je ne connais pas du tout.

    Sinon, pour information, j'ai également réussi  à résoudre mon problème ainsi :

                        For i As Integer = 0 To Table.Champs.Count - 1
    
                            Dim Champ As Structure_Champs = Table.Champs(i)
    
                            Try
                                Champ.Valeur = .Item(Champ.Nom).ToString
    
                            Catch ex As Exception
                                Champ.Valeur = Champ.Défaut
    
                            End Try
    
                            Table.Champs(i) = Champ
    
                        Next
    

    J'ai donc supprimé le For each en le remplaçant par 1 For

    Et je réassigne l’occurrence concernée par l'élément modifié.

    • Marqué comme réponse Stéphane2009 mercredi 6 mars 2013 15:57
    mercredi 6 mars 2013 15:56