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

Résolu
cocodu67... Messages postés 3156 Date d'inscription jeudi 28 janvier 2010 Statut Membre Dernière intervention 2 juillet 2024 - Modifié par cocodu67... le 8/03/2014 à 19:52
cocodu67... Messages postés 3156 Date d'inscription jeudi 28 janvier 2010 Statut Membre Dernière intervention 2 juillet 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 39948 Date d'inscription mercredi 2 mai 2007 Statut Modérateur Dernière intervention 16 juillet 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
cocodu67... Messages postés 3156 Date d'inscription jeudi 28 janvier 2010 Statut Membre Dernière intervention 2 juillet 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