エラー メッセージ「変数名 '@' はすでに宣言されています。変数名クエリ バッチまたはストアド プロシージャ内で一意である必要があります。」は、SQL 内の変数名の競合を示します。 code.
提供されたコード スニペットでは、「btn_lock2_Click」イベント ハンドラー内のループで同じ変数名「@LockState」を複数回使用しようとすると問題が発生します。 SQL では、混乱や曖昧さを防ぐために、クエリまたはストアド プロシージャ内に一意の変数名が必要です。
解決策の 1 つ競合は、各ループ反復の前にパラメータ コレクションをクリアすることです。これにより、同じパラメータ名がコレクションに複数回追加されなくなります。
for (long counter = from; counter <= to; counter )
{
rwd.command.Parameters.Clear(); // Clear the parameters collection before adding new parameters 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.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; ...
}
これらのソリューションのいずれかを使用すると、SQL クエリに一意の変数名が付けられるようになり、「すでに宣言されている」変数名が使用されることを防ぐことができます。エラー。
以上がSQL クエリで「変数名はすでに宣言されています」エラーがスローされるのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。