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

ASP.NET Discussion :

Variable non unique dans un traitement de requête suite à une boucle


Sujet :

ASP.NET

  1. #1
    Membre averti
    Femme Profil pro
    Étudiant
    Inscrit en
    Janvier 2015
    Messages
    34
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Janvier 2015
    Messages : 34
    Par défaut Variable non unique dans un traitement de requête suite à une boucle
    Bonsoir tout le monde ,

    C'est encore moi (à croire que je passe ma vie sur les forums... Presque ), suite à ce topic...
    Alors voilà, j'ai une barre de recherche sur mon site web en ASP.NET, qui permet d'afficher dans un tableau le résultat de ce qu'à taper l'utilisateur. Mon code fonctionne quand l'utilisateur ne rentre qu'un seul mot, par contre dès qu'il veut en rentrer plusieurs, c'est la cata.

    Je cherche depuis le début de l'aprem une solution: J'ai regardé s'il était possible de mettre plusieurs valeurs à un "LIKE" comme on peut le faire avec un "IN" mais nada.. Enfin on ne peut pas d'après ce que j'ai lu. Et remplacer mon "LIKE" par un "IN" changerait toute la donne... Voici mon code (en C#) pour le moment, qui se déroule lors du clique du bouton "Rechercher", une fois que l'utilisateur a tapé les mots recherchés:

    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
    Connexion = new SqlConnection("Data Source=**;Initial Catalog=**;Integrated Security=True");
                    SqlCommand Recherche = new SqlCommand("Select UserID, UserNom, UserPrenom FROM User WHERE UserNom LIKE @motclef OR UserPrenom LIKE @motclef", Connexion);
                    Connexion.Open();
     
                    String[] words = TextBoxSearch.Text.Split(' ');
     
     
                    foreach (String word in words)
                   {
                        Recherche.Parameters.Add("motclef", SqlDbType.NVarChar).Value = '%' + word + '%';
                    }
     
                    SqlDataReader Lecture = Recherche.ExecuteReader();
                    Gridview.DataSource = Lecture;
                    Gridview.DataBind();
                    Lecture.Close();
    Mon Gridview correspond donc à un tableau récapitulatif de ma recherche, et le TextBoxSearch, aux mots rentrés par l'utilisateur. Quand je teste avec un seul mot, pas d'erreur. Par contre, quand je teste avec deux, j'ai l'erreur suivante:
    "Le nom de variable '@motclef' a déjà été déclaré. Les noms de variables doivent être uniques dans un traitement de requêtes ou une procédure stockée."
    Ce qui est normal puisque dans ma boucle ma variable est "créée" plusieurs fois. Or, je n'ai pas d'autres idées de comment faire... J'ai tenté avec une boucle While mais idem.

    Comment je pourrai stocker cette variable et la reprendre ensuite dans ma requête? Je m'y prend peut être pas comme il faut...

  2. #2
    Membre émérite
    Profil pro
    Inscrit en
    Novembre 2003
    Messages
    777
    Détails du profil
    Informations personnelles :
    Âge : 43
    Localisation : Belgique

    Informations forums :
    Inscription : Novembre 2003
    Messages : 777
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    int cpt = 0;
    string sql = "SELECT....WHERE 1=1 ";
     foreach (String word in words)
                   {
                        string varname = "motclef" + (++cpt);
                        Recherche.Parameters.Add(varname , SqlDbType.NVarChar).Value = '%' + word + '%';
                        sql += String.Format(" OR {0} like {1}","tonfieldname",varname); 
                    }
    Voici un exemple...

  3. #3
    Membre averti
    Femme Profil pro
    Étudiant
    Inscrit en
    Janvier 2015
    Messages
    34
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Janvier 2015
    Messages : 34
    Par défaut
    Bonjour Dokho1000,

    Merci (encore ) pour ton aide. Le soucis est qu'il me demande de déclarer ma variable scalaire @motclef, comme je ne l'utilise plus dans mon "Recherche.Parameters.Add". J'ai tenté de le mettre en dure, sans passer par varname mais rien n'y fait.
    De puis, je n'arrive pas à comprendre la requête SQL, enfin du moins l'utilité (même si je me doute que c'est en rapport avec le compteur...), ni même savoir quand est-ce qu'on l'a "lance"...

  4. #4
    Membre émérite
    Profil pro
    Inscrit en
    Novembre 2003
    Messages
    777
    Détails du profil
    Informations personnelles :
    Âge : 43
    Localisation : Belgique

    Informations forums :
    Inscription : Novembre 2003
    Messages : 777
    Par défaut
    dans mon script j'ai oublié le "@" devant {1}
    Tu la lances apres le foreach...

  5. #5
    Membre averti
    Femme Profil pro
    Étudiant
    Inscrit en
    Janvier 2015
    Messages
    34
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Janvier 2015
    Messages : 34
    Par défaut
    Citation Envoyé par Dokho1000 Voir le message
    dans mon script j'ai oublié le "@" devant {1}
    Tu la lances apres le foreach...
    Ok, je viens de rajouter mon @ devant le {1} de LIKE dans ma variable "sql". Il n'y a plus l'erreur du @motclef. Par contre, j'ai cette erreur:
    "Le format de la chaîne d'entrée est incorrect.".

    Pour la variable sql, ne vaut-il pas mieux que je la mette en SqlCommand plutôt que String? Car comment la lancer ensuite?
    Et pour le "fieldname" (ligne 8 de ton code), je le remplace par "TextBoxSearch.Text"?

    Excuse moi de te poser toutes ces questions, j'essaye de comprendre ...

  6. #6
    Membre émérite
    Profil pro
    Inscrit en
    Novembre 2003
    Messages
    777
    Détails du profil
    Informations personnelles :
    Âge : 43
    Localisation : Belgique

    Informations forums :
    Inscription : Novembre 2003
    Messages : 777
    Par défaut
    Met ton code modifié...

  7. #7
    Membre averti
    Femme Profil pro
    Étudiant
    Inscrit en
    Janvier 2015
    Messages
    34
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Janvier 2015
    Messages : 34
    Par défaut
    Oui, pardon, voici le code:

    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
    Connexion = new SqlConnection("Data Source=**;Initial Catalog=**;Integrated Security=True");
    SqlCommand Recherche = new SqlCommand("Select UserID, UserNom, UserPrenom FROM User WHERE UserNom LIKE @motclef OR UserPrenom LIKE @motclef", Connexion);
    Connexion.Open();
     
    String[] words = TextBoxSearch.Text.Split(' ');
    int cpt =  0;
    String sql = "SELECT UserID, UserNom, UserPrenom FROM User WHERE 1=1";
     
    foreach (String word in words)
        {
            String varname = "motclef" + (++cpt);
            Recherche.Parameters.Add(varname, SqlDbType.NVarChar).Value = '%' + word + '%';
            sql += String.Format("OR {0} LIKE {@1}",TextBoxSearch.Text, varname);
         }
    SqlDataReader Lecture = Recherche.ExecuteReader();
    Gridview.DataSource = Lecture;
    Gridview.DataBind();
    Lecture.Close();

  8. #8
    Membre émérite
    Profil pro
    Inscrit en
    Novembre 2003
    Messages
    777
    Détails du profil
    Informations personnelles :
    Âge : 43
    Localisation : Belgique

    Informations forums :
    Inscription : Novembre 2003
    Messages : 777
    Par défaut
    le TextBoxSearch.Text représente un champ dans ta base ???

  9. #9
    Membre averti
    Femme Profil pro
    Étudiant
    Inscrit en
    Janvier 2015
    Messages
    34
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Janvier 2015
    Messages : 34
    Par défaut
    Citation Envoyé par Dokho1000 Voir le message
    le TextBoxSearch.Text représente un champ dans ta base ???
    Le TextBoxSearch.Text représente l'endroit où les utilisateurs écrivent les mots clefs recherchés...
    En fait je n'ai aucune idée de ce qu'il faut mettre comme champ, car si c'est par rapport à ma base, il faudrait que je mette "UserNom" et "UserPrenom"?

  10. #10
    Membre émérite
    Profil pro
    Inscrit en
    Novembre 2003
    Messages
    777
    Détails du profil
    Informations personnelles :
    Âge : 43
    Localisation : Belgique

    Informations forums :
    Inscription : Novembre 2003
    Messages : 777
    Par défaut
    alors le script devrait plutot être comme ceci :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    foreach (String word in words)
        {
            String varname = "motclef" + (++cpt);
            Recherche.Parameters.Add(varname, SqlDbType.NVarChar).Value = '%' + word + '%';
            sql += String.Format("OR {0} LIKE {@2} OR {1} LIKE {@2}","UserNom", "UserPrenom", varname);
         }
    Ceci dit, ce sera une requête pas performante du tout...

  11. #11
    Membre averti
    Femme Profil pro
    Étudiant
    Inscrit en
    Janvier 2015
    Messages
    34
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Janvier 2015
    Messages : 34
    Par défaut
    En fait, il faut que je définisse tous les champs qui sont susceptibles de "ressembler" à ce qu'à rentré l'utilisateur?
    C'est ce que font par exemple les développeurs pour les barres de recherche dans les forums?
    Parce qu'en fait mon but est à peu près le même... Comment faire pour que ma requête soit plus performante?

    EDIT: J'ai toujours la même erreur de format....

  12. #12
    Membre émérite
    Profil pro
    Inscrit en
    Novembre 2003
    Messages
    777
    Détails du profil
    Informations personnelles :
    Âge : 43
    Localisation : Belgique

    Informations forums :
    Inscription : Novembre 2003
    Messages : 777
    Par défaut
    Sorry les 2 @ doivent être devant l'accolade...

    Faire une store proc serait mieux...

  13. #13
    Membre averti
    Femme Profil pro
    Étudiant
    Inscrit en
    Janvier 2015
    Messages
    34
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Janvier 2015
    Messages : 34
    Par défaut
    Je te remercie encore pour ton aide Dokho1000,
    As-tu une idée du coup de comment faire avec Visual Studio pour faire une procédure stockée?

    EDIT: Même comme cela, ils me demandent encore que la variable scalaire "@motclef" soit déclarée...

  14. #14
    Membre émérite
    Profil pro
    Inscrit en
    Novembre 2003
    Messages
    777
    Détails du profil
    Informations personnelles :
    Âge : 43
    Localisation : Belgique

    Informations forums :
    Inscription : Novembre 2003
    Messages : 777
    Par défaut
    J'utilise le studio management de MS SQL...

    Essaye plutot :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    var param = Recherche.CreateParameter();
    param.ParameterName = varname;
    param.Value = '%' + word + '%';
    Recherche.Parameters.Add(param );

  15. #15
    Membre averti
    Femme Profil pro
    Étudiant
    Inscrit en
    Janvier 2015
    Messages
    34
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Janvier 2015
    Messages : 34
    Par défaut
    En fait, je vois comment faire avec studio management pour ajouter une procédure stockée, ça y a pas de soucis. Par contre, dans ce cas-là, je n'ai aucune idée de quelle requête écrire (la mienne est-elle bonne?) ni comment l'aborder dans mon code C# (et comment y accéder???). Pourquoi cela règlerait le soucis puisque ce sera toujours le même problème avec cette variable qui se répète...?

    Je viens également de tester ton code en remplaçant param par "motclef" mais rien n'y fait, j'ai toujours la même erreur...

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    foreach (String word in words)
                   {
                       var "motclef" = Recherche.CreateParameter();
                       "motclef".ParameterName = varname;
                       "motclef".Value = '%' + word + '%';
                       Recherche.Parameters.Add(motclef);
                       sql += String.Format("OR {0} LIKE @{2} OR {1} LIKE @{2}","UserNom", "UserPrenom", varname);
                   }
    Puisque dans ma requête "Recherche" se trouve ce paramètre, et que celui-ci correspond à ce que contient la TextBoxSearch...

  16. #16
    Membre émérite
    Profil pro
    Inscrit en
    Novembre 2003
    Messages
    777
    Détails du profil
    Informations personnelles :
    Âge : 43
    Localisation : Belgique

    Informations forums :
    Inscription : Novembre 2003
    Messages : 777
    Par défaut
    Peux tu mettre tout ton code car je ne comprend pas pq ca ne fonctionnerait pas...

    Pour ce qui est de la store proc j'irais me renseigner dans un autre forum pour voir quel technique est la meilleur.
    Moi j'aurais tenté de créer une table qui contient juste l'entité, la pk et le text afin d'effectuer ma recherche plus rapidemnt...

    ca veux dire qu'a chaque fois que tu crées ou édite un record tu ne dois pas oublier d’éditer cette table aussi...

  17. #17
    Membre averti
    Femme Profil pro
    Étudiant
    Inscrit en
    Janvier 2015
    Messages
    34
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Janvier 2015
    Messages : 34
    Par défaut
    Voici tout mon code qui se déroule lors du clique de mon bouton:

    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
     
    public void RechercherUser()
            {
                SqlConnection Connexion = null;
                try
                {
     
                    Connexion = new SqlConnection("Data Source=**;Initial Catalog=**;Integrated Security=True");
                    SqlCommand Recherche = new SqlCommand("Select UserID, UserNom, UserPrenom FROM User WHERE UserNom LIKE @motclef OR UserPrenom LIKE @motclef", Connexion);
                    Connexion.Open();
     
     
                    String[] words = TextBoxSearch.Text.Split(' ');
                    int cpt =  0;  // Du coup, ici il n'y a plus besoin du compteur?
                    String sql = "SELECT UserID, UserNom, UserPrenom FROM User WHERE 1=1";
     
     
                   foreach (String word in words)
                   {
                       var "motclef" = Recherche.CreateParameter();
                       "motclef".ParameterName = varname;
                       "motclef".Value = '%' + word + '%';
                       Recherche.Parameters.Add(motclef);
                       sql += String.Format("OR {0} LIKE @{2} OR {1} LIKE @{2}","UserNom", "UserPrenom", varname);
                   }
     
                    SqlDataReader Lecture = Recherche.ExecuteReader();
                    Gridview.DataSource = Lecture;
                    Gridview.DataBind();
                    Lecture.Close();
                }
                catch (Exception UneException)
                {
                    LabelError.Text = UneException.Message;
                }
                finally
                {
                    if ((Connexion != null))
                    {
                        if (ConnexionState == Connexion.Open)
                        {
                            Connexion.Close();
                        }
                    }
                }
            }
     protected void ImageButtonSearch_Click(object sender, ImageClickEventArgs e)
            {
                RechercherUser();
            }
    Et donc toujours la même erreur: " La variable scalaire "@motclef" doit être déclarée. "

  18. #18
    Membre émérite
    Profil pro
    Inscrit en
    Novembre 2003
    Messages
    777
    Détails du profil
    Informations personnelles :
    Âge : 43
    Localisation : Belgique

    Informations forums :
    Inscription : Novembre 2003
    Messages : 777
    Par défaut
    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
    Connexion = new SqlConnection("Data Source=**;Initial Catalog=**;Integrated Security=True");
                    SqlCommand Recherche = Connexion.CreateCommand();
                    Connexion.Open();
     
     
                    String[] words = TextBoxSearch.Text.Split(' ');
                    int cpt =  0;  // Du coup, ici il n'y a plus besoin du compteur?
                    String sql = "SELECT UserID, UserNom, UserPrenom FROM User WHERE 1=1";
     
     
                   foreach (String word in words)
                   {
                       var motclef = Recherche.CreateParameter();
                       motclef.ParameterName = varname;
                       motclef.Value = '%' + word + '%';
                       Recherche.Parameters.Add(motclef);
                       sql += String.Format("OR {0} LIKE @{2} OR {1} LIKE @{2}","UserNom", "UserPrenom", varname);
                   }
     Recherche.CommentText = sql;
                    SqlDataReader Lecture = Recherche.ExecuteReader();
                    Gridview.DataSource = Lecture;
                    Gridview.DataBind();
                    Lecture.Close();
    Voilà, vérifie la requete sql juste avant ton SqlDataReader afin de t'assurer qu'elle bien formée...

    A+

  19. #19
    Membre averti
    Femme Profil pro
    Étudiant
    Inscrit en
    Janvier 2015
    Messages
    34
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Janvier 2015
    Messages : 34
    Par défaut
    J'ai recopié exactement le même code, j'ai juste changé:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
     String varname = motclef.ParameterName;
    Car sinon il ne reconnaissait pas la variable "varname".

    Mais j'ai toujours le même soucis:
    "La variable scalaire "@" doit être déclarée.".
    C'est le @ devant les accolades qui pose soucis...

    J'arrive complètement à comprendre ce code. Mais le soucis c'est le lien entre ma textbox et la requête je pense...

    Enfin, je veux pas plus t'embêter que ça, et je te remercie de m'avoir déjà aidé jusque là...

  20. #20
    Membre émérite
    Profil pro
    Inscrit en
    Novembre 2003
    Messages
    777
    Détails du profil
    Informations personnelles :
    Âge : 43
    Localisation : Belgique

    Informations forums :
    Inscription : Novembre 2003
    Messages : 777
    Par défaut
    C''est p-e le string.format qui pose problème. essaye en concaténant la chaine à la place ?
    Quel resultat obtient tu dans le Recherche.CommandeText ?

+ Répondre à la discussion
Cette discussion est résolue.
Page 1 sur 2 12 DernièreDernière

Discussions similaires

  1. copie d'une variable non reconnue dans une fonction
    Par paragoge dans le forum ActionScript 3
    Réponses: 1
    Dernier message: 27/10/2009, 13h30
  2. Variable non stockée dans une fonction
    Par LaVaZza dans le forum SQL Procédural
    Réponses: 1
    Dernier message: 16/07/2009, 17h49
  3. Réponses: 2
    Dernier message: 15/12/2008, 18h04
  4. Variable non évaluée dans la balise
    Par Mister Nono dans le forum Struts 1
    Réponses: 2
    Dernier message: 16/11/2007, 15h12
  5. variable non reconnue dans une requête sql
    Par sanatou dans le forum C++
    Réponses: 3
    Dernier message: 13/12/2006, 17h43

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