Asp sqlserver exécute la procédure stockée pour renvoyer la solution temporaire indiquant que l'opération n'est pas autorisée lorsque l'objet du jeu d'enregistrements est fermé. Si vous avez une meilleure méthode, dites-le-moi.
Si vous souhaitez obtenir la valeur de retour, vous devez utiliser la méthode Command.
Tout d’abord, il existe deux types de valeurs de retour. L'une consiste à renvoyer directement une valeur dans la procédure stockée, tout comme la valeur de retour de la fonction C et VB ; l'autre consiste à renvoyer plusieurs valeurs, et les noms de variables pour stocker ces valeurs doivent d'abord être spécifiés dans les paramètres d'appel. .
Cet exemple doit gérer plusieurs paramètres, des paramètres d'entrée, des paramètres de sortie, des jeux d'enregistrements de retour et une valeur de retour directe (est-il suffisamment complet ?)
La procédure stockée est la suivante :
Copiez le code comme suit :
utiliser les pubs
ALLER
-- Créer une procédure stockée
créer une procédure sp_PubsTest
--Définissez trois variables de paramètres. Notez que la troisième est spécialement marquée pour la sortie.
@au_lname varchar (20),
@intID entier,
@intIDOut entier SORTIE
COMME
SELECT @intIDOut = @intID + 1
SÉLECTIONNER *
DES auteurs
OÙ au_lname LIKE @au_lname + ''%''
--Renvoyer une valeur directement
RETOUR @intID + 2
Le programme asp qui appelle cette procédure stockée est le suivant :
Copiez le code comme suit :
<%@ Langage=VBScript %>
<%
Dim CmdSP
DimadoRS
Dim adCmdSPStoredProc
Dim adParamReturnValue
Dim adParaminput
Dim adParamOutput
Dim adInteger
Dim iVal
Dim oVal
Dim adoField
Dim adVarChar
'Ces valeurs sont des constantes prédéfinies en VB et peuvent être appelées directement, mais elles ne sont pas prédéfinies en VBScript
adCmdSPStoredProc = 4
adParamReturnValue = 4
adParaminput = 1
adParamOutput = 2
adEntier = 3
adVarChar = 200
iVal = 5
oVal = 3
''Créer un objet de commande
définir CmdSP = Server.CreateObject("ADODB.Command")
''Créer un lien
CmdSP.ActiveConnection = "Driver={SQL Server};server=(local);Uid=sa;Pwd=;Database=Pubs"
''Définir le nom de l'appel de l'objet de commande
CmdSP.CommandText = "sp_PubsTest"
''Définissez le type d'appel de commande comme étant une procédure stockée (adCmdSPStoredProc = 4)
CmdSP.CommandType = adCmdSPStoredProc
''Ajouter des paramètres à l'objet de commande
''Définissez la procédure stockée pour avoir une valeur de retour directe, et c'est un entier. La valeur par défaut est 4.
CmdSP.Parameters.Append CmdSP.CreateParameter("RETURN_VALUE", adInteger, adParamReturnValue, 4)
''Définir un paramètre de saisie de caractères
CmdSP.Parameters.Append CmdSP.CreateParameter("@au_lname", adVarChar, adParaminput, 20, "M")
''Définir un paramètre d'entrée entier
CmdSP.Parameters.Append CmdSP.CreateParameter("@intID", adInteger, adParamInput, , iVal)
''Définir un paramètre de sortie entier
CmdSP.Parameters.Append CmdSP.CreateParameter("@intIDOut", adInteger, adParamOutput, oVal)
''Exécutez la procédure stockée et récupérez le jeu d'enregistrements renvoyé
Définir adoRS = CmdSP.Execute
''Imprimez chaque enregistrement. Les champs sont virtuels et peuvent être ignorés.
Bien que ce ne soit pas adoRS.EOF
pour chaque adoField dans adoRS.Fields
Response.Write adoField.Name & "=" & adoField.Value & "<br>" & vbCRLF
Suivant
Réponse.Écrivez "<br>"
adoRS.MoveNext
Wende
''Imprime deux valeurs de sortie :
Response.Write "<p>@intIDOut = " & CmdSP.Parameters("@intIDOut").Value & "</p>"
Response.Write "<p>Valeur de retour = " & CmdSP.Parameters("RETURN_VALUE").Value & "</p>"
« Nettoyage de printemps
Définir adoRS = rien
Définir CmdSP.ActiveConnection = rien
Définir CmdSP = rien
%>
Lorsque vous utilisez asp pour appeler la procédure stockée et renvoyer le jeu d'enregistrements, l'erreur "Opération non autorisée lorsque l'objet est fermé" continue de signaler. J'ai cherché beaucoup de questions, mais je n'ai pas trouvé la bonne solution. de code plus fiable.
Finalement, j'ai découvert que le problème se produisait dans la procédure stockée. Il n'y avait aucun problème avec la procédure stockée dans l'exemple, mais lorsque j'utilisais ma propre procédure stockée, une erreur s'est produite.
La solution finale est de le mettre dans la procédure stockée que j'utilise
Avant chaque instruction Insert, ajoutez un set nocount on phrase, c'est-à-dire ajoutez une phrase à l'intérieur de la boucle du curseur.
Je n’ai pas encore approfondi les raisons spécifiques. Quiconque sait peut le signaler. Merci.