Maison >base de données >tutoriel mysql >Pourquoi ma requête SQL génère-t-elle une erreur « Nom de variable déjà déclaré » ?

Pourquoi ma requête SQL génère-t-elle une erreur « Nom de variable déjà déclaré » ?

Susan Sarandon
Susan Sarandonoriginal
2025-01-03 08:42:39343parcourir

Why Does My SQL Query Throw a

Conflit de noms de variables dans les requêtes SQL

Votre message d'erreur : "Le nom de variable '@' a déjà été déclaré. Noms de variables doit être unique au sein d'un lot de requêtes ou d'une procédure stockée", indique un conflit dans la dénomination des variables dans votre SQL code.

Dans l'extrait de code fourni, le problème survient lorsque vous essayez d'utiliser le même nom de variable, "@LockState", plusieurs fois dans une boucle dans le gestionnaire d'événements "btn_lock2_Click". SQL nécessite des noms de variables uniques dans une requête ou une procédure stockée pour éviter toute confusion et ambiguïté.

Solution 1 : effacer les paramètres après chaque itération de boucle

Une façon de résoudre le conflit consiste à effacer la collection de paramètres avant chaque itération de boucle. Cela garantit que le même nom de paramètre n'est pas ajouté plusieurs fois à la collection.

for (long counter = from; counter <= to; counter )
{

rwd.command.Parameters.Clear(); // Clear the parameters collection before adding new parameters

string upd = "update card set LockState=@lockstate, card_descr=@card_descr where [cardNumber] = N'{0}'";
rwd.command.CommandText = upd;
rwd.command.Parameters.Add(new SqlParameter("@LockState", SqlDbType.NVarChar)).Value = 1;
rwd.command.Parameters.Add(new SqlParameter("@card_descr", SqlDbType.NVarChar)).Value = txt_desc2.Text;
...

}

Solution 2 : Définir les paramètres avant Boucle

Vous pouvez également définir les paramètres avant la boucle, puis mettre à jour leurs valeurs à chaque itération. Cette approche garantit que les paramètres existent dans la collection avant le début de la boucle, éliminant ainsi le besoin d'effacement.

rwd.command.Parameters.Add(new SqlParameter("@LockState", SqlDbType.NVarChar));
rwd.command.Parameters.Add(new SqlParameter("@card_descr", SqlDbType.NVarChar));

pour (compteur long = de; compteur <= à; compteur )
{

string upd = "update card set LockState=@lockstate, card_descr=@card_descr where [cardNumber] = N'{0}'";
rwd.command.CommandText = upd;

rwd.command.Parameters["@LockState"].Value = 1;
rwd.command.Parameters["@card_descr"].Value = txt_desc2.Text;

...

}

En utilisant l'une ou l'autre de ces solutions, vous pouvez vous assurer que vos requêtes SQL ont des noms de variables uniques, évitant ainsi l'erreur « déjà déclarée ».

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn