2009-07-07 24 views
3

ASPクラシックでパラメータ化クエリを作成しようとしていますが、壁に頭を打っているように感じ始めています。私は次のエラーを取得しています:パラメータのクエリでASPクラシック名前付きパラメータ:スカラー変数を宣言する必要があります

Must declare the scalar variable "@something".

私はハローラインが何をするかですが、多分私は何かが欠けてい誓う... ADOは疑問符を期待するために起こっている

<% OPTION EXPLICIT %> 
<!-- #include file="../common/adovbs.inc" --> 
<% 

    Response.Buffer=false 

    dim conn,connectionString,cmd,sql,rs,parm 

    connectionString = "Provider=SQLOLEDB.1;Integrated Security=SSPI;Data Source=.\sqlexpress;Initial Catalog=stuff" 
    set conn = server.CreateObject("adodb.connection") 
    conn.Open(connectionString) 

    set cmd = server.CreateObject("adodb.command") 
    set cmd.ActiveConnection = conn 
    cmd.CommandType = adCmdText 
    cmd.CommandText = "select @something" 
    cmd.NamedParameters = true 
    cmd.Prepared = true 
    set parm = cmd.CreateParameter("@something",advarchar,adParamInput,255,"Hello") 
    call cmd.Parameters.append(parm) 
    set rs = cmd.Execute 
    if not rs.eof then 
     Response.Write rs(0) 
    end if 


%> 

答えて

3

この場合、実際のパラメータ名の代わりに使用します。現時点では、SQL「select @something」は実際にはパラメータ化されません。パラメータとしてではなく、(宣言されていない)SQL変数として「@something」が表示されます。 CommandText行を次のように変更してください。

cmd.CommandText = "select ?" 

そして、あなたが探している結果が得られると思います。

幸運を祈る!

+0

イップ。私もそれを得ることができました。しかし、クエリやステートメントがより複雑になると、パラメータの順序を把握するのが難しくなるため、指定されたアスペクトを有効にしたいと思っています。 –

+1

これのいくつかのバリエーションを試した後、私は解決策を思い付くことができませんでした。私は、SQLコマンドを送信せずにストアドプロシージャを呼び出す場合にのみ、名前付きパラメータの使用がうまくいくと考えています。 –

0

あなたのクエリが達成しようとしていることがわかりません。私はまた、選択リストにパラメータが許可されているかどうかはわかりません。 MSDNでは以前はクエリの中でパラメータが許可されていた場所について多少の記事を書いていましたが、今は見つからないようです。

OTTOMHでは、ADOにパラメータ値を指定しようとすると正しく表示されます。あなたがこのようなことをするならあなたの質問は実行されますか?

SELECT 1 FROM sometable WHERE somefield = @something 
+0

疑問符で正常に動作するので、パラメータは選択リストに入れることができます。問題はwhere句にパラメータを移動すると同じです。クエリのポイントは、私が他の人が悩まされることができる最短の例を持つことです。 –

4

ここに、SQLインジェクション攻撃を防ぐためのMSDNライブラリ記事のサンプルコードがあります。私は元のURLを見つけることができませんが、タイトルキーワード(ASPでのSQLインジェクションの予防)のグーグルでは、十分速くそこにあなたを取得する必要があります。この現実の例が役立つことを願っています。

strCmd = "select title, description from books where author_name = ?" 
Set objCommand.ActiveConnection = objConn 
objCommand.CommandText = strCmd 
objCommand.CommandType = adCmdText 
Set param1 = objCommand.CreateParameter ("author", adWChar, adParamInput, 50) 
param1.value = strAuthor 
objCommand.Parameters.Append param1 
Set objRS = objCommand.Execute() 

MSDNの以下のページの下部にある、特に名前付きパラメータを参照してください。

MSDN example

+2

ありがとうございます。名前付きパラメータでそれを行う方法はありますか? –

+0

私は答えに投稿した更新を見てください。 –

3
with server.createobject("adodb.command") 
    .activeConnection = application("connection_string") 
    .commandText = "update sometable set some_col=? where id=?" 
    .execute , array(some_value, the_id) 
end with 
関連する問題