2016-07-07 1 views
0

Je souhaite supprimer un élément d'une base de données en fonction d'un bouton qui est cliqué sur une page Web. Un utilisateur peut choisir de supprimer des éléments de son compte. Je passe le numéro de compte et le numéro d'article à une procédure stockée.État de retour de la procédure stockée ASP classique

La procédure stockée supprime l'élément s'il existe et renvoie 1 pour la réussite ou 0 s'il y a eu une erreur.

Mon problème est que la page ASP lorsqu'il est soumis en permanence retourne une erreur:

ADODB.Recordset error '800a0e78' Operation is not allowed when the object is closed.

Si je soumets la procédure stockée directement, je peux supprimer l'élément et un enregistrement est créé où le statut est 1. Si elle n'est pas supprimé, record a le statut 0.

par conséquent, il devrait toujours être un jeu d'enregistrements qui a créé le statut 1 ou 0.

Voici la procédure stockée:

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 

Et voici l'ASP qui appelle la procédure

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 

Je reçois l'erreur sur la ligne:

IF NOT de.EOF THEN 

S'il vous plaît, s'il vous plaît, s'il vous plaît aider! Je ne peux pas comprendre pourquoi ASP ne voit pas un jeu d'enregistrements avec un champ appelé Status qui est 1 ou 0.

+0

Pourquoi avez-vous besoin d'un recordset de toute façon? utiliser un paramètre de sortie à la place ... –

+0

Je n'en ai jamais entendu parler auparavant. Peux-tu expliquer? Merci d'avoir répondu. – TVRV8S

+0

Le sql est très simple - il suffit de changer le '@ status' d'une variable en un paramètre et d'ajouter le mot-clé' output', mais je ne me souviens vraiment pas comment le retrouver dans 'adoddbo.Command'. Cela fait plus de dix ans que j'ai utilisé asp3 pour la dernière fois. –

Répondre

0

Si vous souhaitez aller avec la version que vous avez démarrée, vous pouvez essayer d'utiliser l'option nocount pour assurer la sélection est le premier résultat envoyé à votre jeu d'enregistrements. De plus, il y a probablement une faute de frappe lorsque vous utilisez Accounts_Items et Account_Items comme nom de table.

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