none
En VB2008 exp: récupération d'1 champ d'une bd ACCESS ? RRS feed

  • Question

  • J'ai 1 BD ACCESS ( Pagfile ) avec notament 1 Table ( Membres) qui comprend des champs tels-que: nom, pnom, adresse, datenaissance, poids, ...
    Dans VB2008 exp, j'ai un DataSet ( PagfileDataSet.xsd ) ; dans une form j'ai un combobox (MembresCBox ) qui contient les noms de "membres" .
    Apres sélection du nom avec le combobox, je souhaite obtenir le pnom, l'adresse, datenaissance, poids, ...dans des TextBoxs.
    Je rentre le code dans MembresCBox_LostFocus.
    J'ai essayé tous les codes comme:
    TextBox.Text = (
    "SELECT pnom FROM Membres WHERE nom" = MembresCBox.Text)
    Merci de me dire comment.
    vendredi 27 novembre 2009 18:21

Réponses

  • Il y a fort à parier que le paramètre MembresCBox.text n'a pas de valeur. Utiliser MembresCBox.selectedtext me semble approprié...
    mardi 1 décembre 2009 16:43
  • Lors vous passez en mode DEBUG, que vous donne le contenu de la variable retournée par la propriétée Text de votre combo ? J'imagine qu'elle est remplie et que vous essayez de lancer la requête également directement en access pour contrôler que vous obtenez le résultat attendu.
    Enfin, perso, je n'ai pas l'habitude d'utiliser le signe "+" pour effectuer une concaténation en VB. J'emploie plutôt le signe "&". Cependant, le problème ne devrait pas se situer là, car, sauf erreur de ma part, les 2 sont acceptés par le langage.
    lundi 7 décembre 2009 17:12

Toutes les réponses

  • Bonjour,

    Il faut faire :

    Using connexion As OleDbConnection = New OleDbConnection (...)
    	Using commande As OleDbCommand = New OleDbCommand("SELECT pnom FROM Membres WHERE nom = " + MembresCBox.Text)
    		commande.Connection = connexion
    
    		Dim s As String
    
    		s = commande.ExecuteScalar()
    
    	End Using
    End Using
    Cordialement
    Gilles TOURREAU - MVP C# - Architecte .NET/Consultant/Formateur
    dimanche 29 novembre 2009 22:04
    Modérateur
  • Bonjour Gilles,

    Ta réponse m'a bien aidé.
    Toutefois, après avoir ajouté un "connection.Open" et close; sur la ligne s = commande.ExecuteScalar j'ai le message d'erreur suivant:" No value given for 1 or more parametres "
                et pour une sélection précise: " syntax error(missing operator) in querry expression
                                                                                                                  'nom = Onomselectionné' .
    Ensuite, je supose qu'il fallait indiquer: Textbox.Text = s

    Merci.
    lundi 30 novembre 2009 14:09
  • Bonjour,

    L'utilisation de la méthode ExecuteScalar d'une OleDBCommand ne retourne que la première colonne de la première ligne du résultat retourné par ta requête. Avec la requête indiquée (SELECT pnom FROM Membres...), ça ne te posera pas de problème puisque tu ne veux que la première colonne (pour autant que le résultat ne te renvoie qu'une ligne). Mais dans ton post initial, tu indiques vouloir récupérer plus d'une colonne de ta table. Une autre méthode est donc à utiliser, à savoir ExecuteReader (par exemple si tu veux travailler en mode connecté) qui retourne un objet de type OleDbDataReader . En reprenant le code de Gilles, cela donnerait :

    Using
    
     connexion As New OleDbConnection (...)
    
     Using commande As New OleDbCommand("SELECT pnom, adresse, datenaissance, poidsFROM Membres WHERE nom = " + MembresCBox.Text)
    
        commande.Connection = connexion
    Dim monReader As new OleDbDataReader connexion.open()
    monReader = commande.ExecuteReader
    while monReader.Read
    Textbox.Text = monReader.item("pnom")
    ...
    End While
    End Using End Using

    Bien sur dans la requête, tu dois indiquer les champs que tu veux sélectionner et dans la boucle While, tu remplace TextBox par le nom de la tienne. Et tu ajoutes, une ligne pour chaque textbox à laquelle tu assigne la colonne correspondante au moyen de la propriété item(nom de la colonne).

    Ceci est une façon de faire. Il en existe d'autres.

    Idéalement, il faudrait mettre tout ça dans un "try catch" pour gérer une exception si la DB n'est pas disponible, si la requête est mauvaise, ou si tu renvoies une valeur nulle dans une colonne. Mais, on ne va pas trop compliqué. L'essentiel est que ça fonctionne.

    PS : tu n'es pas obligé d'invoquer la méthode close() sur la connexion si tu ouvres la connexion dans une bloc using. Quand tu sors du bloc, la connexion est fermée automatiquement. C'est pour ça que Gille l'utilise. C'est plus sur. On évite de laisser des connexions ouvertes...
    lundi 30 novembre 2009 17:21
  • Merci,

    J'aime beaucoup cette méthode qui me permet de récupérer plusieures données.
    J'ai dù retirer le "NEW" de:" Dim monReader As new OleDbDataReader " qui générait une erreur.
    Toutefois, je reste avec les mêmes messages d'erreur à l'exécution au passage de:
    "monReader = commande.ExecuteReader" à savoir: :" No value given for 1 or more parametres "
    et dans 1 cas seulement: " syntax error(missing operator) in querry expression'nom = nomselectionné' "
    J'ai controlé à nouveau le nom de la table, des colonnes, ..
    Que faire, la solution est proche mais un petit queque-chose bloque.

    Merci à tous.

    mardi 1 décembre 2009 14:42
  • Il y a fort à parier que le paramètre MembresCBox.text n'a pas de valeur. Utiliser MembresCBox.selectedtext me semble approprié...
    mardi 1 décembre 2009 16:43
  • Bonjour,

    selectedtext au lieu de text me donne le message d'erreur suivant:(au niveau de monReader = commande.ExecuteReader) " syntax error(missing operator) in querry expression'nom ='  ". Donc, dans le cas présent il ne comporte pas de valeur. Cette erreur pour 1 membre de la liste seulement.
    Pour les autres membres:
    " No value given for 1 or more parametres " .
    Par contre avec "text", il comporte une valeur que j'ai vérifié par "label1.text = MembresCBox.text" qui m'affiche la bonne valeur.
    J'ai aussi essayé selected.Item et value mais sans succès.

    Merci à tous

    mercredi 2 décembre 2009 13:57
  • JE ne sais pas si c'est pertinant dans ton environnement mais sous vs2008 :
    en mode design tu crées un accessdatasource qui contient l'ID et le nom de tes membres.
    Tu mets une dropdownlist ( dont le datasource est l'acessdatasource précédent, tu afficjes le nom et tu stockes l'ID. Tu actives autopostback.

    Tu crées un 2eme accessdatasource qui pointe vers toutes tes données ( avec l'ID), tu paramètres la clause where avec cible id source control combobox
    Enfin tu mets un formview ( ou detailview) qui a comme datasour ce la ccessdatasource2.

    Cela parait peut-être un peu confus, car tout se fait en mode design avec des assistants.
    Mais ça prend 2mn.

    Pour parcourir tes données en code behind ex  ci dessous.

     Dim accessDataSource1 As New AccessDataSource
            accessDataSource1.DataFile = Application("nom_base")
            accessDataSource1.SelectCommand = "select * from users where email ='" & LoginMail.Text & "' and mdp_user ='" & LoginMotDePasse.Text & "'"
            Dim dv1 As New System.Data.DataView
            dv1 = accessDataSource1.Select(DataSourceSelectArguments.Empty)
            If dv1.ToTable.Rows.Count Then
                'identification OK 
                Session("log") = "OK"
                Session("numero") = dv1.ToTable.Rows(0)(0)
                Session("nom") = dv1.ToTable.Rows(0)(1)
                Session("prenom") = dv1.ToTable.Rows(0)(2)
    ...
    Bon courage
    jeudi 3 décembre 2009 18:50
  • Ce n'est pas faux. Mais ce dont parle Thomas est valable pour la création de site en ASP.Net. Or le premier post évoque un WinForm donc un client Windows. Cette façon de faire n'est donc pas applicable ici.
    jeudi 3 décembre 2009 19:55
  • Merci Thomas,

    Mais comme l'indique "V" il est bien question d'un "Formulaire Windows" (Windows Form).
    N'y a-t-il pas une voie par le DataSet dans lequel figure déjà la Table en question avec ses colonnes et rows.
    Il y a quelques années j'utilisais le Recordset et par "Seek", j'identifiais la ligne contenant les données voulues.

    Merci à tous
    vendredi 4 décembre 2009 14:45
  • Bonjour à tous,

    Le problème ne vient pas de la connexion à la base de donnée mais au SELECT qui ne selectionne rien.

    Using

     

    commande As New OleDbCommand("SELECT adresse, pnom FROM Membres WHERE nom = " + MembresCBox.Text)

    Les noms sont correctes, où est l'erreur?

    Merci

    lundi 7 décembre 2009 14:19
  • Lors vous passez en mode DEBUG, que vous donne le contenu de la variable retournée par la propriétée Text de votre combo ? J'imagine qu'elle est remplie et que vous essayez de lancer la requête également directement en access pour contrôler que vous obtenez le résultat attendu.
    Enfin, perso, je n'ai pas l'habitude d'utiliser le signe "+" pour effectuer une concaténation en VB. J'emploie plutôt le signe "&". Cependant, le problème ne devrait pas se situer là, car, sauf erreur de ma part, les 2 sont acceptés par le langage.
    lundi 7 décembre 2009 17:12
  • Bonjour,

    En fait, le combobox à été conçu par la table du dataset qui donne la liaison à la propriété datasource et ensuite la propriété displaymember me charge la colonne souhaitée.
    Donc lors du débugage, l'espion me confirme bien que la propriété text contient la valeur sélectionnée.
    Mais monReader ne contient pas de valeur!
    Quelle-en est la raison?

    Merci

    mardi 8 décembre 2009 18:17