对 asp 中的参数化 SQL 语句进行故障排除
Troubleshooting a Parameterized SQL Statement in asp
我正在尝试保护一些遗留代码,我猜是 VB 或 asp(不确定是否存在差异)。当我尝试执行语句时,页面出现内部服务器错误。我确信这是连接的结果,但我不太了解该语言,无法知道如何解决它。
我对语言和 ADODB 库的了解来自 W3Schools documentation and this 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
我的最终目标不仅仅是从这个 table 中得到一个计数,而是要充分理解 adodb 库,以便我可以继续参数化这个遗留代码库中需要它的所有查询。
感谢任何帮助,希望得到详细的解释。
编辑
我希望我能接受这两个答案作为可接受的答案,因为我认为它们是完美的答案。我最终同时使用了这两个,所以赞成这些家伙。
要使用命名参数,您需要启用 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
当使用 adCmdText
的 CommandType
时,ADODB 期望的占位符是 ?
并尝试在 CommandText
中传递命名参数,如 @fy
将失败。
ADODB 中的一个不幸失败
countCmd.NamedParameters = True
仅适用于 adCmdStoredProc
的 CommandType
,并且仅适用于某些提供商。
然而,对于 SQL 服务器 (可能还有其他提供程序,具体取决于他们支持的内容) 有一个简单的解决方法,即在 CommandText
像这样;
countCmd.commandText = _
"DECLARE @fy AS VARCHAR(255);" & vbCrLf & _
"SET @fy = ?;" & vbCrLf & _
"SELECT COUNT(*) FROM [table1] WHERE FY=@fy;"
有用的链接
ADODB.Parameters error '800a0e7c' Parameter object is improperly defined. Inconsistent or incomplete information was provided
我正在尝试保护一些遗留代码,我猜是 VB 或 asp(不确定是否存在差异)。当我尝试执行语句时,页面出现内部服务器错误。我确信这是连接的结果,但我不太了解该语言,无法知道如何解决它。
我对语言和 ADODB 库的了解来自 W3Schools documentation and this 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
我的最终目标不仅仅是从这个 table 中得到一个计数,而是要充分理解 adodb 库,以便我可以继续参数化这个遗留代码库中需要它的所有查询。
感谢任何帮助,希望得到详细的解释。
编辑
我希望我能接受这两个答案作为可接受的答案,因为我认为它们是完美的答案。我最终同时使用了这两个,所以赞成这些家伙。
要使用命名参数,您需要启用 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
当使用 adCmdText
的 CommandType
时,ADODB 期望的占位符是 ?
并尝试在 CommandText
中传递命名参数,如 @fy
将失败。
countCmd.NamedParameters = True
仅适用于 adCmdStoredProc
的 CommandType
,并且仅适用于某些提供商。
然而,对于 SQL 服务器 (可能还有其他提供程序,具体取决于他们支持的内容) 有一个简单的解决方法,即在 CommandText
像这样;
countCmd.commandText = _
"DECLARE @fy AS VARCHAR(255);" & vbCrLf & _
"SET @fy = ?;" & vbCrLf & _
"SELECT COUNT(*) FROM [table1] WHERE FY=@fy;"
有用的链接
ADODB.Parameters error '800a0e7c' Parameter object is improperly defined. Inconsistent or incomplete information was provided