在asp中排除参数化SQL语句的故障

时间:2016-07-10 19:37:43

标签: vbscript asp-classic adodb

我试图保护一些用我猜的VB或asp编写的遗留代码(不确定是否存在差异)。当我尝试执行该语句时,页面出现内部服务器错误。我确信这是连接的结果,但我不太了解该语言,无法知道如何排除故障。

我所知道的语言和ADODB库来自W3Schools documentationthis post

以下是我编写的代码(识别已编辑的信息)

SET Conn=server.CreateObject("adodb.connection")
Conn.Open "Provider=sqloledb;SERVER=I;DATABASE=Hate;UID=My;PWD=Life;"

SET countCmd = createobject("adodb.command")
countCmd.ActiveConnection = Conn
countCmd.commandText = "SELECT COUNT(*) FROM [table1] WHERE FY=@fy"

countCmd.Parameters.Append countCmd.createparameter("@fy", 200, 1, 255, fy)
SET pcount = countCmd.Execute() 'This is where the error happens

我的最终目标不仅仅是从此表中获取计数,而是要充分了解adodb库,以便继续参数化此遗留代码库中需要它的所有查询。

我感谢任何帮助,并希望得到详细解释。

修改

我希望我能接受这两个答案作为公认的答案,因为我认为他们是完美的答案。我最终都使用了这两个人,所以赞成这些家伙。

2 个答案:

答案 0 :(得分:3)

要使用命名参数,您需要启用NamedParameters

countCmd.NamedParameters = True

但是有一个限制会影响你。

Adodb.Command中,命名参数仅适用于存储过程。

对于像您这样的普通查询,您需要使用问号占位符而不是命名的占位符。

然后您可以省略或指定CreateParameter方法的第一个参数的垃圾值。

countCmd.NamedParameters = False
countCmd.CommandText = "SELECT COUNT(*) FROM [table1] WHERE FY=?"
countCmd.Parameters.Append countCmd.createparameter(, 200, 1, 255, fy)
'countCmd.Parameters.Append countCmd.createparameter("@blablabla", 200, 1, 255, fy) 'this also works

答案 1 :(得分:3)

使用CommandType adCmdText时,ADODB预期的占位符为?,并尝试在@fy中传递CommandText等命名参数将失败。在ADODB中,这是一个不幸的失败

countCmd.NamedParameters = True

仅适用于CommandType adCmdStoredProc,仅适用于某些提供商。

然而,SQL Server (可能还有其他提供商可能取决于它们支持的内容)有一个简单的解决方法,就像在CommandText中构建命名参数一样;

countCmd.commandText = _
    "DECLARE @fy AS VARCHAR(255);" & vbCrLf & _
    "SET @fy = ?;" & vbCrLf & _
    "SELECT COUNT(*) FROM [table1] WHERE FY=@fy;"

有用的链接