我有一个经典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的一些错误还是我需要更改我尝试参数化查询的方式?
谢谢。
答案 0 :(得分:2)
您是否错过了那里的“Set”声明?
即:
<%
Set cmdEmail = Server.CreateObject("ADODB.Command")
Set rsEmail = Server.CreateObject("ADODB.Recordset")
<强>更新强>
回应尼尔的评论:
谢谢CraigTP。好像是 创建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
个对象。您应该将此返回的对象分配给一个变量,然后将该变量用作.Append
对象的Command
集合上Parameters
方法的参数。
有关详细信息,请参阅以下链接:
CreateParameter Method (ADO)
Parameters Collection (ADO)
Append Method (ADO)
请注意标题为“备注参数集合”的部分:
您必须设置a的Type属性 附加之前的参数对象 到参数集合。
.Type
对象的Parameter
属性从DataTypeEnum枚举中获取值,以指定参数的数据类型。将上面代码的[the datatype of the parameter]
位替换为相关的数据类型枚举值。
更新2:
抱歉,没有注意到标题文字的问题已经改变了!
啊..旧经典“在调用Sub时不能使用括号”错误,是吗?
嗯,这里解释一下:
Cannot use parentheses when calling a Sub
简而言之:
你没有调用子程序 调用语句,但使用括号 ()。在没有调用子程序时 Call语句,不要使用 括号中。
要更正此错误:
- 从子程序调用中删除括号。
- 使用Call语句来调用子例程。
还有来自Eric Lippert的博客文章解决了这个常见错误:
答案 1 :(得分:2)
您是否尝试过删除这些括号?
cmdEmail.CreateParameter "@ContentID", 3, 1, , Request.Form("ContentID")
据我记忆,当你调用一个函数并且不使用它的返回值时,总会发生这种情况。
更新:似乎真正的问题是换行符:
cmdEmail.Parameters.Append _ '' note this "_" character
cmdEmail.CreateParameter("@ContentID", 3, 1, , Request.Form("ContentID"))
答案 2 :(得分:0)
set cmdEmail = Server.CreateObject("ADODB.Command")
如果正在创建ADODB.Command
的实例,请尝试并输入一些调试语句。
e.g。
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