it-swarm.com.de

"Operation ist nicht zulässig, wenn das Objekt geschlossen ist", wenn gespeicherte Prozedur ausgeführt wird

Dies ist meine gespeicherte Prozedur. Wenn ich sie von meinem klassischen ASP - Code aus anrufe, erhalte ich die Fehlermeldung: 

Der Vorgang ist nicht zulässig, wenn das Objekt geschlossen ist.

wenn ich versuche, einen Datensatz zu zählen.

Weiß jemand was hier los ist?

Ich versuche die Tabelle @t zurückzugeben.

Vielen Dank.

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

Ein klassischer Code

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

response.write(NumOfNewHireWorkPeriods)
22
omega

Versuchen Sie dies in Ihrer gespeicherten Prozedur:

SET NOCOUNT ON
SET ANSI_WARNINGS OFF

Rechts unterhalb der AS.

56
Ramon

Sie müssen zuerst eine aktive Verbindung erstellen und diese wie folgt an das Recordset-Objekt übergeben:

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)
1
johna

Wenn aus irgendeinem Grund die gespeicherte Prozedur keine leere oder eine andere Ergebnismenge zurückgibt, ist das Recordset-Objekt nicht geöffnet.

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

Warnungen können das Ergebnis verwechseln. SET ANSI_WARNINGS OFF verhindert, dass das SELECT-Ergebnis oder die Ausgangsparameterwerte verloren gehen.

1
Sergio Abreu

Ich weiß, dass das sehr alt ist. Aber in meinem Fall es war die Reihenfolge der Parameter. Es hat funktioniert, nachdem ich die Parameter so festgelegt habe, wie sie in der gespeicherten Prozedur angezeigt werden. Ich weiß, dass es keine logische Erklärung dafür gibt, da Parameter benannt sind und die Reihenfolge eigentlich keine Rolle spielen sollte.

0
banavalikar

Ich bin sicher, dass dies nicht viele Menschen betreffen wird, aber ich bin gerade über dieses Thema gestolpert. Dies funktionierte in der Produktion und nicht in der Entwicklungsumgebung. Ich fand heraus, dass unsere gespeicherte Prozedur in der Entwicklungsumgebung eine Druckanweisung hatte. Ich vermute, die Print-Anweisung brachte die Arbeiten auf den Kopf und ADODB dachte, das sei der Rekord.

0
fizch