带有子查询错误的ADO参数化查询

我有一个运行SQL Server 2012(也已通过2016测试)的旧版经典ASP应用程序,我试图切换为使用参数化查询。该站点的所有查询都通过一个函数运行,该函数期望sql语句为带问号表示的参数的字符串以及这些参数的数组。该函数当前会过滤参数以使它们成为sql安全的对象,并在执行该语句之前将其放入sql字符串中。

鉴于此,我认为将其切换到参数化查询将非常简单。初始测试看起来不错,直到我在子查询中找到带有参数的sql语句之前,一切似乎都能正常工作。

以下是有效方法的测试样本:

Const connectionString = "Provider=SQLNCLI11; Server=********; Database=********; UID=*******; PWD=*******"

Dim sql,productId,parameters
sql = "SELECT SKU FROM Products WHERE ProductId = ?"
productId = 3
parameters = Array(productId)

Dim conn
Set conn = Server.CreateObject("ADODB.Connection")
conn.Open connectionString

Dim cmd
Set cmd = Server.CreateObject("ADODB.Command")
cmd.activeConnection = conn
cmd.CommandText = sql
cmd.Parameters.Refresh

Dim rs
Set rs = cmd.Execute(,parameters)

Response.Write("SKU: " & rs("SKU"))

没问题,这将按预期返回SKU。但是,如果我使用子查询:

Const connectionString = "Provider=SQLNCLI11; Server=********; Database=********; UID=*******; PWD=*******"

Dim sql,parameters
'contrived subquery for demonstration purposes
sql = "SELECT SKU FROM ( SELECT SKU FROM Products WHERE ProductId = ? ) AS P"
productId = 3
parameters = Array(productId)

Dim conn
Set conn = Server.CreateObject("ADODB.Connection")
conn.Open connectionString

Dim cmd
Set cmd = Server.CreateObject("ADODB.Command")
cmd.activeConnection = conn
cmd.CommandText = sql
cmd.Parameters.Refresh

Dim rs
Set rs = cmd.Execute(,parameters)

Response.Write("SKU: " & rs("SKU"))

它在cmd.Parameters.Refresh行上引发错误:

microsoft VBScript运行时错误'0x80004005' microsoft SQL Server本机客户端11.0 语法错误,权限冲突或其他非特定错误

如果我在第一个示例中检查cmd.Parameters.Count,我将正确得到1。在错误的示例中,它将引发相同的错误。

关于为什么将参数放入子查询会导致参数收集出现问题,是否有任何解释?我确实尝试过将参数手动添加到Parameters集合中,并且工作正常,但这意味着修改数百个现有的sql调用,因此就目前而言,cmd.Parameters.Refresh往返是值得的。

jakela 回答:带有子查询错误的ADO参数化查询

您可以给cmd.execute所需的内容,但是我已经很长时间没有使用它了。

cmd.execute(“选择SKU来自(选择产品ID为?的产品的SKU)AS P”,Array(productId))

本文链接:https://www.f2er.com/3033305.html

大家都在问