29

这是我的存储过程,当我从我的经典 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)
4

7 回答 7

72

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

SET NOCOUNT ON
SET ANSI_WARNINGS OFF

就在AS.

于 2013-05-17T20:47:11.140 回答
2

如果由于某种原因存储过程没有返回结果集、空的或其他的,则记录集对象将不会打开,因此:

if rs.state = adStateOpen then x = rs.recordcount
于 2015-12-08T16:56:54.460 回答
1

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

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)
于 2013-05-16T03:03:30.737 回答
1

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

于 2015-10-23T13:16:40.670 回答
0

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

于 2020-02-18T19:06:31.877 回答
0

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

于 2018-11-23T22:51:46.790 回答
0

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

于 2019-09-04T14:41:01.077 回答