Ошибка ADODB.Recordset '800a0e78' Операция не разрешена, когда объект закрыт. классический АСП

Я знаю, что это, вероятно, обман другого вопроса, но я действительно понятия не имею, я все искал и пробовал все, но, похоже, он все еще дает мне ту же ошибку;

Ошибка ADODB.Recordset "800a0e78"

Операция не разрешена, когда объект закрыт.

Если бы кто-то мог помочь мне с этим, я был бы очень признателен, я использую классический ASP, SQL и HTML;

Мой классический код ASP:

If(Request.Form("submitBtn"))<>""Then
  'Initialise the db connection
  Set objDBConn = Server.CreateObject("ADODB.Connection")
  objDBConn.Open "Provider=sqloledb;Data Source=OLIVERBEELEY;Initial Catalog=HolidayEmployeeBooker;User ID=HBA;Password=HBA;"

  'Initialise the command object
  Set objDBCommand = Server.CreateObject("ADODB.Command")

  objDBCommand.ActiveConnection = objDBConn
  objDBCommand.CommandText = "spNewHoliday"
  objDBCommand.CommandType = adCmdStoredProc

  'Set the parameters             
  objDBCommand.Parameters.Append objDBCommand.CreateParameter("@StartDate", adDate, adParamInput,200)
  objDBCommand.Parameters.Append objDBCommand.CreateParameter("@EndDate", adDate, adParamInput,200)
  objDBCommand.Parameters.Append objDBCommand.CreateParameter("@EmployeeID", adVarChar, adParamInput,200)            
  objDBCommand.Parameters.Append objDBCommand.CreateParameter("@Reason", adVarChar, adParamInput,200)

  objDBCommand("@StartDate") = Request.Form("from")
  objDBCommand("@EndDate") = Request.Form("to")
  objDBCommand("@EmployeeID") = Session("UserID")
  objDBCommand("@Reason") = Request.Form("comments")

  'Initialise the Recordset
  Set objDBRS = Server.CreateObject("ADODB.RecordSet")

  'Execute 
  objDBRS.open objDBCommand,,adOpenForwardOnly

  if not objDBRS.EOF then
    Session("BookingValid") = objDBRS(0)
  end if

  if Session("BookingValid") = "ErrorBookingHoliday" then
     response.Write("<SCRIPT LANGUAGE=""JavaScript"">alert(""Holiday CANNOT be booked."");</SCRIPT>")
  end if
  if Session("BookingValid") = "ErrorBookingHoliday" then
     response.Write("<SCRIPT LANGUAGE=""JavaScript"">alert(""Holiday has been requested."");</SCRIPT>")
  end if

  'Close and Destroy Objects - Start*******************************************************
  Set objDBCommand=nothing
  objDBConn.Close
  Set objDBConn=nothing
  'Close and Destroy Objects - End*********************************************************

  response.redirect("newbooking.asp")

end if 


%>

Моя хранимая процедура, вызывающая ее;

PROCEDURE [dbo].[spNewHoliday]
(
@StartDate DATE,
@EndDate DATE,
@EmployeeID INT,
@Reason NVARCHAR (45)
)


AS
SET NOCOUNT ON
BEGIN



IF NOT EXISTS ( SELECT 1 
                FROM Holidays
                WHERE @StartDate = StartDate
                AND @EndDate = EndDate
                AND @EmployeeID = EmployeeID)

                BEGIN
                DECLARE @Validation INT
                    EXEC spBusinessRuleValidation @StartDate, @EndDate, @EmployeeID, @Validation OUTPUT


                    IF @Validation = 0
                        BEGIN
                            DECLARE @DaysOff AS INT
                            SELECT @DaysOff = (DATEDIFF(Day,@StartDate,@EndDate) +1)

                            UPDATE Employees
                            SET AnnualDaysHolidayAllowance = AnnualDaysHolidayAllowance - @DaysOff
                            WHERE @EmployeeID = Employees.ID                

                            INSERT INTO Holidays(EmployeeID, StartDate, EndDate, Duration, Status, Reason)
                            VALUES(@EmployeeID, @StartDate, @EndDate, @DaysOff,'Pending', @Reason)

                            SELECT Employees.AnnualDaysHolidayAllowance AS Daysleft FROM Employees WHERE @EmployeeID = Employees.ID
                        END
                        SET NOCOUNT ON
                    IF @Validation = 1
                        BEGIN
                            SELECT 'ErrorBookingHoliday' AS FailedBooking
                        END
                END

END

И хранимая процедура, которую вызывает эта процедура;

PROCEDURE [dbo].[spBusinessRuleValidation]
(
@StartDate DATE,
@EndDate DATE,
@EmployeeID INT,
@Validation INT output
)

AS
SET NOCOUNT ON
    BEGIN
        DECLARE @JobRoleID INT
        DECLARE @MaxJobTypeAllowedOff INT       
        DECLARE @MaxEmployeesAllowedOff INT
        DECLARE @DateCount INT
        DECLARE @SameJobRoleOff INT
        DECLARE @DateCheck DATE

        SET @JobRoleID = (SELECT JobRoleID FROM Employees WHERE @EmployeeID = Employees.ID)
        SET @MaxJobTypeAllowedOff = (SELECT MaxEmployeesAllowedOff FROM JobRole WHERE @JobRoleID = JobRole.ID)
        SET @MaxEmployeesAllowedOff = 20
        SET @DateCheck = @StartDate
        SET @EndDate = DATEADD(DAY, 1, @EndDate)
        SET @Validation = '0'

        WHILE (@DateCheck <> @EndDate)
        BEGIN
            SET @DateCount = (SELECT COUNT (*) FROM Holidays WHERE Holidays.Startdate >= @DateCheck AND Holidays.EndDate <= @EndDate )
            IF @DateCount > @MaxEmployeesAllowedOff
                BEGIN
                    SET @Validation = '1'
                    BREAK
                END

            SET @SameJobRoleOff = (SELECT COUNT (*) JobRoleID
            FROM Employees
            RIGHT JOIN Holidays
            ON Employees.ID = Holidays.EmployeeID
            WHERE Employees.ID = @EmployeeID AND Holidays.Startdate >= @DateCheck AND Holidays.EndDate <= @EndDate AND Holidays.Status <> 'Declined')

            IF @SameJobRoleOff > @MaxJobTypeAllowedOff
                BEGIN
                    SET @Validation = '1'
                    BREAK
                END

            SET @DateCheck = DATEADD(DAY, 1, @DateCheck)
        END
    END

Я очень новичок в SQL и ASP (около 3-4 месяцев опыта), и мне нужна помощь с этой проблемой, любая помощь будет оценена, даже если это просто связано с кодом, который не является причиной моей ошибки! Спасибо! О, это код, в котором что-то идет не так!

if not objDBRS.EOF then
  Session("BookingValid") = objDBRS(0)
end if

person Jimmy_Chong    schedule 11.03.2014    source источник
comment
процедуры вызываются, потому что данные, которые я ввожу, добавляются в базу данных, что означает, что вызовы не завершаются ошибкой, так что это так, и, поскольку ASP показывает, что соединение открыто, и какой другой код вам нужно увидеть, весь мой другой код ASP вызов других функций, которые не создают ошибок? @ТомТом   -  person Jimmy_Chong    schedule 11.03.2014
comment
Ах, нет. Поскольку ошибка не связана с каким-либо SQL, она не имеет значения.   -  person TomTom    schedule 11.03.2014
comment
код в Visual Studio не закомментирован, это то, как он был помещен в stackoverflow и как работает их система комментариев, я не настолько глуп, чтобы комментировать код, который открывает и закрывает соединения с БД, а также это должно быть SQL, потому что это то, что ломает код, я полагаю, что это связано с тем, что процедуры SQL неправильно возвращают переменную проверки, но я, скорее всего, ошибаюсь @TomTom   -  person Jimmy_Chong    schedule 11.03.2014
comment
Проверьте, как выглядит набор записей, когда вы получите его обратно. И я думаю, вы не получите здесь массу помощи - вы в основном используете технологии музейного уровня. Чувак, прошло 15 лет с тех пор, как я в последний раз видел набор записей adodb.   -  person TomTom    schedule 11.03.2014
comment
Да, в этом проблема, он не попадает в набор записей, потому что он говорит, что он не открыт? вот почему я в первую очередь прошу о помощи... а не о том, использую ли я код, который люди не видели годами @TomTom   -  person Jimmy_Chong    schedule 11.03.2014
comment
spNewHoliday возвращает какую-либо запись, когда вы выполняете ее через SQL Server Management Studio?   -  person kloarubeek    schedule 11.03.2014
comment
Его трудно запустить в SQL из-за необходимых данных, я просто успешно завершаю команды, когда я запускаю его через свой сайт, я могу добавить праздник в базу данных, просто когда я пытаюсь добавить праздник, который нарушает правила, я получаю сообщение об ошибке, так что я действительно в тупике. @kloarubeek   -  person Jimmy_Chong    schedule 11.03.2014
comment
Вы определенно хотите знать, что возвращает этот SP, потому что, если он ничего не возвращает, ваш набор записей закрыт = ваше сообщение об ошибке! Почему это так сложно? Это зависит от 4-х параметров! Запустите SQL Profiler во время выполнения вашего кода, тогда легко получить правильные параметры. Альтернатива: проверьте objDBRS.State перед проверкой .EOF, значение, вероятно, равно 0 (adStateClosed). Я не проверял вашу хранимую процедуру полностью, но я думаю, что у нее есть некоторые пути возврата, которые ничего не возвращают.   -  person kloarubeek    schedule 11.03.2014
comment
Из того, что я вижу в вашей хранимой процедуре [dbo].[spNewHoliday], есть как минимум 1 возможная точка, в которой вы можете получить набор записей без возврата, что может быть вашей проблемой.   -  person user692942    schedule 11.03.2014
comment
В какую точку вы смотрите? @Lankymart   -  person Jimmy_Chong    schedule 11.03.2014
comment
@Jimmy_Chong В вашем IF NOT EXISTS ( SELECT 1 FROM Holidays WHERE @StartDate = StartDate AND @EndDate = EndDate AND @EmployeeID = EmployeeID), если он существует, набор записей не вернется.   -  person user692942    schedule 11.03.2014
comment
@kloarubeek Когда я передаю правильные 4 параметра и выполняю их внутри SQL, я успешно выполняю запрос, но никакие другие данные не возвращаются мне.   -  person Jimmy_Chong    schedule 11.03.2014
comment
@Lankymart Я люблю тебя, сообщение об ошибке больше не отображается, но мои пользовательские сообщения об ошибках не возвращаются в моем html, так что похоже, у меня есть новая задача для работы :)   -  person Jimmy_Chong    schedule 11.03.2014
comment
в порядке. Если записи не возвращаются, вы не можете проверить .EOF. Итак, сначала проверьте, возвращается ли что-нибудь с помощью if objDBRS.State = adStateOpen Затем...   -  person kloarubeek    schedule 11.03.2014


Ответы (1)


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

      SELECT @some_symbol some_column_name;

Если я опускаю SET NOCOUNT ON из этих хранимых процедур, то мой классический набор записей ASP adodb возвращается неправильно, и я получаю сообщение об ошибке «объект закрыт».

Если я включу SET NOCOUNT ON в эти хранимые процедуры, все будет работать правильно.

То же самое верно, если я запускаю обычный блок SQL, а не хранимую процедуру, которая работает так же.

Что касается классического ASP, я определенно придерживаюсь принципа «зачем спрашивать, почему?» лагерь. Мне просто нужно закончить работу по техническому обслуживанию.

person O. Jones    schedule 19.04.2016