【问题标题】:"Operation is not allowed when the object is closed" when executing stored procedure执行存储过程时“对象关闭时不允许操作”
【发布时间】:2013-05-13 18:48:57
【问题描述】:

这是我的存储过程,当我从我的经典 ASP 代码中调用它时,我收到了错误:

对象关闭时不允许操作。

当我尝试进行记录计数时。

有人知道这里出了什么问题吗?

我正在尝试返回表格@t

谢谢。

USE [Hires_new]
GO
/****** Object:  StoredProcedure [dbo].[sp_selectNewHireWorkPeriodsSQL]    Script Date: 05/13/2013 14:04:12 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
-- =============================================
-- Author:      
-- Create date: 
-- Description: 
-- =============================================
ALTER PROCEDURE [dbo].[sp_selectNewHireWorkPeriodsSQL] 
    -- Add the parameters for the stored procedure here

AS

    declare @t table (HireID int, StartDate datetime, EndDate datetime, date_initiated datetime, date_closed datetime, firmName nvarchar(100), InquiryID int)
    DECLARE @acc INT 
    SET @acc = 1
    DECLARE @max INT 
    select @max = max(HireID) from NewHire
    WHILE (@acc <= @max)
        BEGIN
            IF (@acc in (select HireID from NewHire))
                BEGIN
                    insert into @t  
                        select HireID, StartDate, EndDate, date_initiated, date_closed, firmName, Inquiries.InquiryID 
                        from WorkPeriod, Firms, Inquiries 
                        where HireID = @acc and WorkPeriod.FirmID = Firms.FirmID and WorkPeriod.InquiryID = Inquiries.InquiryID 
                        order by HireID,StartDate DESC
                END
            set @acc = @acc + 1
        END
    select * from @t

Asp经典代码

selectNewHireWorkPeriodsSQL = "EXEC sp_selectNewHireWorkPeriodsSQL"
Set rsNewHireWorkPeriods = Server.CreateObject("ADODB.Recordset")
rsNewHireWorkPeriods.Open selectNewHireWorkPeriodsSQL,ConnectionString,adOpenStatic
NumOfNewHireWorkPeriods = rsNewHireWorkPeriods.RecordCount

response.write(NumOfNewHireWorkPeriods)

【问题讨论】:

  • 我的意思是微软的 sql server。
  • 由于错误显然出在调用代码中 - 您需要向我们展示代码调用此存储过程 ....
  • 旁注:您应该为您的存储过程使用sp_ 前缀。微软有reserved that prefix for its own use (see Naming Stored Procedures),你确实会在未来某个时候冒着名称冲突的风险。 It's also bad for your stored procedure performance。最好只是简单地避免sp_ 并使用其他东西作为前缀 - 或者根本没有前缀!
  • 好的,我发布了。当我尝试进行记录计数时出现错误。
  • 作为另一个旁注,这段代码中似乎不需要循环:您可以通过在NewHire 上添加一个连接将整个事情编写为单个SELECT 语句。最好是write your joins explicitly

标签: sql-server asp-classic


【解决方案1】:

在你的存储过程中试试这个:

SET NOCOUNT ON
SET ANSI_WARNINGS OFF

就在AS下方。

【讨论】:

  • 不考虑为我们做的事
  • 这解决了我从使用 BarTender 软件打印标签的过程中获取结果集的问题。 (我有同样的错误)
  • 太棒了!工作顺利!
  • 如果您无法修改它,它也可以在存储过程之外工作。只需在查询中的 EXEC 调用之前添加它们。
  • SET NOCOUNT on 可防止 SQL 服务器在您的查询包含更新或插入时返回“x 记录受影响”输出。我不记得确切的原因,但是当查询有文本输出时,ADO 会感到困惑。 (我认为它会将其误解为错误消息并中止。)
【解决方案2】:

如果由于某种原因存储过程没有返回结果集,无论是空的还是其他,记录集对象都不会打开,所以:

if rs.state = adStateOpen then x = rs.recordcount

【讨论】:

  • 我这边的测试结果不同意这个建议。
【解决方案3】:

您需要先创建一个活动连接,并将其传递给记录集对象,如下所示:

Set conn = Server.CreateObject("ADODB.Connection")
conn.Open(ConnectionString)

selectNewHireWorkPeriodsSQL = "EXEC sp_selectNewHireWorkPeriodsSQL"
Set rsNewHireWorkPeriods = Server.CreateObject("ADODB.Recordset")
rsNewHireWorkPeriods.Open selectNewHireWorkPeriodsSQL,conn,adOpenStatic 'dont use connection string here
NumOfNewHireWorkPeriods = rsNewHireWorkPeriods.RecordCount

conn.Close
Set conn = Nothing

response.write(NumOfNewHireWorkPeriods)

【讨论】:

  • 我认为 ADO 的 Recordset Open 方法会隐式打开一个连接,如果只传递一个连接字符串。
  • @G。 Stoynev,刚刚检查了文档,看来您是对的。
【解决方案4】:

警告可能会混淆结果。 SET ANSI_WARNINGS OFF 避免丢失 SELECT 结果或输出参数值。

【讨论】:

    【解决方案5】:

    我相信这不会影响很多人,但我只是偶然发现了这个问题。这是在生产环境中工作,而不是在开发环境中。我发现我们的存储过程在开发环境中有一个打印语句。我猜打印语句搞砸了工作,ADODB 认为那是记录集。

    【讨论】:

      【解决方案6】:

      我知道这已经很老了。但就我而言,这是参数的顺序。它在我设置参数后工作,因为它们出现在存储过程中。我知道这没有合乎逻辑的解释,因为参数是命名的,顺序并不重要。

      【讨论】:

        【解决方案7】:

        这可能是由存储过程中的打印语句引起的。在进行了一些性能调试后,我不小心留下了一些……希望这可以帮助仍在使用旧 ADO 的人。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2016-12-06
          • 2021-10-24
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2016-02-29
          相关资源
          最近更新 更多