"Операция не допускается, когда объект закрыт" при выполнении хранимой процедуры - программирование
Подтвердить что ты не робот

"Операция не допускается, когда объект закрыт" при выполнении хранимой процедуры

Это моя хранимая процедура, и когда я вызываю ее из моего классического 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)
4b9b3361

Ответ 1

Попробуйте это в своей хранимой процедуре:

SET NOCOUNT ON
SET ANSI_WARNINGS OFF

Прямо под AS.

Ответ 2

Сначала необходимо создать активное соединение и передать это объекту набора записей, например:

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)

Ответ 3

Предупреждения могут запутать результат. SET ANSI_WARNINGS OFF предотвращает потерю результата SELECT или значений выходных параметров.

Ответ 4

Если по какой-либо причине хранимая процедура не возвращает набор результатов, пустой или другой, объект набора записей не будет открыт, поэтому:

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

Ответ 5

Я уверен, что это не затронет многих людей, но я просто наткнулся на эту проблему. Это работало на производстве, а не в среде разработки. Я обнаружил, что наша хранимая процедура имеет оператор печати в среде разработки. Я предполагаю, что выражение о печати испортило работы, и ADODB решил, что это был рекорд.

Ответ 6

Я знаю, что это очень старый. Но в моем случае это был порядок параметров. Это сработало после того, как я установил параметры так, как они отображаются в хранимой процедуре. Я знаю, что этому нет логического объяснения, поскольку параметры именуются, и порядок не должен иметь значения.