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
Patricia Arquetteoriginal
2025-01-02 18:13:44400parcourir

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();
}

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();
}

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();
}

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!

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