ホームページ > データベース > mysql チュートリアル > ループ内の SQL 変数名の競合を解決するにはどうすればよいですか?

ループ内の SQL 変数名の競合を解決するにはどうすればよいですか?

Patricia Arquette
リリース: 2025-01-02 18:13:44
オリジナル
385 人が閲覧しました

How to Resolve SQL Variable Name Conflicts in Loops?

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 サイトの他の関連記事を参照してください。

ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
著者別の最新記事
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート