Variablennamenskonflikt in SQL
Beim Ausführen einer SQL-Anweisung wird möglicherweise eine Fehlermeldung angezeigt, die besagt, dass ein Variablenname bereits deklariert wurde und muss innerhalb eines Abfragebatches oder einer gespeicherten Prozedur eindeutig sein. Dies kann in Situationen auftreten, in denen mehrere Parameter mit demselben Namen in einer Schleife hinzugefügt werden.
Betrachten Sie beispielsweise den folgenden Codeausschnitt:
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(); }
In diesem Code ist die Variable @LockState wird innerhalb der Schleife mehrmals zu den Parametern des SQL-Befehls hinzugefügt. Dies verstößt gegen die Regel, dass Variablennamen eindeutig sein müssen.
Um dieses Problem zu beheben, können Sie entweder die Parameter außerhalb der Schleife hinzufügen und dann ihre Werte innerhalb der Schleife aktualisieren oder anschließend die Methode Parameters.Clear() verwenden Bei jeder Schleifeniteration werden die zuvor hinzugefügten Parameter entfernt.
Hier ist ein Beispiel für das Hinzufügen der Parameter außerhalb der Schleife:
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(); }
Alternativ können Sie verwenden Parameters.Clear() innerhalb der Schleife:
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(); }
Indem Sie innerhalb Ihrer SQL-Parameter eindeutige Variablennamen sicherstellen, können Sie widersprüchliche Variablendeklarationen vermeiden und Ihre Anweisung erfolgreich ausführen.
Das obige ist der detaillierte Inhalt vonWie löst man Konflikte mit SQL-Variablennamen in Schleifen?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!