这是经典ASP中的ADO。
我有一个带有类型为int的参数@IsNew的存储过程。
我可以通过SQL调用它:
EXEC [dbo].[SearchVehicles]
@WebsiteName = N'AMSVans',
@SortOrder = N'Year DESC,Status ASC',
@Statuses = N'Unsold',
@IsNew = 1
返回集完全符合预期。
但是,当我尝试在我的网页中使用它时:
cmd.CommandText = "AMSVans.dbo.SearchVehicles"
cmd.CommandType = adCmdStoredProc
cmd.Parameters.Append cmd.CreateParameter("@WebsiteName", adVarChar, , 75, "AMSVans")
cmd.Parameters.Append cmd.CreateParameter("@SortOrder", adVarChar, , 500, "Year DESC,Status ASC," + SortMethod)
cmd.Parameters.Append cmd.CreateParameter("@Statuses", adVarChar, , 500, Statuses)
cmd.Parameters.Append cmd.CreateParameter("@IsNew", adInteger, , 4,1)
cmd.Parameters.Append cmd.CreateParameter("@Categories", adVarChar, , 500, "AMS Vans")
Set r = cmd.Execute
我什么都没回来。纳达。齐尔希。
我甚至不确定从哪里开始调试这个: - /
更新RE“设置nocount on”:
有趣的是,如果我将其关闭(即注释掉该行),我会收到此错误:
ADODB.Recordset error '800a0e78'
Operation is not allowed when the object is closed.
/pages/inventory/main.asp, line 109
有问题的行(r是记录集):
if not (r.EOF and r.EOF) then invFound = true
答案 0 :(得分:1)
如果您的存储过程可以生成多个结果集(包括不打算返回的中间结果),请尝试在proc开头设置nocount。多个结果可能会导致ado记录集出现问题。
e.g。
Set NoCount On
此外,如果这不起作用,并且您最近更改了proc,请尝试从具有不同参数的页面运行它,以便您不会获得缓存结果。
修改强>
我注意到你正在为int参数指定一个长度,这只是变量长度类型所必需的,并且通常默认为0,尝试省略它。
答案 1 :(得分:0)
我现在意识到,如果我认为程序有大约20个参数,并且因为@IsNew是最后一个,而其他人是第一个 - 那么,这对每个人来说都是显而易见的,好吧,我只想说为两者之间添加默认值参数会产生重大影响。