5

我目前正在处理一个与 Oracle 数据库对话的经典 ASP 项目。我正在尝试找到一种方法来安全地调用 Oracle PL/SQL 脚本并使用 ADO 传递参数。当前的解决方案使用如下嵌入式变量手动构建 SQL 脚本:

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

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

我到目前为止的代码(从各种非经典的基于 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

这会导致错误“参数对象定义不正确。提供的信息不一致或不完整”</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 回答