Я знаю, что это, вероятно, обман другого вопроса, но я действительно понятия не имею, я все искал и пробовал все, но, похоже, он все еще дает мне ту же ошибку;
Ошибка 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
[dbo].[spNewHoliday]
, есть как минимум 1 возможная точка, в которой вы можете получить набор записей без возврата, что может быть вашей проблемой. - person user692942   schedule 11.03.2014IF NOT EXISTS ( SELECT 1 FROM Holidays WHERE @StartDate = StartDate AND @EndDate = EndDate AND @EmployeeID = EmployeeID)
, если он существует, набор записей не вернется. - person user692942   schedule 11.03.2014