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

C# Discussion :

Encore un problème avec une requête MYSQL en C#


Sujet :

C#

  1. #1
    Membre habitué
    Homme Profil pro
    Étudiant
    Inscrit en
    Juin 2011
    Messages
    273
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juin 2011
    Messages : 273
    Points : 152
    Points
    152
    Par défaut Encore un problème avec une requête MYSQL en C#
    Bonsoir,

    J'ai encore un soucis avec une requête MYSQL en C#.

    Voici ce qui se passe lorsque j'appuie sur le 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
    if (textBoxIdentifiant.TextLength == 0)
                    MessageBox.Show("Erreur, pour mettre à jour les données d'un élève, son identifiant est obligatoire");
                else
                {
                    if (textBoxNom.TextLength != 0)
                        MiseAJourDonneesEleve("fldNom", textBoxNom.Text, Convert.ToInt32(textBoxIdentifiant.Text), 1); // 1 = valeur string, 2 = valeur int
                    if(textBoxPrenom.TextLength != 0)
                        MiseAJourDonneesEleve("fldPrenom", textBoxPrenom.Text, Convert.ToInt32(textBoxIdentifiant.Text), 1);
                    if(textBoxClasse.TextLength != 0)
                        MiseAJourDonneesEleve("fldClasse", textBoxClasse.Text, Convert.ToInt32(textBoxIdentifiant.Text), 1);
                    if(textBoxPhoto.TextLength != 0)
                        MiseAJourDonneesEleve("fldPhoto", textBoxPhoto.Text, Convert.ToInt32(textBoxIdentifiant.Text), 1);
                    if(textBoxSolde.TextLength != 0)
                        MiseAJourDonneesEleve("fldSolde", textBoxSolde.Text, Convert.ToInt32(textBoxIdentifiant.Text), 2);


    Et voici la fonction MiseAJourDonneesEleve :

    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
    void MiseAJourDonneesEleve(string NomDuChamp, string Valeur, int Identifiant, int TypeValeur)
            {
                maRequeteMiseAJourDonneesEleve = "UPDATE tbleleves SET @Champ = @NouvelleValeur WHERE fldIdentifiant = @Id";
                maCommandeMiseAJourDonneesEleve = new MySqlCommand(maRequeteMiseAJourDonneesEleve, maConnexion);
                maCommandeMiseAJourDonneesEleve.Parameters.Add(new MySqlParameter("@Champ", MySqlDbType.String, 15));
                maCommandeMiseAJourDonneesEleve.Parameters.Add(new MySqlParameter("@Id", MySqlDbType.Int32, 8));
                try { maCommandeMiseAJourDonneesEleve.Parameters["@Champ"].Value = NomDuChamp; }
                catch { };
                try { maCommandeMiseAJourDonneesEleve.Parameters["@Id"].Value = Identifiant; }
                catch { };
     
                if (TypeValeur == 1) // 1 = valeur string, 2 = valeur int
                {
                    maCommandeMiseAJourDonneesEleve.Parameters.Add(new MySqlParameter("@NouvelleValeur", MySqlDbType.String, 20));
                    try { maCommandeMiseAJourDonneesEleve.Parameters["@NouvelleValeur"].Value = Valeur; }
                    catch { MessageBox.Show("Erreur au niveau de la nouvelle valeur de " + NomDuChamp); };
                }
                else
                {
                    maCommandeMiseAJourDonneesEleve.Parameters.Add(new MySqlParameter("@NouvelleValeur", MySqlDbType.Int32, 8));
                    try { maCommandeMiseAJourDonneesEleve.Parameters["@NouvelleValeur"].Value = Valeur; }
                    catch { MessageBox.Show("Erreur au niveau de la nouvelle valeur de " + NomDuChamp); };
                }
     
                try
                {
                    maCommandeMiseAJourDonneesEleve.Connection.Open();
     
                    maCommandeMiseAJourDonneesEleve.ExecuteScalar();
     
                    maCommandeMiseAJourDonneesEleve.Connection.Close();
                }
                catch { MessageBox.Show("Erreur lors de la mise à jour des données"); }
            }

    Le code plante au niveau de la requête.
    J'ai testé avec des points d'arrêt,
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    "UPDATE tbleleves SET @Champ = @NouvelleValeur WHERE fldIdentifiant = @Id"
    ne fonctionne pas

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    "UPDATE tbleleves SET fldNom = @NouvelleValeur WHERE fldIdentifiant = @Id"
    fonctionne.

    Voici une image qui montre que la variable NomDuChamp est égale à ce que je voulais :
    http://cjoint.com/14ma/DCitWLGUvrK_bug.jpg

    Après NomDuChamp je le passe dans @Champ et @Champ est correctement inséré dans la requête.

    Qui peut voir d'où vient le problème s'il vous plait ?

    Merci d'avance

  2. #2
    Membre éclairé
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Août 2008
    Messages
    381
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Canada

    Informations professionnelles :
    Activité : Développeur .NET

    Informations forums :
    Inscription : Août 2008
    Messages : 381
    Points : 766
    Points
    766
    Par défaut
    Je ne crois pas que tu puisses utiliser @champs comme tu le souhaites. Les paramètres ne sont pas des équivalents de String.Replace().

    Comme c'est toi qui controle le nom des champs (ils ne proviennent pas d'une entrée utilisateur), tu pourrais formater ta requête avec un String.Format avec le nom du champs et garder les Parameters pour leurs valeurs.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    maRequeteMiseAJourDonneesEleve = String.Format("UPDATE tbleleves SET {0} = @NouvelleValeur WHERE fldIdentifiant = @Id", NomDuChamp);
    Les fautes d'orthographes sus-citées sont déposées auprès de leurs propriétaires respectifs. Aucune responsabilité n'est engagée sur la lisibilité du message ou les éventuels dommages qu'il peut engendrer.

  3. #3
    Membre habitué
    Homme Profil pro
    Étudiant
    Inscrit en
    Juin 2011
    Messages
    273
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juin 2011
    Messages : 273
    Points : 152
    Points
    152
    Par défaut
    En faite je pensais que les requêtes paramétrées permettent de former la chaîne de caractères et qu'on pourrait même mettre par exemple


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    maRequeteMiseAJourDonneesEleve = "@QuelqueChose tbleleves SET @Champ = @NouvelleValeur WHERE fldIdentifiant = @Id";
    Et dire que @QuelqueChose est égal à UPDATE

    Si quelqu'un peut bien m'expliquer quels sont les éléments qu'on peut ajouter avec des arobases (@) et quels sont ceux qu'on ne peut pas et pourquoi, ce serait sympa de m'expliquer afin que je ne fasse plus cette erreur car visiblement la solution j'aurais pus y penser en une minute si j'aurais sus dès le départ que le nom du champ je ne peux pas l'insérer ainsi.

    D'après ce que j'ai retenu, on peut utiliser les @ afin d'insérer des variables dans la requête mais pas des mots. C'est cela si on simplifie ?

    En tout cas merci tu m'as débloqué

    Bonne soirée

  4. #4
    Modérateur
    Avatar de DotNetMatt
    Homme Profil pro
    CTO
    Inscrit en
    Février 2010
    Messages
    3 611
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : Etats-Unis

    Informations professionnelles :
    Activité : CTO
    Secteur : Finance

    Informations forums :
    Inscription : Février 2010
    Messages : 3 611
    Points : 9 743
    Points
    9 743
    Billets dans le blog
    3
    Par défaut
    Citation Envoyé par encoremoi21258 Voir le message
    D'après ce que j'ai retenu, on peut utiliser les @ afin d'insérer des variables dans la requête mais pas des mots. C'est cela si on simplifie ?
    Oui c'est exactement ça

    Cela s'explique par le fait que lorsque tu passes par une requête paramétrée, la requête et les paramètres sont envoyés au serveur SQL pour que celui-ci les "binde", c'est-à-dire pour qu'il mappe une valeur à son paramètre. C'est aussi pour ça qu'il n'est pas possible de voir la requête finale en débuggant dans Visual Studio, puisque le binding est fait par le SGBDR. Cela permet de "figer" la requête, elle est toujours identique, ce qui permet d'optimiser le plan d'exécution.

    Comme ce binding gère les formats de nombre, de date, etc. cela impliquerait que ce que tu cherchais à faire aurait probablement rendu une requête ressemblant à ceci :
    Code SQL : Sélectionner tout - Visualiser dans une fenêtre à part
    UPDATE tbleleves SET 'LeChamp' = @NouvelleValeur WHERE fldIdentifiant = @Id
    Cette requête n'aurait pas été valide, à cause des guillemets autour de "LeChamp".
    Less Is More
    Pensez à utiliser les boutons , et les balises code
    Desole pour l'absence d'accents, clavier US oblige
    Celui qui pense qu'un professionnel coute cher n'a aucune idee de ce que peut lui couter un incompetent.

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

Discussions similaires

  1. Probléme avec une requéte mysql(Oracle 9)
    Par lmkrte dans le forum Langage SQL
    Réponses: 2
    Dernier message: 03/03/2007, 22h41
  2. Problème avec une requête MySQL
    Par Downy35 dans le forum Requêtes
    Réponses: 4
    Dernier message: 30/08/2006, 11h09
  3. Problème avec une requête
    Par ringostarr dans le forum Langage SQL
    Réponses: 5
    Dernier message: 19/04/2005, 20h34
  4. Problème avec une requête
    Par snoopy69 dans le forum Débuter
    Réponses: 2
    Dernier message: 20/01/2005, 12h39
  5. problème avec une requête imbriquée
    Par jaimepasteevy dans le forum Langage SQL
    Réponses: 13
    Dernier message: 05/12/2003, 10h29

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