Structure, collections ou classe pour stocker les propriétés des tables de ma BD [Résolu]

BasicZx81 140 Messages postés samedi 5 mars 2011Date d'inscription 13 août 2013 Dernière intervention - 9 avril 2012 à 11:40 - Dernière réponse : BasicZx81 140 Messages postés samedi 5 mars 2011Date d'inscription 13 août 2013 Dernière intervention
- 15 avril 2012 à 19:59
Bonjour à tous,

Aujourd'hui dans mon code j'utilise des structures pour accéder facilement aux nom de tables et de colonnes d'une BDD. Par exemple : Tables.Table1 ou Colonnes.Colonne1 pour obtenir les valeurs string ("Table1" et "Colonne1"), c'est pratique puisque je peux accéder aux nom de tables et de colonnes directement dans l'intellisense de l'IDE et evite beaucoup de risque d'erreur.
Voici la structure (c'est la même chose pour les colonnes) :

  Public Structure Tables
        Const Table1 As String = "Table1"
        Const Table2 As String = "Table2"
        Const Table3 As String = "Table3"
     End Structure

Problème, je ne peux pas utiliser ce principe pour stocker les type de champs et leurs tailles c'est pourquoi je souhaite créer des classes mais je n'ai aucun début de solution actuellement, si vous avez une piste de réflexion ça m'aiderais beaucoup. J'ai commençais avec une classe mais je résultat n'est pas convaincant dans la mesure ou je ne sais acceder à un élément qu'a partir de son index et nom à partir de son nom. Et en bonus si l'intellisense pouvais me proposer la liste des tables et colonnes ça serait vraiment un plus.

Pour l'instant voici les classes que j'ai commençais à écrire mais qui ne me satisfont pas :

Public Class Colonne
    Private _dbName As String
    Private _dbType As ADOX.DataTypeEnum
    Private _dbSize As Integer

    Public Sub New()

    End Sub

    'Public Sub New(ByVal DBname As String, ByVal DBType As ADOX.DataTypeEnum, ByVal DBSize As Integer)
    'Me._dbName = DBname
    'Me._dbType = DBType
    'Me._dbSize = DBSize
    'End Sub

    Public Property DBname() As String
        Get
            Return _dbName
        End Get
        Set(ByVal value As String)
            _dbName = value
        End Set
    End Property

    Public Property DBType() As ADOX.DataTypeEnum
        Get
            Return _dbType
        End Get
        Set(ByVal value As ADOX.DataTypeEnum)
            _dbType = value
        End Set
    End Property

    Public Property DBSize() As Integer
        Get
            Return _dbSize
        End Get
        Set(ByVal value As Integer)
            _dbSize = value
        End Set
    End Property

End Class


Public Class ListColonnes
    Inherits List(Of Colonne)
    'Inherits SortedList(Of String, Colonne)
End Class
Afficher la suite 

Votre réponse

24 réponses

Meilleure réponse
BasicZx81 140 Messages postés samedi 5 mars 2011Date d'inscription 13 août 2013 Dernière intervention - 13 avril 2012 à 17:18
3
Merci
Bonjour, j'ai pris du temps pour répondre. La faute à mon manque de connaissances il a fallu que j'étudie un peu mieux les classes, les enums et les structures....
je pense que je vais faire se dresser des cheveux sur la tête de certains à cause de probable maladresses et je suis a peu prêt sûre que l'on peut faire mieux ou peut-être plus simple, c'est pourquoi j'expose ma solution aux critiques de toutes sortes. Mais je vais aussi expliquer pourquoi j'ai choisi tel ou tel méthodes.

J'ai choisis les Enums pour 2 raisons (1- Le nom des champs sont accessibles via l'intellisense de VS, c'est pratique pour coder et ne pas se tromper (j'ai néanmoins un doute pour savoir si cela fonctionne dans le cas de l'utilisation de caractères spéciaux), 2- On peut parcourir la liste de tous les membres, j'ai utiliser cette astuce pour initialiser automatiquement la collection de Champs (du type SortedList) dés la création de l'objet DBColonnes avec le nom de chaque colonnes déjà valorisé dans la collection.
Public Enum MonDBEnum
    NomdeMonChamp1
    NomdeMonChamp2
    NomdeMonChamp3
End Enum


La Classe DBColonne :
Public Class DBColonne
    Private _dbName As String
    Private _dbType As ADOX.DataTypeEnum
    Private _dbSize As Integer

    Public Sub New()

    End Sub

    'Public Sub New(ByVal DBname As String, ByVal DBType As ADOX.DataTypeEnum, ByVal DBSize As Integer)
    'Me._dbName = DBname
    'Me._dbType = DBType
    'Me._dbSize = DBSize
    'End Sub

    Public Property DBname() As String
        Get
            Return _dbName
        End Get
        Set(ByVal value As String)
            _dbName = value
        End Set
    End Property

    Public Property DBType() As ADOX.DataTypeEnum
        Get
            Return _dbType
        End Get
        Set(ByVal value As ADOX.DataTypeEnum)
            _dbType = value
        End Set
    End Property

    Public Property DBSize() As Integer
        Get
            Return _dbSize
        End Get
        Set(ByVal value As Integer)
            _dbSize = value
        End Set
    End Property

End Class


J'ai utilisé des classes plutôt que les structures car je ne pouvais pas utiliser les SortedList comme je voulais.
La Classe DBColonnes permet de stocker les propriétés de chaque champs (ou colonnes). Une astuce permet de parcourir les Enums afin de valoriser la clé de la collection SortedList et également la propriété "Nom" de chaque colonnes.
Public Class DBColonnes
    Public Sub New()
        Dim _enum As String
        Dim _MonChamp As New DBColonne
        Champs = New SortedList(Of String, DBColonne)
        For Each _enum In [Enum].GetNames(GetType(MonDBEnum))
            'MsgBox(_enum)
            _MonChamp.DBname = _enum.ToString
            Champs.Add(_enum, _MonChamp)
        Next
    End Sub
    Public ReadOnly Property Nom(ByVal MonChamp As String) As String
        Get
            Return Champs(MonChamp).DBname
        End Get
        'Set(value As String)
        'Champs(MonChamp).DBname = value
        'End Set
    End Property
    Public Property Type(ByVal MonChamp As String) As ADOX.DataTypeEnum
        Get
            Return Champs(MonChamp).DBType
        End Get
        Set(value As ADOX.DataTypeEnum)
            Champs(MonChamp).DBType = value
        End Set
    End Property
    Public Property Size(ByVal MonChamp As String) As Integer
        Get
            Return Champs(MonChamp).DBSize
        End Get
        Set(value As Integer)
            Champs(MonChamp).DBSize = value
        End Set
    End Property

    Public Champs As SortedList(Of String, DBColonne)
End Class


Procédure de Test
   Public Sub Test()
        Dim MesDBChamps As New DBColonnes
        MsgBox(MonDBEnum.NomdeMonChamp2.ToString)
        ' ou
        MsgBox(MesDBChamps.Nom(MonDBEnum.NomdeMonChamp2.ToString))

        MesDBChamps.Size(MonDBEnum.NomdeMonChamp2.ToString) = 35 'Ecrit la largeur de la colonne
        MsgBox(MesDBChamps.Size(MonDBEnum.NomdeMonChamp2.ToString)) 'Retourne la largeur de la colonne
    End Sub


J'ai juste un seul petit regret pour l'instant, je trouve que les paramétres "MonDBEnum.NomdeMonChamp2.ToString" sont un peu longs.
Un grand merci à NHenry pour m'avoir conduit à cette solution.

Merci BasicZx81 3

Avec quelques mots c'est encore mieux Ajouter un commentaire

Codes Sources a aidé 96 internautes ce mois-ci

Commenter la réponse de BasicZx81
Meilleure réponse
BasicZx81 140 Messages postés samedi 5 mars 2011Date d'inscription 13 août 2013 Dernière intervention - 13 avril 2012 à 17:51
3
Merci
Oupss, désolé il y a une erreur, remplacer la classe DBColonnes par celle-ci :

Public Class DBColonnes
    Public Champs As SortedList(Of String, DBColonne)
    Public Sub New()
        Dim _enum As String
        Dim _MonChamp As DBColonne
        Champs = New SortedList(Of String, DBColonne)
        For Each _enum In [Enum].GetNames(GetType(MonDBEnum))
            'MsgBox(_enum)
            _MonChamp = New DBColonne
            _MonChamp.DBname = _enum.ToString
            Champs.Add(_enum, _MonChamp)
        Next
    End Sub
    Public ReadOnly Property Nom(ByVal MonChamp As MonDBEnum) As String
        Get
            Return Champs(MonChamp.ToString).DBname
        End Get
        'Set(value As String)
        'Champs(MonChamp).DBname = value
        'End Set
    End Property
    Public Property Type(ByVal MonChamp As MonDBEnum) As ADOX.DataTypeEnum
        Get
            Return Champs(MonChamp.ToString).DBType
        End Get
        Set(value As ADOX.DataTypeEnum)
            Champs(MonChamp.ToString).DBType = value
        End Set
    End Property
    Public Property Size(ByVal MonChamp As MonDBEnum) As Integer
        Get
            Return Champs(MonChamp.ToString).DBSize
        End Get
        Set(value As Integer)
            Champs(MonChamp.ToString).DBSize = value
        End Set
    End Property
End Class


Du coup, j'en ai profité pour passer les paramètres en type Enum, cela permet de les raccourcir (sans les .Tostring).

Merci BasicZx81 3

Avec quelques mots c'est encore mieux Ajouter un commentaire

Codes Sources a aidé 96 internautes ce mois-ci

Commenter la réponse de BasicZx81
Meilleure réponse
BasicZx81 140 Messages postés samedi 5 mars 2011Date d'inscription 13 août 2013 Dernière intervention - 14 avril 2012 à 17:35
3
Merci
Bon finalement j'ai essayé de pas faire trop compliqué et ma solution reste assez classique :

Pour accéder aux Noms des Tables et Colonnes depuis l'intellisense de l'IDE je suis revenu finalement à l'utilisation des Structures mais on peux utiliser aussi les Enums :
    Public Structure Table1
        Const ID As String = "ID"
        Const COLONNE1 As String = "COLONNE1"
        Const COLONNE2 As String = "COLONNE2"
.....
    End Structure


La Classe DBColonne :
Public Class DBColonne
    Private _DBName As String
    Private _DBType As ADOX.DataTypeEnum
    Private _DbSize As Integer
    Public Sub New(Optional ByVal DBName As String = Nothing, _
                   Optional ByVal DBType As ADOX.DataTypeEnum = Nothing, _
                   Optional ByVal DBSize As Integer = Nothing)
        _DBName = DBName
        _DBType = DBType
        _DbSize = DBSize
    End Sub
    Public Property DBName() As String
        Get
            Return _DBName
        End Get
        Set(value As String)
            _DBName = value
        End Set
    End Property
    Public Property DBType() As ADOX.DataTypeEnum
        Get
            Return _DBType
        End Get
        Set(value As ADOX.DataTypeEnum)
            _DBType = value
        End Set
    End Property
    Public Property DBSize() As Integer
        Get
            Return _DbSize
        End Get
        Set(value As Integer)
            _DbSize = value
        End Set
    End Property
End Class


La Classe DBTable, , j'ai surchargé les Méthodes Add pour utiliser aux choix de diverses façons et en utilisant les String, Structure ou Enums.
Public Class DBTable
    Private _DBName As String
    Public Colonnes As New SortedList(Of String, DBColonne)

    Public Sub New(Optional ByVal DBName As String = Nothing)
        _DBName = DBName
    End Sub

    Public Property DBName() As String
        Get
            Return _DBName
        End Get
        Set(value As String)
            _DBName = value
        End Set
    End Property
    ' Pour passer une colonne en paramétre, La clé de chaque colonne est égale au nom de la colonne.
    Public Sub Add(ByVal MaDBColonne As DBColonne)
        Dim _Key As String = MaDBColonne.DBName
        Colonnes.Add(_Key, MaDBColonne)
    End Sub
    ' Pour utiliser les nom de colonnes en type string ou énumérés dans une structure
    Public Sub Add(ByVal DBName As String, ByVal MaDBColonne As DBColonne)
        'MaDBColonne.DBName = DBName
        Colonnes.Add(DBName, MaDBColonne)
    End Sub
    ' Pour utiliser les noms de Colonnes énumérés dans une énumérations de type Enum :
    Public Sub Add(ByVal DBName As [Enum], ByVal MaDBColonne As DBColonne)
        'MaDBColonne.DBName = DBName.ToString
        Colonnes.Add(DBName.ToString, MaDBColonne)
    End Sub
End Class 


La procédure de Test :
   Public Sub Test()
        ' Création d'une Table :
        Dim MaTable As New DBTable("Table1")

        'Création de chaque colonne et ajout dans la Table
        Dim MaColonne As New DBColonne(Table1.ID, DataTypeEnum.adChar, 38)
        MaTable.Add(MaColonne)
        ' Autre façon de faire :
        MaColonne.DBName "Colonne2" : MaColonne.DBType DataTypeEnum.adChar : MaColonne.DBSize = 30
        MaTable.Add(Table1.Colonne2, MaColonne)
        ' etc.....

       'Obtenir le Nom de la Table :
        MsgBox(MaTable.DBName)

        'Lecture des propriétés d'une colonne :
        MsgBox(MaTable.Colonnes(Table1.ID).DBName)
        MsgBox(MaTable.Colonnes(Table1.ID).DBType)
        MsgBox(MaTable.Colonnes(Table1.ID).DBSize)
    End Sub

Merci BasicZx81 3

Avec quelques mots c'est encore mieux Ajouter un commentaire

Codes Sources a aidé 96 internautes ce mois-ci

Commenter la réponse de BasicZx81
NHenry 14280 Messages postés vendredi 14 mars 2003Date d'inscription 22 octobre 2018 Dernière intervention - 9 avril 2012 à 13:49
0
Merci
Bonjour,

Tu fais une structure comportant les données d'un champ (Nom, type, ...)
Tu fais une structure comportant les données d'une table ( Nom, Liste des colonnes, ...)
Tu fais une liste de la structure précédente pour les tables.

---------------------------------------------------------------------
[list=ordered][*]Pour poser correctement une question et optimiser vos chances d'obtenir des réponses, pensez à lire le règlement CS, celui-ci pour bien poser votre question ou encore celui-ci pour les PFE et autres exercices[*]Quand vous postez un code, merci d'utiliser la coloration syntaxique (3ième icône en partant de la droite : )
[*]En VB.NET pensez à activer Option Explicit et Option Strict (propriété du projet) et à retirer l'import automatique de l'espace de nom Microsoft.VisualVasic (onglet Références dans les propriétés du projet).
[*]Si votre problème est résolu (et uniquement si c'est le cas), pensez à mettre "Réponse acceptée" sur le ou les messages qui vous ont aidés./list
---
Mon site
Commenter la réponse de NHenry
BasicZx81 140 Messages postés samedi 5 mars 2011Date d'inscription 13 août 2013 Dernière intervention - 9 avril 2012 à 14:18
0
Merci
Merci de vous pencher sur mon cas NHenry mais que faut t'il entendre par Liste des colonnes ?
Est qu'il s'agit d'une collection List (Of Type) et pareil le 3eme point (liste de la structure pour les tâbles).
Sans vouloir abuser si je pouvais avoir un petit exemple de code ça m'arrangerait beaucoup car je patauge un peu avec tout ces type de variables.
En vous remerciant en tous cas pour tous le temps que vous consacrez à essayer de résoudre les problèmes.
Commenter la réponse de BasicZx81
BasicZx81 140 Messages postés samedi 5 mars 2011Date d'inscription 13 août 2013 Dernière intervention - 9 avril 2012 à 16:50
0
Merci
Bonjour, j'ai fait ceci, c'est un bon début je pense mais on doit surement pouvoir faire mieux et surtout je n'arrive pas à accéder à une colonne en particulier à partir de son nom :

    Public Structure Colonne
        Public Nom As String
        Public type As ADOX.DataTypeEnum
        Public size As Integer
    End Structure
    Public Structure Tables
        Public Colonne1 As Colonne
        Public Colonne2 As Colonne
        Public Colonne3 As Colonne
    End Structure
    Dim List As List(Of Tables)

    Public Sub Test()
        Dim MaTable As New Tables
        MaTable.Colonne1.Nom = "Toto"
        MaTable.Colonne1.type = DataTypeEnum.adChar
        MaTable.Colonne1.size = 10
        List.Add(MaTable)

        MaTable.Colonne2.Nom = "Toto1"
        MaTable.Colonne2.type = DataTypeEnum.adChar
        MaTable.Colonne2.size = 20
        List.Add(MaTable)

' Pour accéder à une propriété d'une colonne à partir de son index :
        MsgBox(List(0).Champ1.Nom)
' Pour accéder à une propriété d'une colonne à partir de son nom :
????????
    End Sub


Merci beaucoup si vous pouvez m'aider sur ce point en particulier.
Commenter la réponse de BasicZx81
NHenry 14280 Messages postés vendredi 14 mars 2003Date d'inscription 22 octobre 2018 Dernière intervention - 9 avril 2012 à 18:37
0
Merci
Bonjour,

    Public Structure Colonne
        Public Nom As String
        Public type As ADOX.DataTypeEnum
        Public size As Integer
    End Structure
    Public Structure Tables
        Public Colonnes As New List(Of Colonne)
        Public Nom As String
    End Structure
    Dim List As List(Of Tables)


Puis :
List(0).Colonnes(0).Nom

---------------------------------------------------------------------
[list=ordered][*]Pour poser correctement une question et optimiser vos chances d'obtenir des réponses, pensez à lire le règlement CS, celui-ci pour bien poser votre question ou encore celui-ci pour les PFE et autres exercices[*]Quand vous postez un code, merci d'utiliser la coloration syntaxique (3ième icône en partant de la droite : )
[*]En VB.NET pensez à activer Option Explicit et Option Strict (propriété du projet) et à retirer l'import automatique de l'espace de nom Microsoft.VisualVasic
 (onglet Références dans les propriétés du projet).

[*]Si votre problème est résolu (et uniquement si c'est le cas), pensez à mettre "Réponse acceptée" sur le ou les messages qui vous ont aidés./list
---
Mon site
Commenter la réponse de NHenry
BasicZx81 140 Messages postés samedi 5 mars 2011Date d'inscription 13 août 2013 Dernière intervention - 9 avril 2012 à 20:30
0
Merci
Bonjour et merci NHenry,
J'ai remplacé Public par Shared comme ceci pour que l'IDE accepte la synthaxe :

    Public Structure Tables
        Shared Colonnes As New List(Of Colonne)
        Public Nom As String
    End Structure

Du coup je ne peux pas instancier Tables, je suis obligé de référencer directement la structure Tables2 pour accéder à ses membres mais peux-être que ce n'est pas un problème.
Par contre je ne peux toujours pas accéder aux propriétés à partir du nom d'une colonne et là je ne vois vraiment pas comment je peux faire. J'aimerais pouvoir faire ceci pour la lisibilité du code et pour savoir exactement quel champ je manipule pour éviter des erreurs.
Commenter la réponse de BasicZx81
NHenry 14280 Messages postés vendredi 14 mars 2003Date d'inscription 22 octobre 2018 Dernière intervention - 9 avril 2012 à 20:40
0
Merci
Bonjour,

A ce moment là, tu fais des classes, remplace les "Structure" par "Class".
Sinon, je ne vois pas pourquoi il te faut un Shared.
Quel était le message d'erreur ?

---------------------------------------------------------------------
[list=ordered][*]Pour poser correctement une question et optimiser vos chances d'obtenir des réponses, pensez à lire le règlement CS, celui-ci pour bien poser votre question ou encore celui-ci pour les PFE et autres exercices[*]Quand vous postez un code, merci d'utiliser la coloration syntaxique (3ième icône en partant de la droite : )
[*]En VB.NET pensez à activer Option Explicit et Option Strict (propriété du projet) et à retirer l'import automatique de l'espace de nom Microsoft.VisualVasic (onglet Références dans les propriétés du projet).
[*]Si votre problème est résolu (et uniquement si c'est le cas), pensez à mettre "Réponse acceptée" sur le ou les messages qui vous ont aidés./list
---
Mon site
Commenter la réponse de NHenry
BasicZx81 140 Messages postés samedi 5 mars 2011Date d'inscription 13 août 2013 Dernière intervention - 9 avril 2012 à 22:02
0
Merci
merci NHenry, j'avais déjà essayé avec des classes dans mon 1er post mais sans grand résultat, je vais essayer en m'inspirant des structures que tu m'a montré mais je sais d'avance que c'est pas gagné vu mon niveau en POO .
Voici le message d'erreur :
les membres non partagés dans une Structure ne peuvent pas être déclarés 'New'.
Commenter la réponse de BasicZx81
NHenry 14280 Messages postés vendredi 14 mars 2003Date d'inscription 22 octobre 2018 Dernière intervention - 9 avril 2012 à 22:20
0
Merci
Bonjour,

    Public Class Colonne
        Public Nom As String
        Public type As ADOX.DataTypeEnum
        Public size As Integer
    End Class 
    Public Class Tables
        Public Colonnes As New List(Of Colonne)
        Public Nom As String
    End Class 
    Dim List As List(Of Tables)


Essayes comme ça.

---------------------------------------------------------------------
[list=ordered][*]Pour poser correctement une question et optimiser vos chances d'obtenir des réponses, pensez à lire le règlement CS, celui-ci pour bien poser votre question ou encore celui-ci pour les PFE et autres exercices[*]Quand vous postez un code, merci d'utiliser la coloration syntaxique (3ième icône en partant de la droite : )
[*]En VB.NET pensez à activer Option Explicit et Option Strict (propriété du projet) et à retirer l'import automatique de l'espace de nom Microsoft.VisualVasic (onglet Références dans les propriétés du projet).
[*]Si votre problème est résolu (et uniquement si c'est le cas), pensez à mettre "Réponse acceptée" sur le ou les messages qui vous ont aidés./list
---
Mon site
Commenter la réponse de NHenry
BasicZx81 140 Messages postés samedi 5 mars 2011Date d'inscription 13 août 2013 Dernière intervention - 10 avril 2012 à 07:46
0
Merci
Merci NHenry, les classes fonctionnent mais tu as une idée pour accéder aux propriétés de chaque colonne à partir de leur nom plutôt que par l'index ?
du style Macolonne("Colonne1").type pour obtenir le type.
Commenter la réponse de BasicZx81
NHenry 14280 Messages postés vendredi 14 mars 2003Date d'inscription 22 octobre 2018 Dernière intervention - 10 avril 2012 à 12:55
0
Merci
Bonjour,

Avec Linq :
Dim MonChamp=From UnChamp In ListeTable(0) WHERE UnChamp.Nom="UnNom" Select UnChamp

---------------------------------------------------------------------
[list=ordered][*]Pour poser correctement une question et optimiser vos chances d'obtenir des réponses, pensez à lire le règlement CS, celui-ci pour bien poser votre question ou encore celui-ci pour les PFE et autres exercices[*]Quand vous postez un code, merci d'utiliser la coloration syntaxique (3ième icône en partant de la droite : )
[*]En VB.NET pensez à activer Option Explicit et Option Strict (propriété du projet) et à retirer l'import automatique de l'espace de nom Microsoft.VisualVasic (onglet Références dans les propriétés du projet).
[*]Si votre problème est résolu (et uniquement si c'est le cas), pensez à mettre "Réponse acceptée" sur le ou les messages qui vous ont aidés./list
---
Mon site
Commenter la réponse de NHenry
BasicZx81 140 Messages postés samedi 5 mars 2011Date d'inscription 13 août 2013 Dernière intervention - 10 avril 2012 à 21:35
0
Merci
Merci NHenry pour le temps passé à m'aider.
En ce qui concerne Linq, je ne suis pas sûre que ça corresponde à mes besoins mais je me trompe peut-être étant donné que je ne connais pas assez. Toujours est t'il que je ne peux pas l'utiliser avec VB en édition Express si je ne dit pas de bêtises.
Je vais faire des essais en utilisant des structures je pense et j'arriverais bien à en sortir quelques choses j'espère.
Je pense que je vais déclarer en "dure" les nom des colonnes étant donner que ces noms sont connus à l'avance, ce qui me permettra de les appeler par leur nom et de profiter de l'intellisense.
Quelque chose dans ce style :

    Public Structure Champ
        Public Nom As String
        Public type As ADOX.DataTypeEnum
        Public size As Integer
    End Structure
    Public Structure Champ1
        Const Nom As String = "Champ1"
        Const Type As ADOX.DataTypeEnum = DataTypeEnum.adChar
        Const Size As Integer = 10
    End Structure
    Public Structure Champ2
        Const Nom As String = "Champ2"
        Const Type As ADOX.DataTypeEnum = DataTypeEnum.adChar
        Const Size As Integer = 20
    End Structure
  Public Structure Table
        Public Nom As String
        Public Champ1 As Champ
        Public Champ2 As Champ
        ....
    End Structure


je peux appeler les propriétés en faisant :
Dim MaTable as New Table ' ? je sus obligé d'instancier (Table) pour accéder à ses membres.
Puis :
MaTable.Champ1.Nom ' Pour obtenir le Nom de la colonne "Champ1"

C'est pas terrible et il y a surement des améliorations à faire mais ça à l'air de marcher à peu prêt comme je veux.
Bien sur si j'ai d'autres propositions je suis prêt à essayer.
Commenter la réponse de BasicZx81
NHenry 14280 Messages postés vendredi 14 mars 2003Date d'inscription 22 octobre 2018 Dernière intervention - 10 avril 2012 à 21:53
0
Merci
Bonjour,

Reprends la déclaration des classes que j'ai fait.
Ensuite, intéresses-toi à la clause New.

---------------------------------------------------------------------
[list=ordered][*]Pour poser correctement une question et optimiser vos chances d'obtenir des réponses, pensez à lire le règlement CS, celui-ci pour bien poser votre question ou encore celui-ci pour les PFE et autres exercices[*]Quand vous postez un code, merci d'utiliser la coloration syntaxique (3ième icône en partant de la droite : )
[*]En VB.NET pensez à activer Option Explicit et Option Strict (propriété du projet) et à retirer l'import automatique de l'espace de nom Microsoft.VisualVasic (onglet Références dans les propriétés du projet).
[*]Si votre problème est résolu (et uniquement si c'est le cas), pensez à mettre "Réponse acceptée" sur le ou les messages qui vous ont aidés./list
---
Mon site
Commenter la réponse de NHenry
BasicZx81 140 Messages postés samedi 5 mars 2011Date d'inscription 13 août 2013 Dernière intervention - 11 avril 2012 à 09:06
0
Merci
Bonjour NHenry et merci,
J'ai essayé de comprendre ce que je pouvais faire avec la clause new mais sans succés pour l'instant . Donc celle-ci s'execute lors de la création (instanciation d'un nouvelle objet) autrement dit je peux m'en servir pour initialiser l'objet. Si je prends l'exemple de la classe Colonne, je peux valoriser les propriétés Nom, type et Size à ce moment là mais ensuite si j'ajoute ma colonne à ma collection dans l'objet Tables je ne vois pas trés bien comment rappeller cette colonne à partir de son Nom, c'est la que je bloque (Peut-être que le type List (of T) n'est pas adapté et qu'il faudrait que j'utilise SortedList (of T) par exemple ? . Et ensuite il faudrait que Intellisense puisse me lister toutes les colonnes, je ne vois vraiment comment y arriver avec des classes.
Même si la solution peut-être simple ca se complique beaucoup pour moi. Merci beaucoup si vous pouviez m'eclairer encore davantage ou si vous voyez une possibilité que je n'ai pas vus.
Commenter la réponse de BasicZx81
NHenry 14280 Messages postés vendredi 14 mars 2003Date d'inscription 22 octobre 2018 Dernière intervention - 11 avril 2012 à 12:52
0
Merci
Bonjour,

Dim MaTable as ClsTable=New ClsTable
With MaTable
    .Nom="Nom Table"
    Dim MonChamp As ClsChamp=New ClsChamp
    With MonChamp
        .Nom="UnChamp"
        .UnTruc=UneChose
    End With
    .Colonnes.Add(MonChamp)
    
    MonCjhamp=New ClsChamp
...
End With

ListeTable.Add(MaBable)


---------------------------------------------------------------------
[list=ordered][*]Pour poser correctement une question et optimiser vos chances d'obtenir des réponses, pensez à lire le règlement CS, celui-ci pour bien poser votre question ou encore celui-ci pour les PFE et autres exercices[*]Quand vous postez un code, merci d'utiliser la coloration syntaxique (3ième icône en partant de la droite : )
[*]En VB.NET pensez à activer Option Explicit et Option Strict (propriété du projet) et à retirer l'import automatique de l'espace de nom Microsoft.VisualVasic (onglet Références dans les propriétés du projet).
[*]Si votre problème est résolu (et uniquement si c'est le cas), pensez à mettre "Réponse acceptée" sur le ou les messages qui vous ont aidés./list
---
Mon site
Commenter la réponse de NHenry
NHenry 14280 Messages postés vendredi 14 mars 2003Date d'inscription 22 octobre 2018 Dernière intervention - 13 avril 2012 à 19:29
0
Merci
Bonjour,

Pourquoi ne pas faire un constructeur paramétré pour la classe DBColonne qui définira les données de la classe (Nom, Type, ...) et que la classe DBColonnes met à dispo une propriété retournant l'objet DBColonne désiré ?

Comme ça, si tu ajoutes une propriété à la classe DBColonne elle sera directement dispo ailleurs.

Ensuite, la classe DBColonnes aura aussi 2 méthodes une pour ajouter et une pour supprimer une colonne.

Est-ce assez clair ?

---------------------------------------------------------------------
[list=ordered][*]Pour poser correctement une question et optimiser vos chances d'obtenir des réponses, pensez à lire le règlement CS, celui-ci pour bien poser votre question ou encore celui-ci pour les PFE et autres exercices[*]Quand vous postez un code, merci d'utiliser la coloration syntaxique (3ième icône en partant de la droite : )
[*]En VB.NET pensez à activer Option Explicit et Option Strict (propriété du projet) et à retirer l'import automatique de l'espace de nom Microsoft.VisualVasic (onglet Références dans les propriétés du projet).
[*]Si votre problème est résolu (et uniquement si c'est le cas), pensez à mettre "Réponse acceptée" sur le ou les messages qui vous ont aidés./list
---
Mon site
Commenter la réponse de NHenry
BasicZx81 140 Messages postés samedi 5 mars 2011Date d'inscription 13 août 2013 Dernière intervention - 14 avril 2012 à 09:11
0
Merci
Bonjour, oui en effet je n'ai pas penser à cette possibilité mais du coup je ne sais plus très bien comment je vais initialiser mes noms de colonnes à partir des Enums. Dois-je le faire dans une classe ou en dehors dans une procédure Sub classique ?. Je vais tester tout ça et je reviendrais donner mon retour sur le site.
Commenter la réponse de BasicZx81
BasicZx81 140 Messages postés samedi 5 mars 2011Date d'inscription 13 août 2013 Dernière intervention - 14 avril 2012 à 11:04
0
Merci
Bonjour NHenry, désolé de vous solliciter une nouvelle fois. j'ai écrit une nouvelle classe DBColonnes2 pour faire des essais mais je bloque sur un truc tout bête, je n'arrive pas à accéder directement aux propriétés Non, Type... à partir de mon objet instancié avec cette classe.

Voici la Classe en question :
Public Class DBColonnes2
    Inherits SortedList(Of String, DbColonne2)
    'Public Champs As SortedList(Of String, DbColonne2)
    Public Sub New()

    End Sub

    Public Overloads Sub Add(ByVal Name As [Enum], ByVal MaColonne As DbColonne2)
        MaColonne.DBName = Name.ToString
        MyBase.Add(Name.ToString, MaColonne)
        'Champs.Add(Name.ToString, MaColonne)
    End Sub
End Class
Commenter la réponse de BasicZx81

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.