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)
Versuchen Sie dies in Ihrer gespeicherten Prozedur:
SET NOCOUNT ON
SET ANSI_WARNINGS OFF
Rechts unterhalb der AS
.
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)
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
Warnungen können das Ergebnis verwechseln. SET ANSI_WARNINGS OFF
verhindert, dass das SELECT-Ergebnis oder die Ausgangsparameterwerte verloren gehen.
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.
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.