2009-07-07 58 views
3

我试图在ASP经典中编写参数化的查询,并且它开始感觉像我在靠墙敲打我的头。我收到以下错误:ASP经典的参数在参数化查询中:必须声明标量变量

Must declare the scalar variable "@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 


%> 

回答

3

ADO是要指望问号而不是在这种情况下的实际参数名称。现在,SQL“select @something”实际上没有参数化:它将“@something”看作(未声明的)SQL变量,而不是参数。将您的CommandText行更改为:

cmd.CommandText = "select ?" 

我想你会得到你要找的结果。

祝你好运!

+0

业。我设法做到了这一点。但是我真的很想让命名方面起作用,因为一旦查询或语句更多地涉及到参数顺序,就很难跟踪参数顺序。 – 2009-07-08 06:59:44

+1

尝试了几个变化后,我无法提出解决方案。我怀疑只有在调用存储过程时才使用命名参数,而不是发送SQL命令。 – 2009-07-14 20:11:59

0

我不确定你的查询是有意完成的。我也不确定参数在选择列表中是否被允许。 MSDN曾经有(很多年前,很可能)一篇关于查询允许参数的好文章,但我现在似乎无法找到它。

OTTOMH,您尝试将参数值提供给ADO看起来是正确的。如果你做这样的事情,你的查询是否执行?

SELECT 1 FROM sometable WHERE somefield = @something 
+0

它工作正常,带有问号,因此参数可以在选择列表中。如果我将参数移到where子句,问题是一样的。这个问题的关键是要有我能想到的最简单的例子,供其他人修饰。 – 2009-07-08 06:57:42

4

以下是MSDN Library关于防止SQL注入攻击的一些示例代码。我无法找到原始网址,但是使用标题关键字(防止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上靠近底部的以下页面,具体提及命名参数。

MSDN example

3
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