web-dev-qa-db-fra.com

"L'opération n'est pas autorisée lorsque l'objet est fermé" lors de l'exécution d'une procédure stockée

Il s'agit de ma procédure stockée et lorsque je l'appelle à partir de mon code ASP classique, j'obtiens l'erreur 

L'opération n'est pas autorisée lorsque l'objet est fermé.

quand j'essaie de faire un compte record.

Est-ce que quelqu'un sait ce qui ne va pas ici?

J'essaie de renvoyer la table @t.

Merci.

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 classique code

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

response.write(NumOfNewHireWorkPeriods)
22
omega

Essayez ceci dans votre procédure stockée:

SET NOCOUNT ON
SET ANSI_WARNINGS OFF

Juste en dessous de la AS.

56
Ramon

Vous devez d'abord créer une connexion active et la transmettre à l'objet recordset, comme ceci:

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

Si, pour une raison quelconque, la procédure stockée ne renvoie pas de résultat, vide ou non, l'objet de jeu d'enregistrements ne sera pas ouvert.

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

Les avertissements peuvent confondre le résultat. SET ANSI_WARNINGS OFF évite de perdre le résultat de SELECT ou les valeurs des paramètres de sortie.

1
Sergio Abreu

Je suis sûr que cela ne touchera pas beaucoup de gens, mais je suis tombé par hasard sur cette question. Cela fonctionnait dans la production et non dans l'environnement de développement. Ce que j'ai trouvé, c'est que notre procédure stockée avait une instruction print dans l'environnement de développement. J'imagine que la déclaration imprimée déblayait les travaux et ADODB pensait que c'était le record établi.

0
fizch