1

Adodb.Commandを介した次のクエリで名前付きパラメーターを使用しようとしていますが、うまくいきません。

Select * From mytable Where col1 = Lower(@param1) And col2 = Upper(@param2) And col3 = @param1

私が使用したコードはそのようなものです。

Dim cmd
Set cmd = Server.CreateObject("Adodb.Command")
cmd.NamedParameters = True
cmd.CommandType = adCmdText
cmd.CommandText = "Select * From mytable Where col1 = Lower(@param1) And col2 = Upper(@param2) And col3 = @param1"
cmd.Parameters.Append cmd.CreateParameter("@param1", adVarchar, adParamInput, 20, "some text 1")
cmd.Parameters.Append cmd.CreateParameter("@param2", adVarchar, adParamInput, 20, "some text 2")
Set cmd.ActiveConnection = cn
Dim rs
Set rs = cmd.Execute

問題は、これによりRDBMS側でエラーが発生することです。

Microsoft OLE DB Provider for SQL Server error '80040e14' 

Must declare the scalar variable "@param1".

クエリがストアドプロシージャ呼び出しであれば問題ありません。したがって、namedparametersは、ストアドプロシージャを呼び出すコマンドオブジェクトにのみ影響すると思います。SQL Server Profilerを使用してクエリを追跡すると、次のクエリが実行されていることがわかりました(パラメーター宣言や値の割り当てがないことに注意してください)

SQL:BatchStarting   Select * From mytable Where col1 = Lower(@param1) And col2 = Upper(@param2)
SQL:BatchCompleted  Select * From mytable Where col1 = Lower(@param1) And col2 = Upper(@param2)

ただし、ネイティブの可変クエリでそれを行う必要があります。どうすればよいですか、文字列の連結などなしでそれを行うためのベストプラクティスは何ですか?疑問符付きのクエリを準備したくないし、順序付きのパラメータを渡すのも好きではありません(疑問符付きで名前付きパラメータなしで必要です)そして複数回。どんな助けでも大歓迎です。

誤解に関する最新情報:データベースに依存しない一般的な解決策を探しています。

4

1 に答える 1

8

OLE DB のアドホック クエリで名前付きパラメーターを使用することはできません。SQL Server を使用している場合は、次のようにすることができます。

Dim sql
sql = ""
sql = sql & "DECLARE @param1 varchar(20) = ?;"
sql = sql & "DECLARE @param2 varchar(20) = ?;"
sql = sql & "Select * From mytable Where col1 = Lower(@param1) And col2 = Upper(@param2) And col3 = @param1;"

' This section is basically the same as in the original question
Dim cmd
Set cmd = Server.CreateObject("Adodb.Command")
cmd.CommandType = adCmdText
cmd.CommandText = sql
cmd.Parameters.Append cmd.CreateParameter("@param1", adVarchar, adParamInput, 20, "some text 1")
cmd.Parameters.Append cmd.CreateParameter("@param2", adVarchar, adParamInput, 20, "some text 2")
Set cmd.ActiveConnection = cn
Dim rs
Set rs = cmd.Execute

パラメータを位置的にバインドする必要がありますが、この方法では正しい順序が見やすくなり、複数の場所で同じパラメータを使用できます。

于 2012-08-03T03:11:50.367 に答える