Maison > base de données > tutoriel mysql > Comment résoudre les conflits de noms de variables SQL dans les boucles ?

Comment résoudre les conflits de noms de variables SQL dans les boucles ?

Patricia Arquette
Libérer: 2025-01-02 18:13:44
original
385 Les gens l'ont consulté

How to Resolve SQL Variable Name Conflicts in Loops?

Conflit de nom de variable dans SQL

Lors de l'exécution d'une instruction SQL, vous pouvez rencontrer un message d'erreur indiquant qu'un nom de variable a déjà été déclaré et doit être unique dans un lot de requêtes ou une procédure stockée. Cela peut se produire dans des situations où plusieurs paramètres portant le même nom sont ajoutés dans une boucle.

Par exemple, considérons l'extrait de code suivant :

for (long counter = from; counter <= to; counter++) {
  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;
  rwd.connection.Open();
  rwd.command.ExecuteScalar();
  rwd.connection.Close();
}
Copier après la connexion

Dans ce code, la variable @LockState est ajouté aux paramètres de la commande SQL plusieurs fois dans la boucle. Cela viole la règle selon laquelle les noms de variables doivent être uniques.

Pour résoudre ce problème, vous pouvez soit ajouter les paramètres en dehors de la boucle, puis mettre à jour leurs valeurs dans la boucle, soit utiliser la méthode Parameters.Clear() après chaque itération de boucle pour supprimer les paramètres précédemment ajoutés.

Voici un exemple d'ajout de paramètres en dehors de la boucle :

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

for (long counter = from; counter <= to; counter++) {
  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;

  rwd.connection.Open();
  rwd.command.ExecuteScalar();
  rwd.connection.Close();
}
Copier après la connexion

Alternativement, vous pouvez utiliser Parameters.Clear() dans la boucle :

for (long counter = from; counter <= to; counter++) {
  rwd.command.Parameters.Clear();

  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;

  rwd.connection.Open();
  rwd.command.ExecuteScalar();
  rwd.connection.Close();
}
Copier après la connexion

En garantissant des noms de variables uniques dans vos paramètres SQL, vous pouvez éviter les déclarations de variables conflictuelles et exécuter avec succès votre instruction.

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!

source:php.cn
Déclaration de ce site Web
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
Derniers articles par auteur
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal