对 asp 中的参数化 SQL 语句进行故障排除

The*_*ude 5 vbscript adodb asp-classic

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

我对语言和 ADODB 库的了解来自 W3Schools文档这篇文章

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

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
Run Code Online (Sandbox Code Playgroud)

我的最终目标不仅是从这个表中得到一个计数,而是要足够好地理解 adodb 库,以便我可以继续参数化这个遗留代码库中需要它的所有查询。

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

编辑

我希望我能接受这两个答案作为公认的答案,因为我认为它们是完美的答案。我最终使用了两者,所以请给这些人点赞。

Lan*_*art 3

当使用ADODB 所期望的占位符 isCommandType并尝试传递命名参数(如中的)时,将会失败。ADODB 的一个不幸的失败是adCmdText?@fyCommandText

countCmd.NamedParameters = True
Run Code Online (Sandbox Code Playgroud)

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

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

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

有用的链接