SQL での変数名の競合
SQL ステートメントを実行すると、変数名がすでに宣言されているというエラー メッセージが表示される場合があります。また、クエリ バッチまたはストアド プロシージャ内で一意である必要があります。これは、同じ名前の複数のパラメータがループ内に追加される状況で発生する可能性があります。
たとえば、次のコード スニペットを考えてみましょう。
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(); }
このコードでは、変数 @LockStateループ内で SQL コマンドのパラメータに複数回追加されます。これは、変数名が一意である必要があるというルールに違反しています。
この問題を解決するには、ループの外にパラメータを追加してからループ内でその値を更新するか、後で Parameters.Clear() メソッドを使用します。各ループ反復で、以前に追加したパラメータを削除します。
ここでは、パラメータの外側にパラメータを追加する例を示します。ループ:
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(); }
または、ループ内で Parameters.Clear() を使用できます:
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(); }
SQL パラメーター内で一意の変数名を確保することで、変数宣言の競合を回避できます。そしてステートメントが正常に実行されます。
以上がループ内の SQL 変数名の競合を解決するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。