2013-05-13 218 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