none
Utilisation de la commande "ExecuteReader" RRS feed

  • Question

  • Bonsoir à tous,

    Pour accéder aux données d'une table Access afin de remplir une ComboBox, j'ai utilisé le code fourni par l'adresse qui m'avait été gentiment donnée ici : http://plasserre.developpez.com/cours/vb-net/?page=bases-donnees2#LXVII-D-2

    Celui-ci marche parfaitement pour remplir la ComboBox (un seul champ).

    Ensuite, dans la foulée, je souhaite récupérer les valeurs correspondant à une ligne de la table Access. Pour cela, j'utilise une commande SQL s'appuyant sur la sélection faite par l'utilisateur au moyen de la ComboBox. Je réutilise exactement le même code que la première fois (sauf que la commande SQL a changé) et là, surprise : le code "Dim myReader As OleDbDataReader = Mycommand.ExecuteReader()" ne passe plus... Le système me signale  "Aucune valeur donnée pour un ou plusieurs paramètres requis". Je demande donc de l'aide pour la commande "ExecuteReader" afin de connaître les paramètres à fournir.(http://msdn.microsoft.com/query/dev10.query?appId=Dev10IDEF1&l=FR-FR&k=k(SYSTEM.DATA.OLEDB.OLEDBCOMMAND.EXECUTEREADER);k(TargetFrameworkMoniker-%22.NETFRAMEWORK%2cVERSION%3dV4.0%22);k(DevLang-VB)&rd=true). Malheureusement cette aide me renvoie à la surcharge IDbCommand.ExecuteReader http://msdn.microsoft.com/fr-fr/library/bb352254.aspx qui m'(informe que "Ce membre est une implémentation d'un membre d'interface explicite. OleDbCommand est castée en interface IDbCommand". Comme je n'ai aucune nouvelle des fameux paramètres manquant et que j'ignore absolument la signification de cet abominable néologisme "casté", dont je ne trouve évidemment aucune traduction, me voilà bloqué. (L'ironie du sort, c'est que je suis traducteur scientifique (Anglais => Français). C'est pour ça que ces néologismes absolument non justifiés me font bondir. J'ai connu un MICROSOFT très à cheval sur les traductions, mais apparemment, la mode a changé...)

    Quelqu'un pourrait-il me fournir encore de l'aide ?

    P.S. patricx avait un problème similaire en 2009 (http://social.msdn.microsoft.com/Forums/fr-FR/889/thread/f864f9ee-8d89-4616-9e9e-7f202465c98a/) apparemment, personne ne lui a trouvé de solution...<span data-guid="91f57b4be405caf0e557b2869dd1bf3f" data-source="It can be used only when the OleDbCommand instance is cast to an IDbCommand interface." id="mt4" style="font-family:'Segoe UI', Verdana, Arial;font-size:13px;line-height:normal;text-align:left;">

     

    Pierre Allemand

    samedi 31 mars 2012 22:48

Réponses

  • Salut Pierre Allemand

    j'ai lu le probleme de Patricx posé en 2009

    effectivement il ne fut pas resolu parce que le probleme reside dans la requete au niveau des cotes (")

    il ya un nombre insuffisant de cote si ta requete est comme pour patricx

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

    il y aura une erreur faire plutot ceci (3 cotes avant et 4 cotes apres le MembreCbox.text)

    "SELECT prenom, adresse FROM Membres WHERE nom=""" + MembresCBox.Text + """"

    Amicalement.


    la FOI déplace les montagnes et bien DOTNET les effaces complétement.

    dimanche 1 avril 2012 09:10
  • Dans votre CommandText, vous avez @Nature. C'est là ou se trouve le paramètre.

    Dans AddWithValue, vous spécifiez la valeur de ce paramètre.

    Donc si vous voulez mettre TotoARoulette comme nom de paramètre (mouai, bof comme nom ;-)) :

    Mycommand.CommandText = "SELECT Couleur FROM NatureLameTest WHERE Nature = @TotoARoulette"
    Mycommand.Parameters.AddWithValue("@TotoARoulette", Combo1.Text)

    Si vous en avez plusieurs, vous verrez que c'est encore plus lisible :

    Mycommand.CommandText = "SELECT Nom, Age FROM Personnes WHERE CP = @CP AND Age > @Age AND Societe = @Societe"
    Mycommand.Parameters.AddWithValue("@CP", 64)
    Mycommand.Parameters.AddWithValue("@Societe", "c2i.fr")
    Mycommand.Parameters.AddWithValue("@Age", 18)

    Je cherche ici dans la bdd dans le 64, chez c2i.fr, le nom et l'age des personnes ayant plus de 18 ans. Plus lisible non ?


    Richard Clark
    Consultant - Formateur .NET
    http://www.c2i.fr
    Depuis 1996: le 1er site .NET francophone

    lundi 2 avril 2012 08:01

Toutes les réponses

  • Salut Pierre Allemand

    j'ai lu le probleme de Patricx posé en 2009

    effectivement il ne fut pas resolu parce que le probleme reside dans la requete au niveau des cotes (")

    il ya un nombre insuffisant de cote si ta requete est comme pour patricx

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

    il y aura une erreur faire plutot ceci (3 cotes avant et 4 cotes apres le MembreCbox.text)

    "SELECT prenom, adresse FROM Membres WHERE nom=""" + MembresCBox.Text + """"

    Amicalement.


    la FOI déplace les montagnes et bien DOTNET les effaces complétement.

    dimanche 1 avril 2012 09:10
  • Bonjour mmw01

    Merci beaucoup pour cette réponse claire et précise. 

    De mon coté, j'ai encore travaillé 2 heures... pour finalement arriver à une solution similaire :

    J'ai remplacé les " par des ' dans la requête SQL ce qui donne finalement ceci dans mon cas : 

     Mycommand.CommandText = "SELECT Couleur FROM NatureLameTest WHERE Nature = '" & ComboBox1.Text & "'"

    (Un ' avant le ComboBox1.Text et un ' après)

    Cordialement


    Pierre Allemand

    dimanche 1 avril 2012 09:19
  • Ne JAMAIS faire de concaténation pour la création d'une requête. C'est très important d'avoir ce genre de réflexe car cela vous préviens de pb d'injection SQL (donc de piratage de votre base).

    Il est préférable d'écrire plutôt :

    Mycommand.CommandText = "SELECT Couleur FROM NatureLameTest WHERE Nature = @Nature"
    Mycommand.Parameters.AddWithValue("@Nature", Combo1.Text)

    Vous avez de plus comme avantages :

    • Plus de pb d'injection SQL
    • Une requête SQL plus lisible
    • Pas de ' pour encadrer les textes (et pas à se soucier si le texte comprend un ')


    Richard Clark
    Consultant - Formateur .NET
    http://www.c2i.fr
    Depuis 1996: le 1er site .NET francophone

    lundi 2 avril 2012 07:12
  • Bonjour Richard,

    J'ai bien compris la mise en garde, mais je n'ai pas tout à fait assimilé la solution.

    Quelle est la dimension (type ou autre) de @Nature ? doit il être déclaré quelque part ? Peut-il être remplacé par @Nimportequoi


    Pierre Allemand

    lundi 2 avril 2012 07:54
  • Dans votre CommandText, vous avez @Nature. C'est là ou se trouve le paramètre.

    Dans AddWithValue, vous spécifiez la valeur de ce paramètre.

    Donc si vous voulez mettre TotoARoulette comme nom de paramètre (mouai, bof comme nom ;-)) :

    Mycommand.CommandText = "SELECT Couleur FROM NatureLameTest WHERE Nature = @TotoARoulette"
    Mycommand.Parameters.AddWithValue("@TotoARoulette", Combo1.Text)

    Si vous en avez plusieurs, vous verrez que c'est encore plus lisible :

    Mycommand.CommandText = "SELECT Nom, Age FROM Personnes WHERE CP = @CP AND Age > @Age AND Societe = @Societe"
    Mycommand.Parameters.AddWithValue("@CP", 64)
    Mycommand.Parameters.AddWithValue("@Societe", "c2i.fr")
    Mycommand.Parameters.AddWithValue("@Age", 18)

    Je cherche ici dans la bdd dans le 64, chez c2i.fr, le nom et l'age des personnes ayant plus de 18 ans. Plus lisible non ?


    Richard Clark
    Consultant - Formateur .NET
    http://www.c2i.fr
    Depuis 1996: le 1er site .NET francophone

    lundi 2 avril 2012 08:01