5

私は現在、Oracleデータベースと通信する従来のASPプロジェクトに取り組んでいます。Oracle PL / SQLスクリプトを安全に呼び出し、ADOを使用してパラメータを渡す方法を見つけようとしています。現在のソリューションでは、次のような埋め込み変数を使用してSQLスクリプトを手動で作成します。

strSQL = "SELECT field1, etc FROM my_table WHERE (field = '" & filter_value & "')"

もちろん、これは醜くて安全ではなく、悪用される可能性があります。

私がこれまでに持っているコード(さまざまな非古典的なaspベースのWebサイトから取得)は次のようになります。

dim strSQL, oConn, oCommand, oParam
set oConn = server.createobject("ADODB.Connection")
oConn.Open myConnString

strSQL = "SELECT field1, etc FROM my_table WHERE (field = :filter_field)"

dim oFilteredList
set oFilteredList = Server.CreateObject("ADODB.Command")
oFilteredList.ActiveConnection = oConn
oFilteredList.CommandText = strSQL
oFilteredList.CommandType = adCmdText
oFilteredList.NamedParameters = True

set oParam = oFilteredList.CreateParameter("filter_field", adVarChar, adParamInput, 10, filter_value)
oFilteredList.Parameters.Append oParam

set rsResults = oFilteredList.Execute

これにより、「パラメータオブジェクトが正しく定義されていません。一貫性のない、または不完全な情報が提供されました」</ p>

ADOから名前付きパラメータを使用してOracle/PL / SQLを呼び出す正しい方法は何ですか?実際のSQLコードはやや複雑であり、SQLコマンド全体で異なるパラメーターが複数回使用されるため、名前付きパラメーターを使用する必要があります。

4

1 に答える 1

2

どのようにfilter_value定義しましたか?文字列として宣言されていない場合、または 10 文字を超える文字列を割り当てた場合 (パラメーターの作成時に指定したように)、問題が発生します。

さらに (一部は私自身の参考のために)、名前付きパラメーターは OraOLEDB (つまり ADODB) 経由ではサポートされていません。

Oracle® Provider for OLE DB Developer's Guide 11g Release 1 (11.1)を参照するか、以前のバージョン(8iR3、9i、9iR2、10g、10gR2)のいずれかの「コマンド パラメータ」見出しリンクに従ってください。

コマンド パラメータ

Oracle ANSI SQL を使用する場合、コマンド テキスト内のパラメータの前にコロンを付けます。ODBC SQL では、パラメーターは疑問符 (?) で示されます。

OraOLEDB は、PL/SQL ストアド プロシージャとストアド ファンクションの入力パラメータ、出力パラメータ、および入力パラメータと出力パラメータをサポートしています。OraOLEDB は、SQL 文の入力パラメータをサポートしています。

"注意: OraOLEDB は位置バインディングのみをサポートします。"

とはいえ、これは OraOLEDB を使用する場合のクエリには関係ありません。

oFilteredList.NamedParameters = True

Oracle 10gR2でも、残りの例が示すように、クエリの実行に成功しました。

接続文字列が表示されないため、有効であると想定する必要があります。動作はオプションによって異なる可能性があるため、私がうまく使用しているものは次のとおりです。

`"Provider=OraOLEDB.Oracle;Data Source=TNSNAMES_ENTRY;User ID=XXXX;Password=YYYY;DistribTx=0;"`
于 2009-08-26T21:38:05.833 に答える