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!