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

Accès aux données Discussion :

Classe pour Gestion Access, DataAdapter ?


Sujet :

Accès aux données

  1. #1
    Membre actif

    Profil pro
    Inscrit en
    Juin 2002
    Messages
    291
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2002
    Messages : 291
    Points : 270
    Points
    270
    Par défaut Classe pour Gestion Access, DataAdapter ?
    Bonjour,

    J'essais de créer une classe et je voudrais savoir si je pars sur le bon chemin....
    Je voudrais que ma classe gère un dataset. Dans celle-ci j'ai déclaré un objet DataSet afin de pouvoir y charger plusieurs tables.
    Code VB.Net : Sélectionner tout - Visualiser dans une fenêtre à part
    Private objDataSet As New DataSet
    J'ai également créé des fonctions comme Connection, DataSet, DataAdapter, DataTable ....

    J'arrive à charger des tables dans le dataset, à y ajouter des lignes, ... Mais mon soucis se situe au niveau du DataAdapter. Avec une base Access, il faut un DA par table, et lors de l'update il faut ce même DA.
    Par exemple, je charge, dans cet ordre, la table Tbl_Personne, puis la table Tbl_Voiture dans mon DataSet. J'ajoute une ligne à la table Tbl_Personne du DataSet, pas de soucis, mais au moment de faire un update, mon DA sera celui utilisé pour charger la table Tbl_Voiture, j'obtiendrais une erreur....

    Comment résoudre se problème ?
    Comment faire pour créer un DA par table et pouvoir y faire référence au moment de l'update ?
    Peut-on indexé des DataAdapter, comment ?

    Merci d'avance pour le coup de main

    Gwendal

  2. #2
    Membre expérimenté
    Avatar de FRED.G
    Profil pro
    Inscrit en
    Novembre 2002
    Messages
    1 032
    Détails du profil
    Informations personnelles :
    Âge : 44
    Localisation : France

    Informations forums :
    Inscription : Novembre 2002
    Messages : 1 032
    Points : 1 505
    Points
    1 505
    Par défaut
    Salut,

    Dans l'absolu je ne peux pas trop approuver le mélange en une seule classe de ta couche métier et de ta couche d'accès aux données, mais il existe quand même des cas où ce n'est pas un pb car ça se révèle + pratique.

    Bref, la question concerne l'accessibilité de tes DA... Ben avec les infos que tu donnes (ou plutôt que tu ne donnes PAS ), on ne peut pas trop t'aider...

    En attendant que tu fournisses + de précisions (du code), je profite pour mentionner que si ce n'est pas ce que tu fais déjà, tu peux utiliser les classes partielles pour associer du code personnalisé au code généré de ton DataSet typé. Tu as accès à toutes les classses générées, y compris les DA.

    Cela ne règle pas directement ton pb, mais c'est un truc toujours bon à savoir quand on utilise pleinement les DataSet typés comme tu le fais.

    Avec une base Access, il faut un DA par table, et lors de l'update il faut ce même DA
    Archi faux, mais c'est vrai que c'est plus simple de conserver le code généré par l'assistant, or celui-ci effectivement crée un DA / DataTable (les justement nommés TableAdapter ).
    (\ _ /)
    (='.'=)
    (")-(")

  3. #3
    Membre actif

    Profil pro
    Inscrit en
    Juin 2002
    Messages
    291
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2002
    Messages : 291
    Points : 270
    Points
    270
    Par défaut
    Salut,

    Merci pour la réponse.

    Voici la classe. Elle fonctionne bien mise à part le DataAdapter..., je suis pas sur d'avoir tout bien codé
    Code VB.Net : 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
    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
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    144
    145
    146
    147
    148
    149
    150
    151
    152
    153
    154
    155
    156
    157
    158
    159
    160
    161
    162
     
    Imports System
    Imports System.Data
    Imports System.Data.OleDb
     
    Friend Class AccesOleDb
     
        Private objDataSet As New DataSet
        Private objDataAdapter As New OleDbDataAdapter
        Private objCommandBuilder As OleDbCommandBuilder
     
        Public Function GetConnection() As OleDbConnection
     
            Dim objConnection As OleDbConnection
            Dim strConnection As String
     
            ' Initialisation de la chaîne de paramètres pour la connexion
            strConnection = "Provider=Microsoft.Jet.OLEDB.4.0;" & _
                            "Data Source =" & Application.StartupPath & "\Source\Parc Vehicule.mdb;"
     
            ' Instanciation d'un objet Connexion
            objConnection = New OleDbConnection()
     
            ' Donner à la propriété ConnectionString les paramètres de connexion
            objConnection.ConnectionString = strConnection
     
            ' Retourner l'objet Connexion
            Return objConnection
     
        End Function
     
        Public Function CreateDbCommand(ByVal strCommandText As String) As OleDbCommand
     
            Dim objCommand As OleDbCommand
     
            objCommand = GetConnection.CreateCommand()
            objCommand.CommandType = Data.CommandType.Text
            objCommand.CommandText = strCommandText
            objCommand.Connection = GetConnection()
     
            ' Retourner l'objet Command
            Return objCommand
     
        End Function
     
        Public Function CreateDataAdapter(ByVal strCommandText As String) As OleDbDataAdapter
     
            ' Création du DataAdapter
            objDataAdapter.SelectCommand = CreateDbCommand(strCommandText)
     
            ' Retourner l'objet DataAdapter
            Return objDataAdapter
     
        End Function
     
        Public Function CreateDataSet(ByVal strRequete As String, ByVal strNameTable As String) As DataSet
     
            ' Ouvrir la connexion
            OpenConnection()
     
            ' Remplir le DataSet
            CreateDataAdapter(strRequete).Fill(objDataSet, strNameTable)
     
            ' Fermer la connexion
            CloseConnection()
     
            ' Retourner l'objet DataSet rempli
            Return objDataSet
     
        End Function
     
        Public Function CreateDataTable(ByVal strRequete As String, ByVal strNameTable As String) As DataTable
     
            Dim objDataTable As New DataTable
     
            objDataSet = CreateDataSet(strRequete, strNameTable)
            objDataTable = objDataSet.Tables(strNameTable)
     
            Return objDataTable
     
        End Function
     
        Public Function CreateDataRow(ByVal strNameTable As String, ByVal alstValeur As ArrayList) As DataRow
     
            Dim objDataRow As DataRow
     
            ' Ajout de la nouvelle ligne dans la table du DataSet
            objDataRow = objDataSet.Tables(strNameTable).NewRow()
     
            ' Insertion des élèments contenus dans la liste, dans la nouvelle ligne
            Dim i As Integer
            For i = 0 To alstValeur.Count - 1
     
                objDataRow(i) = alstValeur.Item(i)
     
            Next i
     
            ' Ajout de la ligne à la table
            objDataSet.Tables(strNameTable).Rows.Add(objDataRow)
     
            Return objDataRow
     
        End Function
     
        Public Function CreateCommandBuilder() As OleDbCommandBuilder
     
            objCommandBuilder = New OleDbCommandBuilder(objDataAdapter)
     
            Return objCommandBuilder
     
        End Function
     
        Public Sub UpdateDb(ByVal strNameTable As String)
     
            objCommandBuilder = CreateCommandBuilder()
     
            ' Mise à jour
            objDataAdapter.Update(objDataSet, strNameTable)
     
        End Sub
     
        Public Function OpenConnection()
     
            ' Création de la connexion
            Dim objConnection As OleDbConnection
            objConnection = GetConnection()
     
            Try
     
                ' Ouverture de la connexion
                objConnection.Open()
     
            Catch ex As Exception
                ' Erreur de connexion
                CloseConnection()
     
            End Try
     
            Return objConnection
     
        End Function
     
        Public Function CloseConnection()
     
            ' Création de la connexion
            Dim objConnection As OleDbConnection
            objConnection = GetConnection()
     
            Try
     
                ' Fermeture de la connexion
                objConnection.Close()
     
            Catch ex As Exception
     
            End Try
     
            Return objConnection
     
        End Function
     
    End Class

    Pour exemple du problème:
    Dans le formulaire,
    - J'importe la classe
    - je déclare une nouvelle instance de ma classe
    - je charge une 1ère table
    Code VB.Net : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
            Dim strFiltreRepertoire As String
            strFiltreRepertoire = "SELECT Tbl_Test.* " & _
                                  "FROM Tbl_Test;"
     
            NewAccess.CreateDataSet(strFiltreRepertoire, "Tbl_Test")
    - Je charge la 2ème table
    Code VB.Net : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
            Dim strFiltreVehicule As String
            strFiltreVehicule = "SELECT Tbl_Vehicule.* " & _
                                "FROM Tbl_Vehicule;"
     
            NewAccess.CreateDataSet(strFiltreVehicule, "Tbl_Vehicule")
    - j'ajoute une ligne à la table Tbl_Vehicule (la 2ème)
    Code VB.Net : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
            Dim alstTest As New ArrayList
            With alstTest
                .Add(Me.TextBox1.Text)
                .Add(Me.TextBox2.Text)
                .Add(Me.TextBox3.Text)
                .Add(Me.TextBox4.Text)
                .Add(Me.TextBox5.Text)
            End With
     
            NewAccess.CreateDataRow("Tbl_Test", alstTest)
    - jusqu'ici tout va bien, si regarde la DataTable dans le DataSet je retrouve bien mon ajout
    - j'update les modifications
    Code VB.Net : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
            NewAccess.UpdateDb("Tbl_Test")
    Et la j'obtiens une erreur
    DataColumn 'Immatriculation' manquant dans DataTable 'Tbl_Test' pour SourceColumn 'Immatriculation'.
    Immatriculation appartient à la table Tbl_Vehicule.

    Si je charge les tables dans le sens inverse, je ne rencontre pas ce problème.

    Voili Voulou ...


    Citation:
    Avec une base Access, il faut un DA par table, et lors de l'update il faut ce même DA
    Archi faux, mais c'est vrai que c'est plus simple de conserver le code généré par l'assistant, or celui-ci effectivement crée un DA / DataTable (les justement nommés TableAdapter ).
    Pourtant j'avais essayé de passer ...
    http://www.developpez.net/forums/sho...d.php?t=226734

    Merci pour le coup de main.

    (\ _ /)
    (='.'=)
    (")-(")


  4. #4
    Membre expérimenté
    Avatar de FRED.G
    Profil pro
    Inscrit en
    Novembre 2002
    Messages
    1 032
    Détails du profil
    Informations personnelles :
    Âge : 44
    Localisation : France

    Informations forums :
    Inscription : Novembre 2002
    Messages : 1 032
    Points : 1 505
    Points
    1 505
    Par défaut
    Pourtant j'avais essayé de passer ...
    http://www.developpez.net/forums/sho...d.php?t=226734
    Qu'il n'y ait pas de malentendu : il impossible d'utiliser des requêtes par lot renvoyant plusieurs jeux d'enregistements (plusieurs DataReader). Par contre (et c'est ce dont je parlais) rien n'empêche d'untiliser une même classe/instance de DataAdapter pour plusieurs tables à condition de modifier dynamiquement les propriétés nécessaires pour passer d'une table à l'autre. Je ne vois pas d'avantage particulier à procéder ainsi : des DA paramétrés chacun pour leur table sont souvent + simples à générer/coder qu'un seul DA générico-dynamique...


    D'après le message d'erreur, ton DA a mis à jour ses paramètres de mapping pour la nouvelle table (normal), c'est pourquoi l'update de la première ne fonctionne pas.

    Essaie :

    Code vb.net : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
        Private objDataAdapter As New OleDbDataAdapter
        Private objCommandBuilder As new OleDbCommandBuilder(OleDbDataAdapter)

    Code vb.net : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
        Public Function CreateDataAdapter(ByVal strCommandText As String) As OleDbDataAdapter
     
            ' Création du DataAdapter
            objDataAdapter.SelectCommand = CreateDbCommand(strCommandText)
     
    objCommandBuilder.RefreshSchema() 
     
            ' Retourner l'objet DataAdapter
            Return objDataAdapter
     
        End Function
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    'inutile
        'Public Function CreateCommandBuilder() As OleDbCommandBuilder
     
            'objCommandBuilder = New OleDbCommandBuilder(objDataAdapter)
     
            'Return objCommandBuilder
     
        'End Function
    Code vb.net : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
        Public Sub UpdateDb(ByVal strNameTable As String, ByVal strCommandText As String)
     'strCommandText correspond au select de strNameTable 
     
            ' Mise à jour 
            CreateDataAdapter(strCommandText).Update(objDataSet, strNameTable)
     
        End Sub

    Voilà, j'espère t'avoir dépané mais honêtement, je n'adhère pas du tout à ton modèle : même si c'est + de taf, je préfère les objets fortement typés, et le CommandBuilder, comment dire...

    En même temps, The Badger te rassurera en t'expliquant que pour une petite appli, y a pas de mal !
    (\ _ /)
    (='.'=)
    (")-(")

  5. #5
    Membre actif

    Profil pro
    Inscrit en
    Juin 2002
    Messages
    291
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2002
    Messages : 291
    Points : 270
    Points
    270
    Par défaut
    Salut,

    Une petite question: Es-tu insomniaque ?
    Hier, 22h12
    Aujourd'hui, 02h42

    Débutant en Vb.net (tu l'auras remarqué), j'aimerais partir sur de bonnes bases, même si sa me prend pas mal de temps....
    J'ai lu deux, trois bookins mais sa ne fait l'expérience que des personnes comme toi peuvent partagées sur les forums de Développez.net

    Voilà, j'espère t'avoir dépanné mais honêtement, je n'adhère pas du tout à ton modèle : même si c'est + de taf, je préfère les objets fortement typés, et le CommandBuilder, comment dire...

    En même temps, The Badger te rassurera en t'expliquant que pour une petite appli, y a pas de mal !
    Si je cromprends bien il faudrait partir sur un développement avec 3 couches comme dans le tutoriel de Romain Puyfoulhoux
    Exemple d'architecture à 3 couches en Visual Basic
    4.1 Couche données
    4.2 Couche métier
    4.3 Couche présentation

    ou sur le site de P. Lasserre
    Architecture n-Tiers.

    Est-ce le bon chemin ? D'autres questions suivront mais j'ouvrirais un nouveau post.... Après ta réponse je taggue en Résolu.

    Merci du temps passé.

    Gwendal

  6. #6
    Membre expérimenté
    Avatar de FRED.G
    Profil pro
    Inscrit en
    Novembre 2002
    Messages
    1 032
    Détails du profil
    Informations personnelles :
    Âge : 44
    Localisation : France

    Informations forums :
    Inscription : Novembre 2002
    Messages : 1 032
    Points : 1 505
    Points
    1 505
    Par défaut
    Citation Envoyé par Gdal
    Une petite question: Es-tu insomniaque ?
    Hier, 22h12
    Aujourd'hui, 02h42
    Disons que j'ai juste du mal à m'endormir le soir...

    J'ai lu deux, trois bookins mais sa ne fait l'expérience que des personnes comme toi peuvent partagées sur les forums de Développez.net
    Je suis pas tout à fait du même avis. Même si j'en lis pas (à part une fois pour débuter sur Access), les bouquins sont au contraire fait par des gens d'expérience et qui ont pris le temps de bien exposer leur idées. C'est pas toujorus le cas sur les forums.
    Et regarde, moi, par exemple, je ne suis pas developpeur professionel et j'ai découvert DotNet y a un peu plus de 6 mois. Donc mes conseils sont à prendre pour autant qu'ils sont bien argumentés et pas par autorité.

    Citation Envoyé par Gdal
    Est-ce le bon chemin ?
    Ca me parait pas mal en effet.
    (\ _ /)
    (='.'=)
    (")-(")

  7. #7
    Membre actif

    Profil pro
    Inscrit en
    Juin 2002
    Messages
    291
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2002
    Messages : 291
    Points : 270
    Points
    270
    Par défaut
    re,

    Ce midi j'ai lu la partie du site plasserre.
    Effectivement, sa représente plus de tafs, de réflexions, mais une fois bien lancé l'application doit gagner en souplesse et en lisibilité.

    Merci pour l'orientation

    Je vais revoir ma copie !

    Gwendal

  8. #8
    Membre à l'essai
    Inscrit en
    Mai 2009
    Messages
    14
    Détails du profil
    Informations forums :
    Inscription : Mai 2009
    Messages : 14
    Points : 17
    Points
    17
    Par défaut anwar
    j'obtient ce message ca fait presque une semaine et je sais pas quoi faire

    DataColumn 'libellé' manquant dans DataTable 'client' pour SourceColumn 'libellé'
    j'ai deux table client et secteur

    j'ajoute dans la table secteur puis je recupère les donnée vers la table client
    mais quand je veux ajouté dans la table client j'obtient le message erreur

    client(nom,prenom, code_sect)
    secteur(code_sect,libellé)

    j'utilise sql server 2000 et visual studio 2008


    mèrci

  9. #9
    Membre actif

    Profil pro
    Inscrit en
    Juin 2002
    Messages
    291
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2002
    Messages : 291
    Points : 270
    Points
    270
    Par défaut
    Salut,

    DataColumn 'libellé' manquant dans DataTable 'client' pour SourceColumn 'libellé'
    A mon avis libellé n'existe pas dans le DataTable, ou alors il y a une faute d'orthographe.

    Autrement essais ici et sélectionne le premier lien.

    Gdal

  10. #10
    Membre à l'essai
    Inscrit en
    Mai 2009
    Messages
    14
    Détails du profil
    Informations forums :
    Inscription : Mai 2009
    Messages : 14
    Points : 17
    Points
    17
    Par défaut
    malheureusement j'ai rien trouvé sur le problème de datacolonne

  11. #11
    Membre actif

    Profil pro
    Inscrit en
    Juin 2002
    Messages
    291
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2002
    Messages : 291
    Points : 270
    Points
    270
    Par défaut
    Salut,

    il faudrait que tu ouvres un nouveau post plutôt que de continuer celui-ci. Tu auras plus de réponses... Montres un peu plus de code.

    Bonne continuation

    Gdal

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

Discussions similaires

  1. Recherche class pour gestion des logfile
    Par altair8080 dans le forum Langage
    Réponses: 1
    Dernier message: 07/08/2013, 13h47
  2. Diagramme de classe pour gestion Stock
    Par othmane41 dans le forum Diagrammes de Classes
    Réponses: 1
    Dernier message: 21/05/2013, 18h34
  3. Organisation class pour gestion BDD
    Par momo l'plus bô dans le forum Langage
    Réponses: 2
    Dernier message: 29/08/2012, 20h29
  4. [PHP 5.2] Classes pour gestion de form et JS
    Par grunk dans le forum Langage
    Réponses: 0
    Dernier message: 24/02/2012, 14h52
  5. Réponses: 2
    Dernier message: 30/03/2007, 17h17

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