在Classic ASP中从ADODB调用参数化Oracle查询

Buz*_*ick 5 oracle named-parameters asp-classic

我目前正在开发一个与Oracle数据库交谈的经典ASP项目.我正试图找到一种方法来安全地调用Oracle PL/SQL脚本并使用ADO传递参数.当前的解决方案使用嵌入式变量手动构建SQL脚本,如下所示:

strSQL = "SELECT field1, etc FROM my_table WHERE (field = '" & filter_value & "')"
Run Code Online (Sandbox Code Playgroud)

当然,这是丑陋和不安全的,并且容易被滥用.

到目前为止我所拥有的代码(来自各种非经典的基于asp的网站)看起来像这样:

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
Run Code Online (Sandbox Code Playgroud)

这会导致错误"参数对象未正确定义.提供的信息不一致或不完整"

使用ADO中的命名参数调用Oracle/PL/SQL的正确方法是什么?我需要使用命名参数,因为实际的SQL代码有点复杂,并且在整个SQL命令中多次使用不同的参数.

BQ.*_*BQ. 2

你是怎么filter_value定义的?如果它没有声明为字符串,或者您分配的字符串长度超过 10 个字符(正如您在创建参数时所指示的那样),则会遇到问题。

\n\n

另外(部分供我自己参考),OraOLEDB(即 ADODB)不支持命名参数

\n\n

请参阅Oracle\xc2\xae Provider for OLE DB Developer\'s Guide 11g Release 1 (11.1)或点击任何先前版本(8iR3、9i、9iR2、10g、10gR2)上的“命令参数”标题链接:

\n\n
\n

命令参数

\n\n

使用 Oracle ANSI SQL 时,命令文本中的参数前面带有冒号。在 ODBC SQL 中,参数由问号 (?) 表示。

\n\n

OraOLEDB 支持 PL/SQL 存储过程和存储函数的输入、输出以及输入和输出参数。OraOLEDB 支持 SQL 语句的输入参数。

\n\n

注意:OraOLEDB 仅支持位置绑定。”

\n
\n\n

也就是说,在使用 OraOLEDB 时,这应该对您的查询没有影响:

\n\n
oFilteredList.NamedParameters = True\n
Run Code Online (Sandbox Code Playgroud)\n\n

我已经成功地在 Oracle 10gR2 上运行了查询,正如示例的其余部分所示。

\n\n

您没有显示您的连接字符串,因此我必须假设它是有效的。行为可能会根据那里的选项而有所不同,所以这是我成功使用的:

\n\n
`"Provider=OraOLEDB.Oracle;Data Source=TNSNAMES_ENTRY;User ID=XXXX;Password=YYYY;DistribTx=0;"`\n
Run Code Online (Sandbox Code Playgroud)\n