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

时间:2009-07-16 02:20:52

标签: oracle asp-classic named-parameters

我目前正在开发一个与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

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

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

1 个答案:

答案 0 :(得分:2)

您如何定义filter_value?如果它没有被声明为String或者你已经分配了一个超过10个字符的字符串(正如你在创建参数时指出的那样),你就会遇到问题。

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

请参阅Oracle® Provider for OLE DB Developer's Guide 11g Release 1 (11.1)或按照任何previous versions(8iR3,9i,9iR2,10g,10gR2)上的“命令参数”标题链接:

  

命令参数

     

使用Oracle ANSI SQL时的参数   在命令文本中以a开头   结肠。在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;"`