【问题标题】:Cannot use parentheses when calling a Sub调用 Sub 时不能使用括号
【发布时间】:2009-10-06 13:41:12
【问题描述】:

我有一个经典 ASP 页面,其中包含以下代码来尝试参数化查询;

<%
Set cmdEmail = Server.CreateObject("ADODB.Command")
Set rsEmail = Server.CreateObject("ADODB.Recordset")

cmdEmail.CommandText = "SELECT * FROM VWTenantPropertiesResults WHERE ContentID = ?"
cmdEmail.CommandType = 1
cmdEmail.ActiveConnection = MM_dbconn_STRING
cmdEmail.Parameters.Append
cmdEmail.CreateParameter("@ContentID", 3, 1, , request.Form("ContentID"))

rsEmail.Open cmdEmail
%>

但是页面现在报如下错误;

调用 Sub 时不能使用括号 /welcome/default2.asp,第 436 行 cmdEmail.CreateParameter("@ContentID", 3, 1, , request.Form(ContentID)) -------------------------------------------------- ---------------------^

这是 ASP 的一些错误,还是我需要更改尝试参数化查询的方式?

谢谢。

【问题讨论】:

  • 顺便说一句,您希望避免将字符串分配给 ActiveConnection 属性。当您这样做时,ADODB 没有正确使用连接缓存,这确实会损害性能。始终创建一个 Connection 对象。

标签: sql asp-classic properties


【解决方案1】:

您是否尝试删除这些括号?

cmdEmail.CreateParameter "@ContentID", 3, 1, , Request.Form("ContentID")

据我所知,当你调用一个函数并且不使用它的返回值时,总是会发生这种情况。

更新:似乎真正的问题是换行:


cmdEmail.Parameters.Append _     '' note this "_" character
    cmdEmail.CreateParameter("@ContentID", 3, 1, , Request.Form("ContentID"))

【讨论】:

  • 嗨。我确实尝试过,但它说预期语句结束,就在“@ContentID”之前
  • 谢谢大家。通常只是一个让我印象深刻的单词或字符。
【解决方案2】:

你是不是漏掉了里面的“Set”语句?

即:

<%
Set cmdEmail = Server.CreateObject("ADODB.Command")
Set rsEmail = Server.CreateObject("ADODB.Recordset")

更新:

回应尼尔的评论:

感谢克雷格TP。好像是 创建 ADODB.Command 的实例 和 ADODB.Recordset,但有问题 没有最后 4 行代码。

我认为最后几行代码应该是这样的:

cmdEmail.CommandText = "SELECT * FROM VWTenantPropertiesResults WHERE ContentID = ?"
cmdEmail.CommandType = 1
cmdEmail.ActiveConnection = MM_dbconn_STRING
Set adoParam = cmdEmail.CreateParameter("@ContentID", 3, 1, , request.Form("ContentID"))
adoParam.Type = [the datatype of the parameter]
cmdEmail.Parameters.Append(adoParam)

请注意,.CreateParameter 方法将返回一个 Parameter 对象。您应该将此返回的对象分配给一个变量,然后将该变量用作Command 对象的Parameters 集合上的.Append 方法的参数。

查看这些链接了解更多信息:

CreateParameter Method (ADO)
Parameters Collection (ADO)
Append Method (ADO)

请注意标题为“备注参数集合”的部分,其中指出:

您必须设置一个类型的属性 附加前的参数对象 到参数集合。

Parameter 对象的.Type 属性从DataTypeEnum 枚举中取一个值来指定参数的数据类型。将我上面代码的[the datatype of the parameter]位替换为相关的数据类型枚举值。

更新 2:

抱歉,没有注意到问题标题文字发生了变化!

啊..老经典“调用 Sub 时不能使用括号”错误,嗯?

好吧,这里解释一下:

Cannot use parentheses when calling a Sub

简而言之:

你调用了一个没有 调用语句,但使用了括号 ()。调用子程序时没有 Call 语句,不要使用 括号。

要纠正这个错误:

  • 从子例程调用中删除括号。
  • 改为使用 Call 语句调用子例程。

还有一篇 Eric Lippert 的博客文章解决了这个常见错误:

What do you mean "cannot use parentheses?"

【讨论】:

  • 感谢 CraigTP。似乎是在创建 ADODB.Command 和 ADODB.Recordset 的实例,但最后 4 行代码有问题。
【解决方案3】:
set cmdEmail = Server.CreateObject("ADODB.Command")

尝试放置一些调试语句来检查它是否正在创建ADODB.Command 的实例。

例如

If (cmdEmail is Nothing) Then
   Response.Write("could not create the instance")
Else
   Response.Write("created the instance")
End If

另外,删除With 块,看看是否有什么不同

dim paramContentID

cmdEmail.CommandText = "SELECT * FROM VWTenantPropertiesResults WHERE ContentID = ?"
cmdEmail.CommandType = 1
cmdEmail.ActiveConnection = MM_dbconn_STRING

set paramContentID = cmdEmail.CreateParameter("@ContentID", 3, 1, , request.Form("ContentID"))
cmdEmail.Parameters.Append paramContentID

【讨论】:

  • @shahkalpesh 感谢您的评论。我使用了您建议的代码并创建了实例,但也返回了此错误; Microsoft VBScript 运行时错误 '800a01f9' 无效或不合格的参考 /welcome/default2.asp,第 441 行,这表明上面的最后一行代码有错误。 :S
  • @Neil, @shahkalpesh :这只是错字; Append 后有一个额外的空格
  • @mjv 谢谢。这似乎已经贯穿了代码,但导致“调用 Sub 时不能使用括号”
  • @Neil:对不起。我删除了 With 块,但没有使用 cmdEmail 限定 CreateParameter。代码现已更正。您收到错误的具体哪一行?错误信息是什么?
  • @shahkalpesh 嘿,我用你的版本更新了代码,现在它在第 437 行的关键字“DEFAULT”附近显示不正确的语法。:S 第 437 行是 rsEmail.Open cmdEmail
猜你喜欢
  • 2023-02-05
  • 2023-03-23
  • 2011-09-25
  • 1970-01-01
  • 2017-07-23
  • 1970-01-01
  • 2020-12-29
  • 1970-01-01
  • 2020-08-05
相关资源
最近更新 更多