关闭对象时不允许ASP存储过程操作

时间:2013-08-08 13:14:39

标签: sql sql-server stored-procedures asp-classic

我在从SQL数据库通过ASP访问存储过程时遇到问题。 这是我的记录集代码:

Dim com_AntwoordenPerVraag__mem_id
com_AntwoordenPerVraag__mem_id = "0"
If Session("MM_MemberID") <> "" Then
    com_AntwoordenPerVraag__mem_id = Session("MM_MemberID")
End If

Dim com_AntwoordenPerVraag__cat_id
com_AntwoordenPerVraag__cat_id = "0"
If Request.QueryString("cat_id") <> "" Then
    com_AntwoordenPerVraag__cat_id = Request.QueryString("cat_id")
End If

set com_AntwoordenPerVraag = Server.CreateObject("ADODB.Command")
com_AntwoordenPerVraag.ActiveConnection = MM_modular_STRING
com_AntwoordenPerVraag.CommandText = "dbo.spAantal_antwoorden_per_vraag_per_member"
com_AntwoordenPerVraag.Parameters.Append com_AntwoordenPerVraag.CreateParameter("@RETURN_VALUE", 3, 4)
com_AntwoordenPerVraag.Parameters.Append com_AntwoordenPerVraag.CreateParameter("@mem_id", 3, 1,2,com_AntwoordenPerVraag__mem_id)
com_AntwoordenPerVraag.Parameters.Append com_AntwoordenPerVraag.CreateParameter("@cat_id", 3, 1,2,com_AntwoordenPerVraag__cat_id)
com_AntwoordenPerVraag.CommandType = 4
com_AntwoordenPerVraag.CommandTimeout = 0
com_AntwoordenPerVraag.Prepared = true
set rs_AntwoordenPerVraag = com_AntwoordenPerVraag.Execute

rs_AntwoordenPerVraag_numRows = 0

我收到以下错误消息:

ADODB.Recordset error '800a0e78'

Operation is not allowed when the object is closed.

我在这里收到消息:

If rs_AntwoordenPerVraag.EOF And rs_AntwoordenPerVraag.BOF Then

修改

我找到了解决方案。

后:

set rs_AntwoordenPerVraag = com_AntwoordenPerVraag.Execute

我说:

If rs_AntwoordenPerVraag.State <> 1 Then
While rs_AntwoordenPerVraag.State <> 1
Set rs_AntwoordenPerVraag = rs_AntwoordenPerVraag.NextRecordset
Wend
End If

现在它起作用了: - )

3 个答案:

答案 0 :(得分:1)

您的命令需要一个connection对象,需要打开它,而不仅仅是一个连接字符串。

请参阅http://support.microsoft.com/kb/300382

此外,如果您导入ADODB常量文件并使用它们(即:http://www.4guysfromrolla.com/webtech/faq/Beginner/faq7.shtml

,您的代码将更清晰

答案 1 :(得分:1)

调用存储过程的问题是SQL-Server在最终结果集之前的已关闭记录集中返回的每个查询所触及的行数。您可以查找已经找到的下一个记录集,也可以在SP的开头添加以下指令,以消除为每个查询发送的行数。

SET NOCOUNT ON

我更喜欢这个最后的解决方案,因为它使VBScript代码更简单,但它只是一个品味问题。

答案 2 :(得分:0)

OP本身找到了解决方案,它的确有效!真的很感谢他。

后:

set rs_AntwoordenPerVraag = com_AntwoordenPerVraag.Execute

放:

If rs_AntwoordenPerVraag.State <> 1 Then
While rs_AntwoordenPerVraag.State <> 1
Set rs_AntwoordenPerVraag = rs_AntwoordenPerVraag.NextRecordset
Wend
End If