3

動的に生成された (かなりサニタイズされていますが) 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 の使用方法を学ぶときに単純なものが必要だったために作成されました。また、ここに掲載する前に、さらに単純化 (および再テスト) しました。これが機能するようになったら、より複雑なクエリを作成できます。はい、ストアド プロシージャを作成しますが、それは後で、すべてが機能した後で行います。

4

3 に答える 3

4

繰り返しを避けたい場合はDECLARE、変数に進み、その値を一度設定できます。

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);"

上記は、SQL Server 2008 以降を想定しています。下位バージョンでは、割り当て用に別の行が必要になります。

var sqlReview = "DECLARE @UserID AS Int, @PgID AS Int, @Rating AS TinyInt;"
sqlReview += "SELECT @UserID = ?, @PgID = ?, @Rating = ?;"
sqlReview += "DELETE FROM PGrating WHERE (UserID = @UserID) AND (PgID = @PgID);"
sqlReview += "INSERT INTO PGrating (InsertDate, PgID, UserID, Rating) VALUES (GETDATE(), @PgID, @UserID, @Rating);"
于 2011-06-17T02:49:26.140 に答える
2

adCmdText を使用する場合、?プレースホルダーを使用してパラメーターを宣言する必要があります。パラメータを追加すると、ADO は、追加した順序に基づいてパラメータ シーケンスを決定します。

ただし、これをストアド プロシージャに変換すると、実行しようとしているとおりに名前付きパラメーターを使用でき、順序は問題になりません。ただし、必要な結果を得るには、クエリをストアド プロシージャに移動する必要があります。

詳細については、このMSDN の記事を参照してください。

于 2011-06-17T01:33:45.867 に答える
0

SQL Server プロバイダーではなく、ADO プロバイダーを使用しています。

ADO パラメーター化クエリ構文は?、名前ではなくパラメーター用です。

于 2011-06-16T19:20:26.127 に答える