我试图保护一些用我猜的VB或asp编写的遗留代码(不确定是否存在差异)。当我尝试执行该语句时,页面出现内部服务器错误。我确信这是连接的结果,但我不太了解该语言,无法知道如何排除故障。
我所知道的语言和ADODB库来自W3Schools documentation和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
我的最终目标不仅仅是从此表中获取计数,而是要充分了解adodb库,以便继续参数化此遗留代码库中需要它的所有查询。
我感谢任何帮助,并希望得到详细解释。
我希望我能接受这两个答案作为公认的答案,因为我认为他们是完美的答案。我最终都使用了这两个人,所以赞成这些家伙。
答案 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;"