2013-05-13 3 views
14

Das ist meine gespeicherte Prozedur, und als ich es von meinem klassischen ASP-Code nannte, erhalte ich die Fehlermeldung:„Operation ist nicht erlaubt, wenn das Objekt geschlossen ist“, wenn die gespeicherte Prozedur Ausführen

Operation is not allowed when the object is closed.

wenn Ich versuche eine Aufzeichnung zu machen.

Weiß jemand, was hier falsch ist?

Ich versuche, die Tabelle @t zurückzugeben.

Danke.

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 classic Code

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

response.write(NumOfNewHireWorkPeriods) 
+0

Ich meine den Microsoft SQL Server. – omega

+1

Da der Fehler offensichtlich in der aufrufenden Code ist - müssen Sie uns den Code anzeigen ** Aufruf ** dieser gespeicherten Prozedur .... –

+4

Randnotiz: Sie sollten ** nicht ** verwenden Sie die 'sp_' Präfix für Ihre gespeicherten Verfahren. Microsoft hat [dieses Präfix für seine eigene Verwendung reserviert (siehe * Gespeicherte Prozeduren benennen *)] (http://msdn.microsoft.com/en-us/library/ms190669%28v=sql.105%29.aspx), und Sie riskieren irgendwann in der Zukunft einen Namenskonflikt. [Es ist auch schlecht für die Leistung Ihrer gespeicherten Prozedur] (http://www.sqlperformance.com/2012/10/t-sql-queries/sp_prefix). Es ist am besten, einfach 'sp_' zu vermeiden und etwas anderes als Präfix zu verwenden - oder gar kein Präfix! –

Antwort

1

Sie müssen zuerst eine aktive Verbindung erstellen, und diese Aufgabe an das Recordset übergeben, wie folgt aus:

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) 
+0

Ich dachte, ADO Recordset Open-Methode würde implizit eine Verbindung öffnen, wenn nur eine Verbindungszeichenfolge übergeben wurde. –

+0

@G. Stoynev, hat gerade die Dokumentation überprüft und es scheint, dass Sie Recht haben. – johna

46

Versuchen Sie dies in Ihrer gespeicherten Prozedur :

SET NOCOUNT EIN

SET ANSI_WARNINGS AUS

Direkt unter dem AS.

+0

set nocount on tat es für uns – Slider345

+0

Dies behob ein Problem Ich hatte ein Ergebnis von einem Verfahren mit BarTender-Software zum Drucken von Etiketten bekommen. (Ich hatte den gleichen Fehler) – Chris

+0

Großartig! Arbeitete reibungslos! – MarceloBarbosa

1

Warnungen können das Ergebnis verwirren. SET ANSI_WARNINGS OFF verhindert den Verlust des SELECT-Ergebnisses oder der Ausgangsparameterwerte.

1

Wenn aus irgendeinem Grund die gespeicherte Prozedur keine Ergebnismenge, leer oder auf andere Weise zurückkehrt, wird das Objekt Recordset nicht geöffnet sein, so:

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

Die Ergebnisse der Tests an meinem Ende widersprechen diesem Vorschlag. – Maritim