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 :

Requête paramétrée causant problème [Débutant]


Sujet :

VB.NET

  1. #1
    Membre éclairé
    Inscrit en
    Mai 2004
    Messages
    304
    Détails du profil
    Informations personnelles :
    Âge : 71

    Informations professionnelles :
    Secteur : Santé

    Informations forums :
    Inscription : Mai 2004
    Messages : 304
    Par défaut Requête paramétrée causant problème
    Bonjour
    J'ai créé un formulaire pour afficher la biographie d'acteurs
    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 ResultatBioActeurNom_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
            TBActeur.Text = InterroBioActeurNom.TextBoxActeur.Text
            Dim MyConnexion As OleDbConnection = New OleDbConnection("Provider=Microsoft.Jet.OLEDB.4.0;Data source=" & _
           "C:\Access\DvdData.mdb")
            Dim Mycommand As OleDbCommand = MyConnexion.CreateCommand()
     
            Mycommand.Parameters.Add("@Acteur", OleDbType.VarChar, 50)
            Mycommand.Parameters("@Acteur").Value = TBActeur.Text
            Mycommand.CommandText = "SELECT distinct Acteur1,Sexe,Nationalité,Photo,Naissance,[Ville Naissance]," & _
            "PaysNaissance,Mort,[Ville DC],PaysDC,AgeMort,Drapeau FROM Filmographie WHERE acteur1 like @Acteur"
            MyConnexion.Open()
            Dim myReader As OleDbDataReader = Mycommand.ExecuteReader()
     
            Do While myReader.Read()
                Me.Text = "Nom d'acteur contenant " & TBActeur.Text
                Dim nbrecords As Integer
                nbrecords = myReader.FieldCount.ToString
                If nbrecords = 0 Then
                    MsgBox("Pas d'acteur correspondant", 48, "Collection de DVD")
                    Me.Close()
                End If
    Je n'ai mis que le début du code
    Le problème est que si je tape "Alain Delon" ça fonctionne
    Par contre si je cherche tous les Delon en tapant seulement Delon rien ne s'affiche
    De plus si je tape un nom qui n'existe pas, je n'ai pas le message d'erreur

    Ensuite j'ai une autre question, comment naviguer dans myreader avec des boutons suivant,précédent etc
    Merci d'avance de vos conseils

  2. #2
    Membre émérite

    Homme Profil pro
    Inscrit en
    Mars 2012
    Messages
    691
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Israël

    Informations forums :
    Inscription : Mars 2012
    Messages : 691
    Par défaut
    Salut

    Le problème est que si je tape "Alain Delon" ça fonctionne
    et quelle liste de nom tu obtiens ?

    Par contre si je cherche tous les Delon en tapant seulement Delon rien ne s'affiche
    As tu dans ta table un champ acteur1 qui commence par DELON ?
    Regarde http://www.techonthenet.com/access/queries/like.php

  3. #3
    Membre Expert Avatar de callo
    Homme Profil pro
    Administrateur systèmes et réseaux
    Inscrit en
    Février 2004
    Messages
    887
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Togo

    Informations professionnelles :
    Activité : Administrateur systèmes et réseaux
    Secteur : Service public

    Informations forums :
    Inscription : Février 2004
    Messages : 887
    Par défaut
    Citation Envoyé par Jean-Luc80 Voir le message
    Par contre si je cherche tous les Delon en tapant seulement Delon rien ne s'affiche
    Si tu veux avoir un tel comportement, il te faut faire ta requête comme ceci:
    Code vb.net : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    Dim Mycommand As OleDbCommand = MyConnexion.CreateCommand()
    Mycommand.CommandText = "SELECT distinct Acteur1,Sexe,Nationalité,Photo,Naissance,[Ville Naissance]," & _
    "PaysNaissance,Mort,[Ville DC],PaysDC,AgeMort,Drapeau FROM Filmographie WHERE acteur1 like '%" & ?Acteur & "%' " 
    Mycommand.Parameters.Add("?Acteur", OleDbType.VarChar, 50)
    Mycommand.Parameters("?Acteur").Value = TBActeur.Text

    Note l'utilisation des % dans la clause LIKE.

    Autre chose: vu que tu es sous Access, tes paramètres devraient être précédés de ? et non @. Regarde ceci et aussi cette discussion.

    Citation Envoyé par Jean-Luc80 Voir le message
    De plus si je tape un nom qui n'existe pas, je n'ai pas le message d'erreur
    C'est normal vu que tu as placé ton code dans la boucle do while, ce qui n'a aucun sens. Lorsque le nom n'existe pas, le code à l'intérieur de la boucle n'est pas exécuté. La portion de code qui suit devrait donc être en dehors de la boucle
    Code vb.net : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    Me.Text = "Nom d'acteur contenant " & TBActeur.Text
                Dim nbrecords As Integer
                nbrecords = myReader.FieldCount.ToString
                If nbrecords = 0 Then
                    MsgBox("Pas d'acteur correspondant", 48, "Collection de DVD")
                    Me.Close() ' pourquoi fermer le formulaire ici ???
                End If

    Mais il serait mieux de faire un truc du genre:
    Code vb.net : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    If myReader.HasRows Then 
        Do While myReader.Read()
           ' faire tes traitements ici
       Loop
    Else 
      MsgBox("Pas d'acteur correspondant", 48, "Collection de DVD")
    End if

    [Edit]Je viens de remarquer ceci:
    Code vb.net : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    Dim nbrecords As Integer
    nbrecords = myReader.FieldCount.ToString
    Tu dois faire attention, car FieldCount te retourne le nombre de colonnes figurant dans la ligne actuelle de ton OleDbDataReader. Elle n'indique pas les lignes que contient ton OleDbDataReader.[/Edit]

  4. #4
    Membre éclairé
    Inscrit en
    Mai 2004
    Messages
    304
    Détails du profil
    Informations personnelles :
    Âge : 71

    Informations professionnelles :
    Secteur : Santé

    Informations forums :
    Inscription : Mai 2004
    Messages : 304
    Par défaut
    Bonjour
    Merci du conseil mais ça ne fonctionne pas
    J'ai une erreur de syntaxe (Expression attendue) au niveau ?Acteur de la requête
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    Mycommand.CommandText = "SELECT distinct Acteur1,Sexe,Nationalité,Photo,Naissance,[Ville Naissance]," & _
    "PaysNaissance,Mort,[Ville DC],PaysDC,AgeMort,Drapeau FROM Filmographie WHERE acteur1 like '%" & ?Acteur & "%' " 
    Mycommand.Parameters.Add("?Acteur", OleDbType.VarChar, 50)
    Mycommand.Parameters("?Acteur").Value = TBActeur.Text

  5. #5
    Membre expérimenté
    Avatar de Kropernic
    Homme Profil pro
    Analyste / Programmeur / DBA
    Inscrit en
    Juillet 2006
    Messages
    3 932
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : Belgique

    Informations professionnelles :
    Activité : Analyste / Programmeur / DBA
    Secteur : Distribution

    Informations forums :
    Inscription : Juillet 2006
    Messages : 3 932
    Par défaut
    Dans la requête, il ne faut pas sortir "?Acteur" de la chaîne de caractère.

    J'imagine que c'est un programme personnel pour la maison donc pas trop grave mais j'aimerais pointer un problème de modélisation (et s'il s'agit d'un programme pro, alors c'est plus ennuyant).

    D'après ce que je déduis de la requête, il y a apparemment dans la DB une table nommé Filmographie contenant notamment la colonne acteur1. Cette colonne contient apparemment les noms et prénoms d'un acteur.

    Tu es déjà toi-même tombé sur un des écueils de cette modélisation qui fait que tu as du modifier ta requête afin de parvenir à trouver tous les acteurs se nommant Delon.

    Maintenant, pour continuer avec l'exemple de Alain Delon, que se passera-t-il si l'utilisateur entre comme critère de recherche "Delon Alain". A nouveau, ta requête ne renverra pas le résultat escompté.

    Pour améliorer cela, il aurait mieux valu avoir une table séparée contenant les acteurs. Nommons par exemple cette table Acteur et attribuons lui les colonnes suivantes :
    • id : type entier autoincrémenté (clef primaire)
    • nom : type caractère de longueur variable de taille max à définir
    • prénom : type caractère de longueur variable de taille max à définir
      • N.B. : les colonnes nom et prénom pourront faire l'objet d'un index unique afin d'éviter d'avoir plusieurs alain delon dans la table. En cas d’homonymie, ajoutez alors une colonne contenant la date de naissance et ajouter là à cet index unique.



    Ensuite, dans votre table Filmographie, plutôt d'avoir une colonne reprenant les noms et prénoms des acteurs (ce qui soit dit en passant est une violation de la première forme normale), vous auriez une colonne acteur_id qui contiendrait le numéro unique de l'acteur en question.

    Une fois cela en place, vous pourrez mettre en place une requête qui vous retournera l'information attendue que vous entriez comme paramètre soit le nom, soit le prénom ou les deux.

  6. #6
    Membre Expert Avatar de callo
    Homme Profil pro
    Administrateur systèmes et réseaux
    Inscrit en
    Février 2004
    Messages
    887
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Togo

    Informations professionnelles :
    Activité : Administrateur systèmes et réseaux
    Secteur : Service public

    Informations forums :
    Inscription : Février 2004
    Messages : 887
    Par défaut
    Citation Envoyé par Jean-Luc80 Voir le message
    ça ne fonctionne pas
    J'ai une erreur de syntaxe (Expression attendue) au niveau ?Acteur de la requête
    Essayes comme ceci voir:
    Code vb.net : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    Dim Mycommand As OleDbCommand = MyConnexion.CreateCommand()
    Mycommand.CommandText = "SELECT distinct Acteur1,Sexe,Nationalité,Photo,Naissance,[Ville Naissance]," & _
    "PaysNaissance,Mort,[Ville DC],PaysDC,AgeMort,Drapeau FROM Filmographie WHERE acteur1 like ?Acteur" 
    Mycommand.Parameters.AddWithValue("@Acteur", "%" +TBActeur.Text+ "%")
    'ou encore Mycommand.Parameters.AddWithValue("Acteur", "%" +TBActeur.Text+ "%")

    Regarde ce lien msdn.

    +1 pour les rermarques de Kropernic.

  7. #7
    Membre éclairé
    Inscrit en
    Mai 2004
    Messages
    304
    Détails du profil
    Informations personnelles :
    Âge : 71

    Informations professionnelles :
    Secteur : Santé

    Informations forums :
    Inscription : Mai 2004
    Messages : 304
    Par défaut
    Bonjour
    La solution de Callo semble être la bonne, ça fonctionne même si j'ai un acteur qui s'appelle Denis D'Ines (c'est l'apostrophe qui me causait souci)
    Par contre je n'ai pas de réponse quant à la navigation dans mes enregistrements si j'ai par exemple plusieurs acteurs dont le prénom est Michel
    J'ai créé quatre boutons premier,dernier,suivant et précédent
    Je pense qu'il faut utiliser un datagrid et un dataset mais je ne sais pas comment m'y prendre
    Votre aide me sera précieuse
    Merci

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

Discussions similaires

  1. Réponses: 4
    Dernier message: 30/03/2008, 21h56
  2. Problème requête paramétrée
    Par mechatikhaled dans le forum Bases de données
    Réponses: 4
    Dernier message: 19/03/2008, 23h55
  3. [ADO] Problème avec LIKE dans requête paramétrée
    Par _skip dans le forum Connexion aux bases de données
    Réponses: 7
    Dernier message: 04/11/2007, 20h53
  4. Problème de requête paramétrée sur Access
    Par patbeautifulday1 dans le forum ASP.NET
    Réponses: 1
    Dernier message: 17/07/2007, 12h15
  5. Problème requête paramétrée mysqli
    Par Ethylene dans le forum Installation
    Réponses: 5
    Dernier message: 15/05/2006, 16h57

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