動的に生成された (かなりサニタイズされていますが) SQL クエリからパラメーター化された SQL に移行していますが、変数名で問題が発生しています。
jScript でコーディングされた Classic ASP を使用しています。
以下のコードは、評価値 (1 ~ 5) を受け取り、それをデータベースに入れます。最初に、そのオブジェクトに対するユーザーの以前の評価をすべて削除してから、新しい評価をデータベースに書き込みます。関数は既に受け取っており、Rating 変数 (TinyInt) を解析しました。UserID と PgID の値 (どちらも整数) も送信されています。
@UserID、@PgID、および @Rating を疑問符に置き換え、DECLARE を削除し、Append/CreateParemeter 行を適切な順序 (それぞれに 1 つずつ) に配置することで、これは既に機能しています。ただし、Append/CreateParameter 行を複数回 (UserID のインスタンスごとに 1 回) 呼び出す必要がありますが、これはずさんです。
このコードのチャンクはエラーをスローしませんが、データベースには何も書き込んでいません。とにかく、疑問符が配置されている(およびパラメーターが重複している)と機能する理由はわかりませんが、宣言されたvarsでは機能しません。
従来の ASP jScript でパラメーター化された SQL を使用する場合、名前付き変数を使用するにはどうすればよいですか?
それを行う方法がない場合、ユーザー ID など、必要なたびに同じ Append/CreateParamenter 行を繰り返さなくても済むようにする方法はありますか?
var sqlReview = "DECLARE @UserID AS Int, @PgID AS Int, @Rating AS TinyInt;"
sqlReview += "DELETE FROM PGrating WHERE (UserID = @UserID) AND (PgID = @PgID);"
sqlReview += "INSERT INTO PGrating (InsertDate, PgID, UserID, Rating) VALUES (GETDATE(), @PgID, @UserID, @Rating);"
var thisConnection = Server.CreateObject("ADODB.Connection");
thisConnection.connectionString = connectString;
thisConnection.Open();
var thisCommand = Server.CreateObject("ADODB.Command");
thisCommand.ActiveConnection = thisConnection;
thisCommand.CommandText = sqlReview;
thisCommand.CommandType = adCmdText;
thisCommand.Parameters.Append(thisCommand.CreateParameter("@UserID", adSmallInt, adParamInput, 2, UserID));
thisCommand.Parameters.Append(thisCommand.CreateParameter("@PgID", adInteger, adParamInput, 4, PgID));
thisCommand.Parameters.Append(thisCommand.CreateParameter("@Rating", adTinyInt, adParamInput, 1, Rating));
var rs = thisCommand.Execute();
thisCommand = null;
thisConnection = null;
評価をデータベースに入れるもっと簡単な方法があるかもしれないことは知っていますが、この例は主に単純であり、パラメーター化された SQL の使用方法を学ぶときに単純なものが必要だったために作成されました。また、ここに掲載する前に、さらに単純化 (および再テスト) しました。これが機能するようになったら、より複雑なクエリを作成できます。はい、ストアド プロシージャを作成しますが、それは後で、すべてが機能した後で行います。