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

VB.NET Discussion :

[Débutant] Affichage de valeurs de champs d'une BD Access via VB


Sujet :

VB.NET

  1. #1
    Membre à l'essai
    Profil pro
    Étudiant
    Inscrit en
    Avril 2008
    Messages
    30
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2008
    Messages : 30
    Points : 12
    Points
    12
    Par défaut [Débutant] Affichage de valeurs de champs d'une BD Access via VB
    Bonjour à tous,

    Je souhaite écrire le programme suivant :

    Lorsque je clique sur un bouton, le programme ouvre une base de données Access 2007, lit une requête sql et affiche par des MsgBox successives chaque valeur des champs demandés par la requête.

    J'ai donc produit le code suivant :

    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
    Private Sub Command6_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Command6.Click
     
            'Définition du pilote de connexion
            cnx.Provider = "Microsoft.ACE.OLEDB.12.0"
            'Définition de la chaîne de connexion
            cnx.ConnectionString = "H:\TX\[TX] IHM\Reverse_Engineering_Application.NET\Test.accdb"
            'Ouverture de la base de données
            cnx.Open()
     
            rst.Open("SELECT Test FROM Table_Test", cnx)
     
            'Affichage des valeurs du champ Test
            While Not (rst.EOF)
     
                MsgBox(rst("Test"))
     
                rst.MoveNext()
            End While
     
        End Sub
    Il semblerait que le programme parvient à ouvrir la base mais malheureusement, j'obtient le message d'erreur suivant lors de l'affichage des MsgBox :

    Une exception non gérée du type 'System.ArgumentException' s'est produite dans Microsoft.VisualBasic.dll

    Informations supplémentaires*: L'argument 'Prompt' ne peut pas être converti en type 'String'.


    Pouvez-me m'aider à résoudre ce problème ?

  2. #2
    Membre actif
    Profil pro
    Inscrit en
    Septembre 2007
    Messages
    240
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2007
    Messages : 240
    Points : 254
    Points
    254
    Par défaut
    Il te dit que les données que tu essayes de passer en titre de ta messageBox ne peuvent pas être converties en chaine de caractères.
    Tu devrait essayer de caster avec Cstr ou peut être vérifier que tes données ne sont pas nulles ...

  3. #3
    Rédacteur/Modérateur


    Homme Profil pro
    Développeur .NET
    Inscrit en
    Février 2004
    Messages
    19 875
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2004
    Messages : 19 875
    Points : 39 749
    Points
    39 749
    Par défaut
    C'est quoi cette variable "rst" ?
    Je comprends pas trop ta méthode pour accéder à la base... ça n'a pas l'air d'être de l'ADO.NET en tous cas

  4. #4
    Membre à l'essai
    Profil pro
    Étudiant
    Inscrit en
    Avril 2008
    Messages
    30
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2008
    Messages : 30
    Points : 12
    Points
    12
    Par défaut
    Oups, désolé, j'ai oublié de préciser les déclarations de variables :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    Dim cnx As New ADODB.Connection
    Dim rst As New ADODB.Recordset
    @ Totanne : merci du conseil, je vais tester cela.

    @ tomlev : il me semble que si, à moins que je me trompes, je ne connais pas trop, peux-tu préciser ?

  5. #5
    Rédacteur/Modérateur


    Homme Profil pro
    Développeur .NET
    Inscrit en
    Février 2004
    Messages
    19 875
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2004
    Messages : 19 875
    Points : 39 749
    Points
    39 749
    Par défaut
    Ah ok... c'est ADODB, pas ADO.NET
    J'imagine que tu as récupéré ce code d'une appli en VB6 ? En .NET il y a une nouvelle architecture d'accès aux bases de données (ADO.NET), pour en savoir plus je t'invite à consulter les tutoriels :
    http://dotnet.developpez.com/cours/?...bnet#sqlservvb

  6. #6
    Membre à l'essai
    Profil pro
    Étudiant
    Inscrit en
    Avril 2008
    Messages
    30
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2008
    Messages : 30
    Points : 12
    Points
    12
    Par défaut
    En fait c'est en fouillant sur le net que j'avais trouvé des infos sur ADODB, ça me semblait bien.
    Je vais jeté un oeil à ton lien, merci

  7. #7
    Membre à l'essai
    Profil pro
    Étudiant
    Inscrit en
    Avril 2008
    Messages
    30
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2008
    Messages : 30
    Points : 12
    Points
    12
    Par défaut
    J'ai testé en castant mon champ rst("Test") avec cette modification :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    MsgBox(CStr(rst("Test")))
    Mais à nouveau, message d'erreur :

    Une exception non gérée du type 'System.InvalidCastException' s'est produite dans Reverse_Engineering_Application.exe

    Informations supplémentaires*: Impossible d'effectuer un cast d'un objet de type 'ADODB.InternalField' en type 'System.String'.


    Une autre idée peut-être?

  8. #8
    Membre à l'essai
    Profil pro
    Étudiant
    Inscrit en
    Avril 2008
    Messages
    30
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2008
    Messages : 30
    Points : 12
    Points
    12
    Par défaut
    OK, j'ai résolu le problème ainsi :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    MsgBox(rst("Test").Value)
    Bonne soirée.

  9. #9
    Rédacteur/Modérateur


    Homme Profil pro
    Développeur .NET
    Inscrit en
    Février 2004
    Messages
    19 875
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2004
    Messages : 19 875
    Points : 39 749
    Points
    39 749
    Par défaut
    N'empêche, tu devrais quand même passer à ADO.NET... c'est conçu spécifiquement pour .NET, contrairement à ADODB. Enfin, après, tu fais ce que tu veux...

  10. #10
    Membre à l'essai
    Profil pro
    Étudiant
    Inscrit en
    Avril 2008
    Messages
    30
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2008
    Messages : 30
    Points : 12
    Points
    12
    Par défaut
    Pas de soucis, je vais m'y mettre pour le moment, je teste un peu.

  11. #11
    Membre à l'essai
    Profil pro
    Étudiant
    Inscrit en
    Avril 2008
    Messages
    30
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2008
    Messages : 30
    Points : 12
    Points
    12
    Par défaut
    Bonjour,

    Je pensais mes problèmes résolus mais je reviens vers vous pour une autre interrogation.
    En fait, je souhaite réaliser un programme permettant de choisir parmis une liste de procédés de fabrication et de règles métier associées à ces procédés. Les données sont enregistrées dans une base de données Access 2007.

    Je dispose d'une fenêtre dans laquelle sont disposées deux ListBox appelées "ListManufacturing" et "ListRules". Il s'agit donc de lier ces ListBox au contenu de deux tables :
    1. une première appelée "Manufacturing" avec comme attributs : N° et Manufacturing_Name(clé)
    2. une seconde appelée "Rules" avec comme attributs : N° (clé), Manufacturing_Name et Rule_Name


    Le lien entre les deux est évidemment l'attribut "Manufacturing_Name".

    Je parviens à remplir la ListBox "ListManufacturing" avec le code suivant :

    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
      Private Sub OpenDB_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles OpenDB.Click
     
            Me.ListManufacturing.Items.Clear()
     
            'DataBase Importation
            importDB.Title = "Select the DataBase"
            importDB.DefaultExt = "accdb"
            importDB.Filter = "Access 2007 DataBase|*.accdb|Access 2003 DataBase|*.mdb"
            importDB.Multiselect = False
            importDB.ShowDialog()
            DBpath = importDB.FileName
     
            'Définition du pilote de connexion
            cnx.Provider = "Microsoft.ACE.OLEDB.12.0"
     
            'Définition de la chaîne de connexion
            cnx.ConnectionString = DBpath
     
            Try
                'DB Opening
                cnx.Open()
     
                'Query
                rstManufacturing.Open("SELECT Manufacturing_Name FROM Manufacturing", cnx)
     
                'Manufacturing ListBox Filling
                While Not (rstManufacturing.EOF)
                    ListManufacturing.Items.Add(rstManufacturing("Manufacturing_Name").Value)
                    rstManufacturing.MoveNext()
                End While
     
            Catch ex As Exception
                MsgBox(Err.Number & vbCrLf & Err.Description, vbCritical, "Error!")
            Finally
                cnx.Close()
            End Try
     
        End Sub
    Mais je ne parviens pas à remplir la seconde en tenant compte de la sélection de la première :

    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
     Private Sub ListManufacturing_Change()
     
            Me.ListRules.Items.Clear()
            Dim MyConnexion As OleDbConnection = New OleDbConnection("Provider=Microsoft.ACE.OLEDB.12.0;Data source=H:\TX\[TX] IHM\Reverse_Engineering_Application.NET\Test.accdb")
            Dim MyCommand As OleDbCommand = MyConnexion.CreateCommand()
            MyCommand.CommandText = "SELECT Rules.Rule_Name FROM Rules WHERE Rules.Manufacturing_Name ='" & Me.ListManufacturing.SelectedItem & "';"
            MyConnexion.Open()
            Dim MyReader As OleDbDataReader = MyCommand.ExecuteReader()
            Do While MyReader.Read()
                Me.ListRules.Items.Add(MyReader.GetString(0))
            Loop
            MyReader.Close()
            MyConnexion.Close()
            'fermeture dès la fin de la lecture
            'Dim myReader As OleDbDataReader = Mycommand.ExecuteReader(CommandBehavior.CloseConnection)
     
        End Sub
    Pour cette seconde partie de code, je me suis essayé à l'ADO.NET comme tu me l'avais suggérer tomlev, il est vrai que c'est plutôt pas mal.

    Je n'ai pas de message d'erreur particulier, après le remplissage de ListManufacturing, rien ne se passe, je ne vois pas pourquoi, peut-être la formalisation de la requête ?

    Quelqu'un aurait quelques pistes à me donner ?

  12. #12
    Membre à l'essai
    Profil pro
    Étudiant
    Inscrit en
    Avril 2008
    Messages
    30
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2008
    Messages : 30
    Points : 12
    Points
    12
    Par défaut
    OK, je viens de saisir pourquoi !

    je n'ai pas définit le bon évènement, j'ai donc remplacer :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Private Sub ListManufacturing_Change()
    par :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Private Sub ListManufacturing_SelectedIndexChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles ListManufacturing.SelectedIndexChanged
    Désolé pour le dérangement.

  13. #13
    Rédacteur/Modérateur


    Homme Profil pro
    Développeur .NET
    Inscrit en
    Février 2004
    Messages
    19 875
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2004
    Messages : 19 875
    Points : 39 749
    Points
    39 749
    Par défaut
    Citation Envoyé par GuixInDaMixx Voir le message
    Désolé pour le dérangement.
    Pas de problème, on est là pour aider... pense juste au tag si ton problème est réglé

  14. #14
    Membre à l'essai
    Profil pro
    Étudiant
    Inscrit en
    Avril 2008
    Messages
    30
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2008
    Messages : 30
    Points : 12
    Points
    12
    Par défaut
    Bonjour,

    Ok, avec le changement d'évènements et le cours de Philippe Lasserre sur VB.NET (http://plasserre.developpez.com/vsommair.htm) notamment sur ADO, je n'ai plus de soucis.

    Merci bien.

  15. #15
    Membre à l'essai
    Profil pro
    Étudiant
    Inscrit en
    Avril 2008
    Messages
    30
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2008
    Messages : 30
    Points : 12
    Points
    12
    Par défaut Nouveau problème
    Bonsoir,

    Plutôt que d'ouvrir une nouvelle discussion, je continue de poster ici, comme le problème reste dans le même domaine.

    Je dispose à présent de 3 tables Access :

    1. Manufacturing (N°,Manufacturing_Name)
    2. Rules (N°,Manufacturing_Name,Rule_Name)
    3. Features (N°,Rule_Name,Feature_Name)


    avec les contraintes d'intégrité référentielles suivantes :
    1. 1 Manufacturing.Manufacturing_Name - Plusieurs Rules.Manufacturing_Name
    2. 1 Rules.Rule_Name - Plusieurs Features.Rule_Name


    que je souhaite lier à 3 ListBox :

    1. ListManufacturing
    2. ListRules
    3. ListFeatures


    Pour ListManufacturing, aucun problème, au chargement de la base, je parvient à la remplir.

    Ensuite, à la sélection d'un item de ListManufacturing, je parviens à mettre à jour les items de ListRules avec le code suivant :

    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
    Private Sub ListManufacturing_SelectedValueChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles ListManufacturing.SelectedIndexChanged
     
            'le DataReader permet une lecture la plus rapide mais en lecture seul
            Me.ListRules.Items.Clear()
            'Me.ListRules.Text = "Select the Rule..."
            'Me.ListFeatures.Text = "Select the Feature..."
            Dim MyConnexion As OleDbConnection = New OleDbConnection("Provider=Microsoft.ACE.OLEDB.12.0;Data source=H:\TX\[TX] IHM\Reverse_Engineering_Application.NET\Test.accdb")
            Dim MyCommand As OleDbCommand = MyConnexion.CreateCommand()
            MyCommand.CommandText = "SELECT Rules.Rule_Name FROM Rules WHERE Rules.Manufacturing_Name ='" & Me.ListManufacturing.SelectedItem & "';"
            MyConnexion.Open()
            'ajout des résultats de la requête dans ListRules
            Dim MyReader As OleDbDataReader = MyCommand.ExecuteReader()
            Do While MyReader.Read()
                Me.ListRules.Items.Add(MyReader.GetString(0))
            Loop
            'fermeture du monopole de lecture
            MyReader.Close()
            MyConnexion.Close()
            'fermeture dès la fin de la lecture
            'Dim myReader As OleDbDataReader = Mycommand.ExecuteReader(CommandBehavior.CloseConnection)
     
        End Sub
    Le problème survient avec ListFeatures : j'ai tenté de la remplir en procédant comme ListRules :

    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
    Private Sub ListRules_SelectedValueChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles ListManufacturing.SelectedIndexChanged
     
            'le DataReader permet une lecture la plus rapide mais en lecture seul
            Me.ListFeatures.Items.Clear()
            'Me.ListFeatures.Text = "Select the Feature..."
            Dim MyConnexion As OleDbConnection = New OleDbConnection("Provider=Microsoft.ACE.OLEDB.12.0;Data source=H:\TX\[TX] IHM\Reverse_Engineering_Application.NET\Test.accdb")
            Dim MyCommand As OleDbCommand = MyConnexion.CreateCommand()
            MyCommand.CommandText = "SELECT Features.Feature_Name FROM Features,Rules WHERE Features.Rule_Name = Rules.Rule_Name AND Rules.Manufacturing_Name ='" & Me.ListManufacturing.SelectedItem & "' AND Features.Rule_Name ='" & Me.ListRules.SelectedItem & "';"
            MyConnexion.Open()
            'ajout des résultats de la requête dans ListFeatures
            Dim MyReader As OleDbDataReader = MyCommand.ExecuteReader()
            Do While MyReader.Read()
                Me.ListFeatures.Items.Add(MyReader.GetString(0))
            Loop
            'fermeture du monopole de lecture
            MyReader.Close()
            MyConnexion.Close()
            'fermeture dès la fin de la lecture
            'Dim myReader As OleDbDataReader = Mycommand.ExecuteReader(CommandBehavior.CloseConnection)
     
        End Sub
    mais rien n'y fait, je dois sélectionner à nouveau l'item sélectionné au tout début de ListManufacturing (la première ListBox) pour que le contenu de ListFeatures apparaisse.

    -> Quelqu'un a une idée de la source du problème ?
    (je soupçonne ma requête SQL ou peut-être qu'il s'agit de l'évènement déclencheur...)

    -> Par ailleurs, est-il possible de ne pas avoir à me reconnecter à la base comme je le fais à chaque fois, c'est-à-dire de garder la connexion ?

    Merci beaucoup et bonne nuit à tous !

  16. #16
    Rédacteur/Modérateur


    Homme Profil pro
    Développeur .NET
    Inscrit en
    Février 2004
    Messages
    19 875
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2004
    Messages : 19 875
    Points : 39 749
    Points
    39 749
    Par défaut
    Tu devrais quand-même ouvrir une nouvelle discussion, sinon personne va venir voir, parce qu'il y a déjà plein de réponses...
    Quant à moi, je vais pas regarder ça maintenant, vu l'heure

  17. #17
    Membre à l'essai
    Profil pro
    Étudiant
    Inscrit en
    Avril 2008
    Messages
    30
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2008
    Messages : 30
    Points : 12
    Points
    12
    Par défaut
    OK, j'ai créé une nouvelle discussion :

    http://www.developpez.net/forums/sho...d.php?t=538835

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

Discussions similaires

  1. Changer la valeur d'un champs d'une table acces via vba
    Par gege22mars dans le forum VBA Access
    Réponses: 4
    Dernier message: 10/09/2007, 20h37
  2. Valeurs des champs dans une liste
    Par Sly2k dans le forum Access
    Réponses: 21
    Dernier message: 11/08/2006, 14h15
  3. Réponses: 1
    Dernier message: 19/03/2006, 20h52
  4. [MySQL] Affichage de valeurs par selection dans une table
    Par Flushovsky dans le forum PHP & Base de données
    Réponses: 9
    Dernier message: 16/12/2005, 17h04
  5. affichage de TOUS les champs d'une table
    Par babulior dans le forum ASP
    Réponses: 6
    Dernier message: 28/06/2005, 15h33

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