【问题标题】:Troubleshooting a Parameterized SQL Statement in asp对 asp 中的参数化 SQL 语句进行故障排除
【发布时间】:2016-11-12 17:48:42
【问题描述】:

我正在尝试保护一些用我猜是 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 库,以便我可以继续参数化这个遗留代码库中需要它的所有查询。

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

编辑

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

【问题讨论】:

  • 它是经典的 ASP,语言是 VBScript。 VBScript 和 VB 不同,就像 Java 和 Javascript 不同一样。乍一看,我认为您的查询。让我印象深刻的第一件事是您的查询行应该是countCmd.commandText = "SELECT COUNT(*) FROM [table1] WHERE FY=?",即用“?”替换“@fy”。我始终建议按照此页面上的步骤调试 Classic ASP chestysoft.com/asp-error-messages.asp
  • 我假设“fy”是您之前在代码中定义的变量
  • @Noodles 我不同意,John 在they are different 上。 VBA 和 VBScript 都基于 VB 编程语言,但各不相同,VBScript 也是一种脚本语言。它可能共享 VB 语法,但有一些关键区别,例如 VBScript 是无类型的,而 VBA 和 VB 不是。如果说 VB 和 VBA 之间有更多的共同点,那么它们就是 VBScript。继续讨论 IE 和 ScriptControl 只会让事情变得更加混乱。它们都是 VB 的子集,这也是它们的相似之处。
  • @Noodles 这是一个编译器选项,是的。但不推荐,因为 VBScript 默认是无类型的,不能是别的。老实说,这次谈话毫无意义,而且从一开始就是这样。
  • 它松散地基于 Fortran - 一种科学编程语言。这很容易学习。它允许人们专注于解决现实世界的问题(即会计或科学),而不必处理 CPU 的工作方式和计算机的架构方式(大多数现代语言在不同程度上也是如此)。今天的基础与昨天的基础非常不同,尽管做某事的基础是相同的。 有趣的事实。 1970 年代的所有 Microsoft Basics 都具有由比尔盖茨和保罗艾伦编写的相同错误代码。 5 Invalid procedure call or argument 是比尔的遗产之一。

标签: vbscript asp-classic adodb


【解决方案1】:

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

countCmd.NamedParameters = True

仅适用于CommandTypeadCmdStoredProc,并且仅适用于某些提供商。

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

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

有用的链接

【讨论】:

    【解决方案2】:

    要使用命名参数,您需要启用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
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-10-02
      • 2011-02-07
      • 2013-11-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多