2013-05-13 216 views
14

「當對象關閉時不允許操作」這是我的存儲過程,當我從我的經典ASP代碼調用它,我得到的錯誤:當執行存儲過程

Operation is not allowed when the object is closed.

時我嘗試做一個記錄計數。

有人知道這裏有什麼問題嗎?我想返回表@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) 
+0

我指的是Microsoft SQL Server的。 – omega 2013-05-13 18:52:31

+1

由於錯誤顯然在調用代碼中 - 您需要向我們顯示代碼**調用**此存儲過程.... – 2013-05-13 18:53:07

+4

備註:您應該**不要**爲您的存儲使用'sp_'前綴程序。微軟已經保留了這個前綴以供自己使用(參見*命名存儲過程*)](http://msdn.microsoft.com/en-us/library/ms190669%28v=sql.105%29.aspx),以及你將來有可能冒着名字衝突的風險。 [這對你的存儲過程性能也是不利的](http://www.sqlperformance.com/2012/10/t-sql-queries/sp_prefix)。最好只是簡單地避免使用'sp_'並將其他內容用作前綴 - 或者根本沒有前綴! – 2013-05-13 18:53:23

回答

1

您需要先創建活動連接,並把它傳遞給Recordset對象,像這樣:

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

我以爲ADO的Recordset Open方法會隱式地打開一個連接,如果只傳遞了一個連接字符串。 – 2013-05-16 04:26:47

+0

@G。斯托涅涅夫,只是檢查了文件,似乎你是對的。 – johna 2013-05-16 07:38:57

46

試試這個在您的存儲過程:

SET NOCOUNT ON

SET ANSI_WARNINGS OFF

正下方的AS。

+0

設置nocount爲我們做了 – Slider345 2013-12-17 23:55:11

+0

這解決了一個問題,我從使用BarTender軟件打印標籤的過程中獲得結果集。 (我有同樣的錯誤) – Chris 2014-02-25 21:40:46

+0

太棒了!工作順利! – MarceloBarbosa 2014-12-09 19:32:57

1

警告可能會混淆結果。 SET ANSI_WARNINGS OFF避免丟失SELECT結果或輸出參數值。

1

如果出於某種原因存儲過程不返回結果集,空或否則,Recordset對象不會是公開的,所以:

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

我的測試結果不符合這個建議。 – Maritim 2016-08-26 10:25:38