Besoin d'aide pour vérifier ma requête [Résolu]

Signaler
Messages postés
3110
Date d'inscription
jeudi 28 janvier 2010
Statut
Membre
Dernière intervention
24 mai 2021
-
Messages postés
3110
Date d'inscription
jeudi 28 janvier 2010
Statut
Membre
Dernière intervention
24 mai 2021
-
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

Messages postés
32141
Date d'inscription
mercredi 2 mai 2007
Statut
Modérateur
Dernière intervention
13 juin 2021
1
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
Messages postés
3110
Date d'inscription
jeudi 28 janvier 2010
Statut
Membre
Dernière intervention
24 mai 2021
1
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