web-dev-qa-db-ja.com

ストアドプロシージャの実行時に「オブジェクトが閉じられているときは操作が許可されていません」

これは私のストアドプロシージャであり、従来の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)
22
omega

ストアドプロシージャでこれを試してください。

SET NOCOUNT ON
SET ANSI_WARNINGS OFF

ASのすぐ下。

57
Ramon

最初にアクティブな接続を作成し、これを次のようにレコードセットオブジェクトに渡す必要があります。

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

何らかの理由でストアドプロシージャが結果セットを返さない場合、空またはその他の場合、レコードセットオブジェクトは開かれません。

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

警告は結果を混乱させる可能性があります。 SET ANSI_WARNINGS OFFは、SELECT結果または出力パラメーター値の損失を防ぎます。

1
Sergio Abreu

これは非常に古いことを知っています。しかし、私の場合、パラメータの順序。ストアドプロシージャに表示されるパラメーターを設定した後、機能しました。パラメーターに名前が付けられ、順序は実際には重要ではないので、これには論理的な説明がないことを知っています。

0
banavalikar

これは多くの人々に影響を与えないと確信していますが、私はこの問題につまずいただけです。これは、開発環境ではなく運用環境で機能していました。私が見つけたのは、開発環境でストアドプロシージャにprintステートメントが含まれていることです。印刷文が作品を台無しにしていると推測し、ADODBはそれがレコードセットだと考えました。

0
fizch