经典的ASP存储过程返回状态

时间:2016-07-07 10:18:46

标签: sql-server stored-procedures asp-classic eof

我想根据点击网页上的按钮从数据库中删除某个项目。用户可以选择从其帐户中删除项目。

我将帐号和项目号传递给存储过程。存储过程删除项目(如果存在),并返回1表示成功,如果有错误则返回0。

我的问题是提交的ASP页面不断返回错误:

  

ADODB.Recordset错误' 800a0e78'关闭对象时不允许操作。

如果我直接提交存储过程,我可以删除该项目,并创建一个状态为1的记录。如果未删除,则记录状态为0.

因此,应始终创建一个状态为1或0的记录集。

这是存储过程:

CREATE PROCEDURE dbo.SAVED_ITEM_DELETE
   @AccountID int,
   @Item int
AS
BEGIN
   DECLARE @Status INT

   SET @Status = 1       

   IF EXISTS(SELECT AccountID FROM Accounts_Items 
             WHERE AccountID = @AccountID AND Item = @Item)
   BEGIN TRY                
       DELETE Account_Items 
       WHERE AccountID = @AccountID AND Item = @Item               
   END TRY
   BEGIN CATCH
       SET @status = 0
   END CATCH    

   SELECT @Status AS Status
END

这是调用程序的ASP

dim de
Set de = Server.CreateObject("ADODB.recordset")
de.open "SAVED_ITEM_DELETE 1,49", connect,2

IF not de.EOF THEN
    IF de("Status") = 1 THEN
        response.write request("delete") & " - deleted"
    ELSE
        response.write request("delete") & " - not deleted"
    END IF
END IF

我收到了错误:

IF NOT de.EOF THEN

拜托,请帮忙!我无法理解为什么ASP没有看到一个记录集,其中一个名为Status的字段是1或0。

1 个答案:

答案 0 :(得分:0)

如果您想使用已启动的版本,可以尝试使用nocount选项以确保select是发送到记录集的第一个结果。 您也可能使用Accounts_Items和Account_Items作为表名,这可能是一个错字。

CREATE PROCEDURE dbo.SAVED_ITEM_DELETE
   @AccountID int,
   @Item int
AS
BEGIN
   SET NOCOUNT ON
   DECLARE @Status INT

   SET @Status = 1       

   IF EXISTS(SELECT AccountID FROM Accounts_Items 
             WHERE AccountID = @AccountID AND Item = @Item)
   BEGIN TRY                
       DELETE Accounts_Items 
       WHERE AccountID = @AccountID AND Item = @Item               
   END TRY
   BEGIN CATCH
       SET @status = 0
   END CATCH    

   SET NOCOUNT OFF
   SELECT @Status AS Status
END