Asp classic 参数化查询中的ASP Classic命名参数:必须声明标量变量

Asp classic 参数化查询中的ASP Classic命名参数:必须声明标量变量,asp-classic,parameterized,named-parameters,Asp Classic,Parameterized,Named Parameters,我正试图用ASP Classic编写一个参数化查询,现在我开始觉得我的头撞到墙上了。我得到以下错误: 必须声明标量变量“@something” 我发誓这就是打招呼的方式,但也许我错过了什么 <% OPTION EXPLICIT %> <!-- #include file="../common/adovbs.inc" --> <% Response.Buffer=false dim conn,connectionString,cmd,sql,rs,

我正试图用ASP Classic编写一个参数化查询,现在我开始觉得我的头撞到墙上了。我得到以下错误:

必须声明标量变量“@something”

我发誓这就是打招呼的方式,但也许我错过了什么

<% OPTION EXPLICIT %>
<!-- #include file="../common/adovbs.inc" -->
<%

    Response.Buffer=false

    dim conn,connectionString,cmd,sql,rs,parm

    connectionString = "Provider=SQLOLEDB.1;Integrated Security=SSPI;Data Source=.\sqlexpress;Initial Catalog=stuff"
    set conn = server.CreateObject("adodb.connection")
    conn.Open(connectionString)

    set cmd = server.CreateObject("adodb.command")
    set cmd.ActiveConnection = conn
    cmd.CommandType = adCmdText
    cmd.CommandText = "select @something"
    cmd.NamedParameters = true
    cmd.Prepared = true
    set parm = cmd.CreateParameter("@something",advarchar,adParamInput,255,"Hello")
    call cmd.Parameters.append(parm)
    set rs = cmd.Execute
    if not rs.eof then
        Response.Write rs(0)
    end if


%>

在本例中,ADO将使用问号而不是实际的参数名。现在,SQL“select@something”实际上没有参数化:它将“@something”视为一个(未声明的)SQL变量,而不是一个参数。将命令文本行更改为:

cmd.CommandText = "select ?"
我想你会得到你想要的结果


祝你好运

我不确定您的查询的目的是什么。我也不确定选择列表中是否允许使用参数。MSDN过去(可能是很多年前)有一篇关于查询中允许哪些参数的文章,但我现在似乎找不到了

OTTOMH,您向ADO提供参数值的尝试看起来是正确的。如果您这样做,您的查询会执行吗

SELECT 1 FROM sometable WHERE somefield = @something

下面是MSDN库中关于防止SQL注入攻击的文章中的一些示例代码。我找不到原始的URL,但是通过谷歌搜索标题关键字(防止ASP中的SQL注入)应该可以让你足够快地到达那里。希望这个真实的例子能有所帮助

strCmd = "select title, description from books where author_name = ?"
Set objCommand.ActiveConnection = objConn
objCommand.CommandText = strCmd
objCommand.CommandType = adCmdText
Set param1 = objCommand.CreateParameter ("author", adWChar, adParamInput, 50)
param1.value = strAuthor
objCommand.Parameters.Append param1
Set objRS = objCommand.Execute()
请参阅MSDN的下一页,靠近底部,具体指的是命名参数


它可以在带有问号的情况下正常工作,因此参数可以位于选择列表中。如果我将参数移动到where子句,问题也是一样的。这个查询的目的是提供一个最短的示例,供其他人修改。Yip。我也设法做到了。但是我真的很想让命名方面工作起来,因为一旦查询或语句变得更加复杂,就很难跟踪参数顺序。在尝试了一些不同的方法之后,我也没能想出一个解决方案。我怀疑只有在调用存储过程而不是发送SQL命令时,使用命名参数才能起作用。谢谢。是否有任何方法可以使用命名参数执行此操作?
with server.createobject("adodb.command")
  .activeConnection = application("connection_string")
  .commandText = "update sometable set some_col=? where id=?"
  .execute , array(some_value, the_id)
end with