Besoin d'aide pour vérifier ma requête

Résolu
cocodu67... Messages postés 3153 Date d'inscription jeudi 28 janvier 2010 Statut Membre Dernière intervention 4 avril 2024 - Modifié par cocodu67... le 8/03/2014 à 19:52
cocodu67... Messages postés 3153 Date d'inscription jeudi 28 janvier 2010 Statut Membre Dernière intervention 4 avril 2024 - 8 mars 2014 à 21:42
Bonsoir,

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

Voici ce qui se passe lorsque j'appuie sur le bouton :

            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 :

        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,
"UPDATE tbleleves SET @Champ = @NouvelleValeur WHERE fldIdentifiant = @Id"

ne fonctionne pas

"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

1 réponse

jee pee Messages postés 39629 Date d'inscription mercredi 2 mai 2007 Statut Modérateur Dernière intervention 24 avril 2024 2
8 mars 2014 à 21:02
Bonjour,

Je ne connais pas ton langage de programmation donc ne vais pas pouvoir t'apporter la solution, mais je pense pouvoir te donner la logique de ton problème.

Quand
SET @Champ = @NouvelleValeur
est résolu cela doit donner non pas un nom de champ mais une constante donc du type constante=constante
'fldnom' = 'aaaa'
alors qu'il faut
fdlnom = 'aaaa'
.

Généralement quand on veut faire une requête dynamique, il faut constituer la chaine contenant la requête avec d'exécuter la commande.

cdlt
0
cocodu67... Messages postés 3153 Date d'inscription jeudi 28 janvier 2010 Statut Membre Dernière intervention 4 avril 2024 1
Modifié par cocodu67... le 8/03/2014 à 21:43
Sans connaître le C# t'es quand même doué je trouve.

En effet, en introduisant le nom du champ d'une autre façon avec :


maRequeteMiseAJourDonneesEleve = String.Format("UPDATE tbleleves SET {0} = @NouvelleValeur WHERE fldIdentifiant = @Id", NomDuChamp);
cela fonctionne.

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


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.

En tout cas merci jee pee tu m'as débloqué :)

Bonne soirée
0
Rejoignez-nous