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

Я имею в виду майкрософт сервер SQL. – omega

+1

Поскольку ошибка, очевидно, находится в вызывающем коде - вам нужно показать нам код **, вызывающий ** эту хранимую процедуру .... –

+4

Сторона примечания: вы не должны ** использовать префикс 'sp_' для вашего сохраненного процедуры. Microsoft [зарезервировала этот префикс для собственного использования (см. * Именование сохраненных процедур *)] (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_' и использовать что-то еще в качестве префикса - или никакого префикса вообще! –

ответ

1

Вам нужно создать активное соединение первого, и передать это объект набора записей, например:

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

Я думал, что метод Recordset Open ADO неявно откроет соединение, если будет передана только строка соединения. –

+0

@G. Стойнев, просто проверил документацию, и кажется, что ты прав. – johna

46

Попробуйте это в хранимой процедуре :

SET NOCOUNT ON

SET ANSI_WARNINGS OFF

Прямо под AS.

+0

set nocount on сделал это для нас – Slider345

+0

У меня была проблема с получением набора результатов из процедуры с использованием программного обеспечения BarTender для печати этикеток. (У меня была такая же ошибка) – Chris

+0

Отлично! Работала гладко! – MarceloBarbosa

1

Предупреждения могут путать результат. SET ANSI_WARNINGS OFF позволяет избежать потери значений результата SELECT или вывода.

1

Если по какой-либо причине хранимая процедура не возвращает результирующий набор, пустой или иначе, объект не будет записей открыта, так:

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

Результаты тестирования на моем конце не согласны с этим предложением. – Maritim

Смежные вопросы