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

Windows Forms Discussion :

Requetes paramétrées: recherche par mot clé


Sujet :

Windows Forms

  1. #1
    Membre du Club
    Inscrit en
    Mai 2009
    Messages
    172
    Détails du profil
    Informations forums :
    Inscription : Mai 2009
    Messages : 172
    Points : 49
    Points
    49
    Par défaut Requetes paramétrées: recherche par mot clé
    Bonjour à tous,
    J'aimerais faire un petit système de recherche par mot clé sur deux champs (nom et prénom): l'utilisateur rentre quelque chose et la requete regarde ensuite tous les nom ou prénom comportant au moins un des mots.

    J'utilise la méthode split pour découper le résultat du text box en plusieurs mots.
    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
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
     
                string recherche = this.textBox1.Text;
                if (recherche.Length >0)
                {//Si il a bien rentré quelque chose
                    string strConnexion = @"Data Source=|DataDirectory|\Database\" + info_db + ".sdf;Password=*******;Persist Security Info=True";
                    try
                    {
                        System.Data.SqlServerCe.SqlCeConnection connev = new System.Data.SqlServerCe.SqlCeConnection(strConnexion);
     
                        connev.Open();
                        if (this.comboBox3.SelectedIndex == 0)
                        {//C'est les joueurs
                            string texte_requete = "SELECT joueur_nom,joueur_prenom,taille FROM DYN_joueur WHERE";
                            string[] singleWords = recherche.Split(new char[]{' '}); // on extrait chaque mot via le séparateur espace
                            int longueur = singleWords.Length;
                            int i = 0;
                            string[] nom = new string[longueur];
                            string[] prenom = new string[longueur];
     
     
                            while (i <= (longueur-1))
                            {
                                if (i != 0)
                                {
                                    texte_requete += texte_requete + " AND";
                                }
                                texte_requete += "(joueur_nom LIKE '%@param" + i+"%'";
                                texte_requete += " OR joueur_prenom LIKE '%@prenom" + i+"%')";
                                nom[i] = singleWords[i];
                                prenom[i] = singleWords[i];
                                i++;
                            }
                            texte_requete += texte_requete + " ORDER BY joueur_nom DESC";
                            IDbCommand requete = new System.Data.SqlServerCe.SqlCeCommand(texte_requete, connev);
                            int j = 0;
                            requete.CreateParameter();
                            while (j <= (longueur - 1))
                            {
                                //Création et décalartion des paramètres
                                System.Data.SqlServerCe.SqlCeParameter paramNomMod = new System.Data.SqlServerCe.SqlCeParameter("@param"+j, SqlDbType.VarChar, nom[j].Length);
                                paramNomMod.Value = nom[j];
                                requete.Parameters.Add(paramNomMod);
                                System.Data.SqlServerCe.SqlCeParameter paramNomMod2 = new System.Data.SqlServerCe.SqlCeParameter("@prenom" + j, SqlDbType.VarChar, prenom[j].Length);
                                paramNomMod2.Value = prenom[j];
                                requete.Parameters.Add(paramNomMod2);
     
                                j++;
                            }
    Je vous epargne la suite du code (et la fin des conditions) qui permet de mettre un listview dans mon control.

    Donc de ce code j'ai un message d'erreur:
    Varchar
    Explication sur le code:
    Je découpe d'abord le string en mots
    Ensuite je fabrique ma requête avec le nombre paramètre en fonction du nombre de mots rentrés.
    Tout en stockant les mots dans deux tableaux (je me rend compte que un aurait largement suffit.

    Ensuite je fais une boucle pour ajouter tous les paramètres.

    Mais j'ai ce message d'erreur :
    Varchar
    Qu'ais-je fait de mal?

    Merci

  2. #2
    Membre confirmé
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2008
    Messages
    337
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Septembre 2008
    Messages : 337
    Points : 456
    Points
    456
    Par défaut
    il me semble que lorsque tu utilises des paramètres, tu ne dois pas mettre les simple côtes.

    donc ca donne ceci :
    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
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
     
     
                string recherche = this.textBox1.Text;
                if (recherche.Length >0)
                {//Si il a bien rentré quelque chose
                    string strConnexion = @"Data Source=|DataDirectory|\Database\" + info_db + ".sdf;Password=vA14qZ112009;Persist Security Info=True";
                    try
                    {
                        System.Data.SqlServerCe.SqlCeConnection connev = new System.Data.SqlServerCe.SqlCeConnection(strConnexion);
     
                        connev.Open();
                        if (this.comboBox3.SelectedIndex == 0)
                        {//C'est les joueurs
                            string texte_requete = "SELECT joueur_nom,joueur_prenom,taille FROM DYN_joueur WHERE";
                            string[] singleWords = recherche.Split(new char[]{' '}); // on extrait chaque mot via le séparateur espace
                            int longueur = singleWords.Length;
                            int i = 0;
                            string[] nom = new string[longueur];
                            string[] prenom = new string[longueur];
     
     
                            while (i <= (longueur-1))
                            {
                                if (i != 0)
                                {
                                    texte_requete += texte_requete + " AND";
                                }
                                else 
                                 {
                                     texte_requete += texte_requete + " OR"
                                 }
                                texte_requete += " (joueur_nom LIKE @param" + i.ToString();
                                texte_requete += " OR joueur_prenom LIKE @prenom" + i.ToString()+")";
                                nom[i] = singleWords[i];
                                prenom[i] = singleWords[i];
                                i++;
                            }
                            texte_requete += texte_requete + " ORDER BY joueur_nom DESC";
                            IDbCommand requete = new System.Data.SqlServerCe.SqlCeCommand(texte_requete, connev);
                            int j = 0;
                            requete.CreateParameter();
                            while (j <= (longueur - 1))
                            {
                                //Création et décalartion des paramètres
                                System.Data.SqlServerCe.SqlCeParameter paramNomMod = new System.Data.SqlServerCe.SqlCeParameter("@param"+j.ToString(), SqlDbType.VarChar, nom[j].Length);
                                //Ajout des '%' dans le parametre
                                paramNomMod.Value = "%"+ nom[j] + "%";
                                requete.Parameters.Add(paramNomMod);
                                System.Data.SqlServerCe.SqlCeParameter paramNomMod2 = new System.Data.SqlServerCe.SqlCeParameter("@prenom" + j.ToString(), SqlDbType.VarChar, prenom[j].Length);
                                paramNomMod2.Value = "%"+ prenom[j] +  "%";
                                requete.Parameters.Add(paramNomMod2);
     
                                j++;
                            }
    Je penses que ca devrait marché comme ceci, tient moi au courant !

    a++

    EDIT : Et si tu as plusieurs mots il faut rajouter un OR après chaque recherche d'où mon :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
     if (i != 0)
                                {
                                    texte_requete += texte_requete + " AND";
                                }
                                else 
                                 {
                                     texte_requete += texte_requete + " OR"
                                 }

  3. #3
    Membre du Club
    Inscrit en
    Mai 2009
    Messages
    172
    Détails du profil
    Informations forums :
    Inscription : Mai 2009
    Messages : 172
    Points : 49
    Points
    49
    Par défaut
    Bonjour,
    Merci de ta réponse.

    Pour le Or, je suis pas sur en fait j'avais mis cette condition car ma requete finissait par WHERE; donc il ne fallait pas mettre de AND pour le premier mot (sinon ça aurait fait WHERE AND) d'ou ma condition.

    Sinon j'ai utilisé tes conseils(et ton code) pas de quote et i.tostring, mais toujours cette erreur

    Ce qui me choque c'est que l'erreur renvoie seulement Varchar

  4. #4
    Membre confirmé
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2008
    Messages
    337
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Septembre 2008
    Messages : 337
    Points : 456
    Points
    456
    Par défaut
    Tu a raisons pour le OR c'est moi qui est mal compris ton code .... Par contre l'erreur se produit à quel moment ?

  5. #5
    Membre du Club
    Inscrit en
    Mai 2009
    Messages
    172
    Détails du profil
    Informations forums :
    Inscription : Mai 2009
    Messages : 172
    Points : 49
    Points
    49
    Par défaut
    Alors en fait j'ai une textbox, et un bouton à coté, et le bout de code que je t'ai montré se trouve dans L'événement onClick de ce bouton et l'erreur s'affiche dés que je clique dessus.

  6. #6
    Membre confirmé
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2008
    Messages
    337
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Septembre 2008
    Messages : 337
    Points : 456
    Points
    456
    Par défaut
    tu n'as pas mis un point d'arrêt sur ton code pour voir exactement ce qu'il se passe ?

  7. #7
    Membre du Club
    Inscrit en
    Mai 2009
    Messages
    172
    Détails du profil
    Informations forums :
    Inscription : Mai 2009
    Messages : 172
    Points : 49
    Points
    49
    Par défaut
    Comment marche les points d'arrets? EDIT trouvé : je connaissais pas ça va bien m'aider pour la suite ça.

    Sinon j'ai réussi en remplaçant le varchar par Nvarchar, et en corrigeant l'erreur ensuite venant du moment ou je rajoute order by, j'avais mis += texte_requete.


    Je souhaite ensuite tout mettre dans une listview que je crée, j'ai procédé de la sorte:
    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
    39
    40
                            ListView list_result = new ListView();
     
                            list_result.Dock = DockStyle.Fill;
                            list_result.GridLines = true;
                            list_result.MultiSelect = false;
                            list_result.View = View.Details;
                            ColumnHeader columnHeader0 = new ColumnHeader();
                            columnHeader0.Text = RM.GetString("NOM") ;
                            columnHeader0.Width = 260;
                            ColumnHeader columnHeader1 = new ColumnHeader();
                            columnHeader1.Text = RM.GetString("PRENOM");
                            columnHeader1.Width = 200;
                            ColumnHeader columnHeader2 = new ColumnHeader();
                            columnHeader2.Text = RM.GetString("POSTE");
                            columnHeader2.Width = 100;
                            ColumnHeader columnHeader3 = new ColumnHeader();
                            columnHeader3.Text = RM.GetString("NAT");
                            columnHeader3.Width = 100;
                            ColumnHeader columnHeader4 = new ColumnHeader();
                            columnHeader4.Text = RM.GetString("TAILLE");
                            columnHeader4.Width = 100;
     
                            // Add the column headers to myListView.
                            list_result.Columns.AddRange(new ColumnHeader[] { columnHeader0, columnHeader1, columnHeader2 ,columnHeader3, columnHeader4});
     
                            IDataReader read = requete.ExecuteReader();
                            while (read.Read())
                            {
                                ListViewItem item0 = new ListViewItem(new string[] 
                                {System.Convert.ToString(read["joueur_nom"]), 
                                System.Convert.ToString(read["joueur_prenom"]), 
                                System.Convert.ToString(read["joueur_nom"]),
                                System.Convert.ToString(read["joueur_nom"]),
                                System.Convert.ToString(read["taille"])});
                                list_result.Items.Add(item0);
     
     
                            }
                            read.Dispose();
                            this.panel1.Controls.Add(list_result);
    La listview se crée bien mais rien ne s'affiche.

    Alors soit ma requete est mauvaise soit la manière d'ajouter mon liste view est mauvaise.


    Sinon j'ai une information concernant le LIKE, il cherche quoi? si par exemple je la lettre f et que je clique sur chercher, il va me trouver tous les champs où la valeur contient un f ou pas? c'est à dire éléfant par exemple (oui j'avais pas d'exemple avec un f au milieu

    EDIT; En mettant un arret sur list_result.items.add quand je rentre le nom complet il ne s'arrete pas, Au contraire si je tape juste f il s'arrete.

    Donc il doit y avoir un problème dans ma requete?

  8. #8
    Membre du Club
    Inscrit en
    Mai 2009
    Messages
    172
    Détails du profil
    Informations forums :
    Inscription : Mai 2009
    Messages : 172
    Points : 49
    Points
    49
    Par défaut
    Alors là je comprend rien, si je tape juste la lettre f, j'ai tous mes joueurs qui apparaissent, même si ils n'ont pas la lettre f dans leur nom ou prénom.

    Je tape za, il me sort seulement un joueur (jérome sanchez) aucun rapport avec la recherche demandée quoi.

    Je tape te, il me sort 9 joueurs qui comportent tous au moins une des deux lettres(coïncidence? vu que il y a beaucoup plus de joueurs qui comportent au moins un e ou un t)

    Pareil si je tape sd, il me sort plein de joueurs au hasard.

    ça marche pas pour toutes les combinaisons je tape "fa" il ne trouve rien, alors que j'ai un joueur qui s'appelle fabien.

    je tape af, il trouve des joueurs qui n'ont pas de f, mais ils ont tous un a(coincidence encore?)

    À partir de trois lettres, il trouve plus (j'ai pas essayé des tonnes de combinaisons non plus)

    Bien sur si je tape le nom ou prénom complet ça ne marche pas non plus.

    J'ai vraiment du mal à voir le problème là, je vous remercie d'avance d evotre aide.

Discussions similaires

  1. [MySQL] recherche par mots clés
    Par spartan dans le forum PHP & Base de données
    Réponses: 4
    Dernier message: 16/02/2006, 16h11
  2. [Tableaux] Moteur de recherche par mot clés
    Par Nee dans le forum Langage
    Réponses: 4
    Dernier message: 20/01/2006, 11h30
  3. [Base de documents] Upload et Recherche par mots clé
    Par yascov dans le forum Décisions SGBD
    Réponses: 3
    Dernier message: 30/12/2005, 18h59
  4. recherche par mot clé
    Par seb59dk dans le forum Access
    Réponses: 3
    Dernier message: 06/09/2005, 14h26
  5. Recherche par mots clés
    Par legillou dans le forum Algorithmes et structures de données
    Réponses: 4
    Dernier message: 17/06/2005, 10h56

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