Un processus stocké est une ou plusieurs commandes SQL stockées dans la base de données en tant qu'objets exécutables.
Les définitions sont toujours abstraites. Un processus stocké est en fait un ensemble d'instructions SQL permettant d'effectuer certaines opérations, mais cet ensemble d'instructions est placé dans la base de données (on ne parle ici que de SQL SERVER). Si nous créons un processus stocké et appelons le processus stocké dans ASP, nous pouvons éviter de mélanger les instructions SQL avec le code ASP. Il y a au moins trois avantages à cela :
Premièrement, améliorez considérablement l’efficacité. La vitesse d'exécution du processus stocké lui-même est très rapide et l'appel du processus stocké peut réduire considérablement le nombre d'interactions avec la base de données.
Deuxièmement, améliorer la sécurité. Si vous mélangez des instructions SQL dans du code ASP, une fois le code compromis, cela signifie également que la structure de la bibliothèque est compromise.
Troisièmement, cela favorise la réutilisation des instructions SQL.
Dans ASP, les processus stockés sont généralement appelés via l'objet COMMAND. Selon la situation, cet article présente également d'autres méthodes d'appel. Pour faciliter l'explication, les classifications simples suivantes sont établies en fonction des entrées et des sorties du processus stocké :
1. Un processus stocké qui ne renvoie qu'un seul jeu d'enregistrements
Supposons qu'il existe le processus stocké suivant (le but de cet article n'est pas de décrire la syntaxe T-SQL, donc le processus stocké ne donne que le code sans explication) :
/*SP1*/
CRÉER UNE PROCÉDURE DBO.GETUSERLIST
COMME
DÉFINIR NOCOUNT ON
COMMENCER
SELECT * FROM DBO.[USERINFO]
FIN
ALLER
Le processus stocké ci-dessus obtient tous les enregistrements de la table USERINFO et renvoie un jeu d'enregistrements. Le code ASP pour appeler le processus stocké via l'objet COMMAND est le suivant :
'**Appeler le processus stocké via l'objet COMMAND**
DIM MYCOMM,MYRST
DÉFINIR MYCOMM = SERVER.CREATEOBJECT(ADODB.COMMAND)
MYCOMM.ACTIVECONNECTION = MYCONSTR 'MYCONSTR est la chaîne de connexion à la base de données
MYCOMM.COMMANDTEXT = GETUSERLIST 'Spécifiez le nom du processus stocké
MYCOMM.COMMANDTYPE = 4 'Indique qu'il s'agit d'un processus stocké
MYCOMM.PREPARED = TRUE 'Exige que les commandes SQL soient d'abord compilées
DÉFINIR MYRST = MYCOMM.EXECUTE
RÉGLER MYCOMM = RIEN
L'ensemble d'enregistrements obtenu par le processus de stockage est attribué à MYRST. Ensuite, MYRST peut être exploité.
Dans le code ci-dessus, l'attribut COMMANDTYPE indique le type de requête. La valeur et la description sont les suivantes :
-1 indique que le type du paramètre COMMANDTEXT ne peut pas être déterminé
1 indique que COMMANDTEXT est un type de commande général
2 indique que le paramètre COMMANDTEXT est un nom de table avec
4 indique que le paramètre COMMANDTEXT est le nom d'un processus stocké
Vous pouvez également appeler le processus stocké via l'objet CONNECTION ou l'objet RECORDSET. Les méthodes sont les suivantes :
'**Appel du processus stocké via l'objet CONNECTION**
DIMMYCONNE,MYRST
DÉFINIR MYCONN = SERVER.CREATEOBJECT(ADODB.CONNECTION)
MYCONN.OPEN MYCONSTR 'MYCONSTR est la chaîne de connexion à la base de données
SET MYRST = MYCONN.EXECUTE(GETUSERLIST,0,4) 'Le dernier paramètre a la même signification que COMMANDTYPE
RÉGLER MYCONN = RIEN
'**Appel du processus stocké via l'objet RECORDSET**
DIMMYRST
DÉFINIR MYRST = SERVER.CREATEOBJECT(ADODB.RECORDSET)
MYRST.OPEN GETUSERLIST,MYCONSTR,0,1,4
'MYCONSTR est la chaîne de connexion à la base de données, le dernier paramètre a la même signification que COMMANDTYPE
2. Processus stocké sans entrée ni sortie
Jetez un œil aux procédures stockées suivantes :
/*SP2*/
CRÉER UNE PROCÉDURE DBO.DELUSERALL
COMME
DÉFINIR NOCOUNT ON
COMMENCER
SUPPRIMER DE DBO.[USERINFO]
FIN
ALLER
Ce processus stocké supprime tous les enregistrements de la table USERINFO sans aucune entrée ni sortie. La méthode d'appel est fondamentalement la même que celle mentionnée ci-dessus, sauf qu'il n'est pas nécessaire d'obtenir le jeu d'enregistrements :
'**Appeler le processus stocké via l'objet COMMAND**
DIMMYCOMM
DÉFINIR MYCOMM = SERVER.CREATEOBJECT(ADODB.COMMAND)
MYCOMM.ACTIVECONNECTION = MYCONSTR 'MYCONSTR est la chaîne de connexion à la base de données
MYCOMM.COMMANDTEXT = DELUSERALL 'Spécifiez le nom du processus stocké
MYCOMM.COMMANDTYPE = 4 'Indique qu'il s'agit d'un processus stocké
MYCOMM.PREPARED = TRUE 'Exige que les commandes SQL soient d'abord compilées
MYCOMM.EXECUTE 'Pas besoin d'obtenir l'enregistrement défini ici
RÉGLER MYCOMM = RIEN
Bien entendu, ce type de processus stocké peut également être appelé via l'objet CONNECTION ou l'objet RECORDSET. Cependant, l'objet RECORDSET est créé pour obtenir le jeu d'enregistrements. Si le jeu d'enregistrements n'est pas renvoyé, utilisez l'objet COMMAND.
3. Procédures stockées avec valeurs de retour
Lorsque vous effectuez des opérations de type SP2, vous devez utiliser pleinement les puissantes capacités de traitement des transactions de SQL SERVER pour maintenir la cohérence des données. De plus, nous devrons peut-être stocker l'état d'exécution renvoyé par le processus. Pour cela, modifiez le SP2 comme suit :
/*SP3*/
CRÉER UNE PROCÉDURE DBO.DELUSERALL
COMME
DÉFINIR NOCOUNT ON
COMMENCER
COMMENCER LA TRANSACTION
SUPPRIMER DE DBO.[USERINFO]
SI @@ERREUR=0
COMMENCER
ENGAGER LA TRANSACTION
RETOUR 1
FIN
AUTRE
COMMENCER
TRANSACTION D'ANNULATION
RETOUR 0
FIN
RETOUR
FIN
ALLER
Le processus stocké ci-dessus renvoie 1 lorsque DELETE est exécuté avec succès, sinon il renvoie 0 et effectue une opération de restauration. Afin d'obtenir la valeur de retour dans ASP, vous devez utiliser la collection PARAMETERS pour déclarer les paramètres :
'**Appelle un processus stocké avec une valeur de retour et obtient la valeur de retour**
DIM MYCOMM,MYPARA
DÉFINIR MYCOMM = SERVER.CREATEOBJECT(ADODB.COMMAND)
MYCOMM.ACTIVECONNECTION = MYCONSTR 'MYCONSTR est la chaîne de connexion à la base de données
MYCOMM.COMMANDTEXT = DELUSERALL 'Spécifiez le nom du processus stocké
MYCOMM.COMMANDTYPE = 4 'Indique qu'il s'agit d'un processus stocké
MYCOMM.PREPARED = TRUE 'Exige que les commandes SQL soient d'abord compilées
'Déclarer la valeur de retour
SET MYPARA = MYCOMM.CREATEPARAMETER(RETOUR,2,4)
MYCOMM.PARAMETERS.APPEND MYPARA
MYCOMM.EXECUTER
'Obtenir la valeur de retour
VALEUR DIM
RETVALUE = MYCOMM(0) 'ou RETVALUE = MYCOMM.PARAMETERS(0)
RÉGLER MYCOMM = RIEN
Dans MYCOMM.CREATEPARAMETER(RETURN,2,4), la signification de chaque paramètre est la suivante :
Le premier paramètre (RETURE) est le nom du paramètre. Le nom du paramètre peut être défini arbitrairement, mais il doit généralement être le même que le nom du paramètre déclaré dans le processus stocké. Voici la valeur de retour, je la règle généralement sur RETURE ;
Le deuxième paramètre (2) indique le type de données du paramètre. Veuillez vous référer à la référence ADO pour les codes de type spécifiques indiqués ci-dessous :
ADBIGINT : 20 ;
ADBINAIRE : 128 ;
ADBOOLÉEN : 11 ;
ADCHAR : 129 ;
ADDBTIMESTAMP : 135 ;
ADEMPTÉ : 0 ;
NOMBRE ENTIER : 3 ;
ADSMALLINT : 2 ;
ADTINYINT : 16 ;
ADVARCHAR : 200 ;
Pour la valeur de retour, seules les valeurs entières peuvent être prises, et -1 à -99 sont des valeurs réservées ;
Le troisième paramètre (4) indique la nature du paramètre, où 4 indique qu'il s'agit d'une valeur de retour. La description de la valeur de ce paramètre est la suivante :
0 : Le type ne peut pas être déterminé ; 1 : Paramètre d'entrée ; 2 : Paramètre d'entrée ; 3 : Paramètre d'entrée ou de sortie ;
Le code ASP donné ci-dessus doit être considéré comme le code complet, c'est-à-dire le code le plus complexe.
SET MYPARA = MYCOMM.CREATEPARAMETER(RETOUR,2,4)
MYCOMM.PARAMETERS.APPEND MYPARA
peut être simplifié en
MYCOMM.PARAMETERS.APPEND MYCOMM.CREATEPARAMETER(RETURN,2,4)
Il peut même être encore simplifié, comme cela sera expliqué plus loin.
Pour les procédures stockées avec paramètres, elles ne peuvent être appelées qu'à l'aide de l'objet COMMAND (il existe également des informations selon lesquelles elles peuvent être appelées via l'objet CONNECTION ou l'objet RECORDSET, mais je ne l'ai pas essayé).
4. Processus stocké avec paramètres d'entrée et paramètres de sortie
La valeur de retour est en fait un paramètre de sortie spécial. Dans la plupart des cas, nous utilisons un processus stocké qui a à la fois des paramètres d'entrée et de sortie. Par exemple, nous souhaitons obtenir le nom d'utilisateur d'un utilisateur avec un certain identifiant dans la table d'informations utilisateur. À ce stade, il existe un paramètre d'entrée. ---ID utilisateur et un paramètre de sortie ----nom d'utilisateur. Le processus stocké qui implémente cette fonction est le suivant :
/*SP4*/
CRÉER UNE PROCÉDURE DBO.GETUSERNAME
@USERIDINT,
@USERNAME VARCHAR(40) SORTIE
COMME
DÉFINIR NOCOUNT ON
COMMENCER
SI @USERID EST NULL RETOUR
SELECT @USERNAME=USERNAME
DE DBO.[INFO UTILISATEUR]
OÙ USERID=@USERID
RETOUR
FIN
ALLER
Le code ASP qui appelle le processus stocké est le suivant :
'**Appeler un processus stocké avec des paramètres d'entrée et de sortie**
DIM MYCOMM, USERID, NOM D'UTILISATEUR
IDENTIFIANT=1
DÉFINIR MYCOMM = SERVER.CREATEOBJECT(ADODB.COMMAND)
MYCOMM.ACTIVECONNECTION = MYCONSTR 'MYCONSTR est la chaîne de connexion à la base de données
MYCOMM.COMMANDTEXT = GETUSERNAME 'Spécifiez le nom du processus stocké
MYCOMM.COMMANDTYPE = 4 'Indique qu'il s'agit d'un processus stocké
MYCOMM.PREPARED = TRUE 'Exige que les commandes SQL soient d'abord compilées
'Déclarer les paramètres
MYCOMM.PARAMETERS.APPEND MYCOMM.CREATEPARAMETER (@USERID,3,1,4,USERID)
MYCOMM.PARAMETERS.APPEND MYCOMM.CREATEPARAMETER (@USERNAME,200,2,40)
MYCOMM.EXECUTER
'Obtenir les paramètres
NOM D'UTILISATEUR = MONCOMM(1)
RÉGLER MYCOMM = RIEN
Dans le code ci-dessus, vous pouvez voir que contrairement à la déclaration d'une valeur de retour, 5 paramètres sont requis lors de la déclaration des paramètres d'entrée et 4 paramètres sont requis lors de la déclaration des paramètres de sortie. Lors de la déclaration des paramètres d'entrée, les cinq paramètres sont : le nom du paramètre, le type de données du paramètre, le type de paramètre, la longueur des données et la valeur du paramètre. Lors de la déclaration d'un paramètre de sortie, il n'y a pas de dernier paramètre : la valeur du paramètre.
Une attention particulière doit être portée aux points suivants : lors de la déclaration des paramètres, l'ordre doit être le même que celui défini dans le processus de stockage, et le type de données et la longueur de chaque paramètre doivent également être les mêmes que ceux définis dans le processus de stockage.
Si le processus stocké comporte plusieurs paramètres, le code ASP apparaîtra encombrant. Vous pouvez utiliser la commande AVEC pour simplifier le code :
'**Appeler un processus stocké avec des paramètres d'entrée et de sortie (code simplifié)**
DIM MYCOMM, USERID, NOM D'UTILISATEUR
IDENTIFIANT=1
DÉFINIR MYCOMM = SERVER.CREATEOBJECT(ADODB.COMMAND)
AVEC MYCOMM
.ACTIVECONNECTION = MYCONSTR 'MYCONSTR est la chaîne de connexion à la base de données
.COMMANDTEXT = GETUSERNAME 'Spécifiez le nom du processus stocké
.COMMANDTYPE = 4 'Indique qu'il s'agit d'un processus stocké
.PREPARED = TRUE 'Nécessite que les commandes SQL soient d'abord compilées
.PARAMETERS.APPEND .CREATEPARAMETER (@USERID,3,1,4,USERID)
.PARAMETERS.APPEND .CREATEPARAMETER (@USERNAME,200,2,40)
.EXÉCUTER
FINIR PAR
NOM D'UTILISATEUR = MONCOMM(1)
RÉGLER MYCOMM = RIEN
Si nous voulons obtenir les noms d’utilisateur de 10 utilisateurs avec les ID 1 à 10, devons-nous créer des objets COMMAND 10 fois ? Non. Si vous devez appeler le même processus stocké plusieurs fois, modifiez simplement les paramètres d'entrée et vous obtiendrez une sortie différente :
'**Plusieurs appels au même processus stocké**
DIM MYCOMM, USERID, NOM D'UTILISATEUR
NOM D'UTILISATEUR=
DÉFINIR MYCOMM = SERVER.CREATEOBJECT(ADODB.COMMAND)
POUR USERID = 1 À 10
AVEC MYCOMM
.ACTIVECONNECTION = MYCONSTR 'MYCONSTR est la chaîne de connexion à la base de données
.COMMANDTEXT = GETUSERNAME 'Spécifiez le nom du processus stocké
.COMMANDTYPE = 4 'Indique qu'il s'agit d'un processus stocké
.PREPARED = TRUE 'Nécessite que les commandes SQL soient d'abord compilées
SI IDENTIFIANT = 1 ALORS
.PARAMETERS.APPEND .CREATEPARAMETER (@USERID,3,1,4,USERID)
.PARAMETERS.APPEND .CREATEPARAMETER (@USERNAME,200,2,40)
.EXÉCUTER
AUTRE
'Réaffecter les valeurs aux paramètres d'entrée (les paramètres d'entrée et les paramètres de sortie dont les valeurs de paramètre ne changent pas à ce moment n'ont pas besoin d'être déclarés à nouveau)
.PARAMETRES (@USERID) = USERID
.EXÉCUTER
FIN SI
FINIR PAR
USERNAME = USERNAME + MYCOMM(1) + , 'Peut-être aimez-vous utiliser le stockage en baie
SUIVANT
RÉGLER MYCOMM = RIEN
Comme le montre le code ci-dessus : lors de l'appel répété du même processus stocké, il vous suffit de réaffecter les paramètres d'entrée dont les valeurs ont changé. Cette méthode a plusieurs paramètres d'entrée et de sortie, et une seule valeur de paramètre d'entrée est appelée chacune. Lorsque des changements se produisent, la quantité de code peut être considérablement réduite.
5. Un processus stocké avec des valeurs de retour, des paramètres d'entrée et des paramètres de sortie en même temps
Comme mentionné précédemment, lors de l'appel d'un processus stocké, l'ordre dans lequel les paramètres sont déclarés doit être le même que l'ordre défini dans le processus stocké. Autre point à prendre particulièrement en compte : si le processus stocké possède à la fois une valeur de retour et des paramètres d'entrée et de sortie, la valeur de retour doit être déclarée en premier.
Pour démontrer la méthode d'appel dans ce cas, améliorons l'exemple ci-dessus. Obtenez toujours le nom d'utilisateur de l'utilisateur avec l'ID 1, mais il est possible que l'utilisateur ne l'ait pas (l'utilisateur a été supprimé et USERID est un champ auto-croissant). Le processus stocké renvoie des valeurs différentes selon que l'utilisateur le possède ou non. À ce stade, le processus stocké et le code ASP sont les suivants :
/*SP5*/
CRÉER UNE PROCÉDURE DBO.GETUSERNAME
--Afin d'approfondir l'impression de l'ordre, inversez l'ordre de définition des deux paramètres suivants.
@USERNAME VARCHAR(40) SORTIE,
@USERIDINT
COMME
DÉFINIR NOCOUNT ON
COMMENCER
SI @USERID EST NULL RETOUR
SELECT @USERNAME=USERNAME
DE DBO.[INFO UTILISATEUR]
OÙ USERID=@USERID
SI @@ROWCOUNT>0
RETOUR 1
AUTRE
RETOUR 0
RETOUR
FIN
ALLER
'**Appelle un processus stocké avec une valeur de retour, des paramètres d'entrée et des paramètres de sortie**
DIM MYCOMM, USERID, NOM D'UTILISATEUR
IDENTIFIANT=1
DÉFINIR MYCOMM = SERVER.CREATEOBJECT(ADODB.COMMAND)
AVEC MYCOMM
.ACTIVECONNECTION = MYCONSTR 'MYCONSTR est la chaîne de connexion à la base de données
.COMMANDTEXT = GETUSERNAME 'Spécifiez le nom du processus stocké
.COMMANDTYPE = 4 'Indique qu'il s'agit d'un processus stocké
.PREPARED = TRUE 'Nécessite que les commandes SQL soient d'abord compilées
'La valeur de retour doit être déclarée en premier
.PARAMETERS.APPEND .CREATEPARAMETER(RETURN,2,4)
'L'ordre de déclaration des deux paramètres suivants est également inversé en conséquence.
.PARAMETERS.APPEND .CREATEPARAMETER (@USERNAME,200,2,40)
.PARAMETERS.APPEND .CREATEPARAMETER (@USERID,3,1,4,USERID)
.EXÉCUTER
FINIR PAR
SI MYCOMM(0) = 1 ALORS
NOM D'UTILISATEUR = MONCOMM(1)
AUTRE
USERNAME = Cet utilisateur n'a pas
FIN SI
RÉGLER MYCOMM = RIEN
6. Processus stocké qui renvoie les paramètres et le jeu d'enregistrements en même temps
Parfois, nous avons besoin que le processus de stockage renvoie des paramètres et des jeux d'enregistrements en même temps. Par exemple, lorsque nous utilisons le processus de stockage pour la pagination, nous devons renvoyer simultanément des paramètres tels que les jeux d'enregistrements et le volume total de données. Ce qui suit est un processus stocké pour la pagination :
/*SP6*/
CRÉER UNE PROCÉDURE DBO.GETUSERLIST
@IPAGECOUNT INT OUTPUT, --Nombre total de pages
@IPAGE INT, --Numéro de page actuel
@IPAGESIZE INT --Nombre d'enregistrements par page
COMME
DÉFINIR NOCOUNT ON
COMMENCER
--Créer une table temporaire
CREATE TABLE #T (ID INT IDENTITY, champ --auto-increment
UTILISATEUR INT,
NOM D'UTILISATEUR VARCHAR(40))
--Écrire les données dans une table temporaire
INSÉRER DANS #T
SELECT USERID,USERNAME FROM DBO.[USERINFO]
COMMANDE PAR ID UTILISATEUR
--Obtenir le nombre total d'enregistrements
DÉCLARER @IRECORDCOUNT INT
DÉFINIR @IRECORDCOUNT = @@ROWCOUNT
--Déterminer le nombre total de pages
SI @IRECORDCOUNT%@IPAGESIZE=0
DÉFINIR @IPAGECOUNT=CEILING (@IRECORDCOUNT/@IPAGESIZE)
AUTRE
SET @IPAGECOUNT=PLAFOND (@IRECORDCOUNT/@IPAGESIZE)+1
--Si le numéro de page demandé est supérieur au nombre total de pages, la dernière page sera affichée
SI @IPAGE > @IPAGECOUNT
SÉLECTIONNER @IPAGE = @IPAGECOUNT
--Déterminer les enregistrements de début et de fin de la page en cours
DECLARE @ISTART INT --START ENREGISTREMENT
DÉCLARE @IEND INT --FIN ENREGISTREMENT
SELECT @ISTART = (@IPAGE - 1) * @IPAGESIZE
SELECT @IEND = @ISTART + @IPAGESIZE + 1
--Obtenir l'enregistrement de la page actuelle
SELECT * FROM #T OÙ ID>@ISTART ET ID<@IEND
--Supprimer la table temporaire
TABLE DE DÉPÔT #T
--Renvoyer le nombre total d'enregistrements
RETOUR @IRECORDCOUNT
FIN
ALLER
Dans le processus de stockage ci-dessus, entrez le numéro de la page actuelle et le nombre d'enregistrements par page, et renvoyez le jeu d'enregistrements de la page actuelle, le nombre total de pages et le nombre total d'enregistrements. Pour être plus typique, le nombre total d'enregistrements est renvoyé sous forme de valeur de retour. Voici le code ASP qui appelle le processus stocké (l'opération de pagination spécifique est omise) :
'**Processus de stockage de la radiomessagerie d'appel**
DIM PAGENOW, PAGESIZE, PAGECOUNT, RECORDCOUNT
DIM MYCOMM,MYRST
PAGENOW = DEMANDE (PN)
'Fonction personnalisée utilisée pour vérifier les nombres naturels
SI CHECKNAR(PAGENOW) = FALSE ALORS PAGENOW = 1
TAILLE DE LA PAGE = 20
DÉFINIR MYCOMM = SERVER.CREATEOBJECT(ADODB.COMMAND)
AVEC MYCOMM
.ACTIVECONNECTION = MYCONSTR 'MYCONSTR est la chaîne de connexion à la base de données
.COMMANDTEXT = GETUSERLIST 'Spécifiez le nom du processus stocké
.COMMANDTYPE = 4 'Indique qu'il s'agit d'un processus stocké
.PREPARED = TRUE 'Nécessite que les commandes SQL soient d'abord compilées
'Valeur renvoyée (nombre total d'enregistrements)
.PARAMETERS.APPEND .CREATEPARAMETER(RETURN,2,4)
'Paramètres de sortie (nombre total de pages)
.PARAMETERS.APPEND .CREATEPARAMETER (@IPAGECOUNT,3,2)
'Paramètres d'entrée (numéro de page actuel)
.PARAMETERS.APPEND .CREATEPARAMETER (@IPAGE,3,1,4,PAGENOW)
'Paramètres d'entrée (nombre d'enregistrements par page)
.PARAMETERS.APPEND .CREATEPARAMETER (@IPAGESIZE,3,1,4,PAGESIZE)
DÉFINIR MYRST = .EXECUTE
FINIR PAR
IF MYRST.STATE = 0 THEN 'Aucune donnée n'a été obtenue, MYRST est fermé
COMPTE D'ENREGISTREMENT = -1
AUTRE
MYRST.CLOSE 'Remarque : Pour obtenir les valeurs des paramètres, vous devez d'abord fermer l'objet Recordset.
RECORDCOUNT = MONCOMM(0)
PAGECOUNT = MONCOMM(1)
SI CINT(PAGENOW)>=CINT(PAGECOUNT) ALORS PAGENOW=PAGECOUNT
FIN SI
RÉGLER MYCOMM = RIEN
'Afficher les enregistrements ci-dessous
SI RECORDCOUNT = 0 ALORS
RESPONSE.WRITE Aucun enregistrement
ELSEIF RECORDCOUNT > 0 ALORS
MYRST.OUVERT
FAIRE JUSQU'À MYRST.EOF
...
BOUCLE
'Ce qui suit affiche les informations de pagination
...
AUTRE 'RECORDCOUNT=-1
Erreur de paramètre RESPONSE.WRITE
FIN SI
Concernant le code ci-dessus, il n'y a qu'un seul point à expliquer : lors du renvoi du jeu d'enregistrements et des paramètres en même temps, si vous souhaitez obtenir les paramètres, vous devez d'abord fermer le jeu d'enregistrements, puis l'ouvrir lors de l'utilisation du jeu d'enregistrements.
7. Processus stocké qui renvoie plusieurs jeux d'enregistrements
Cet article présente d'abord le processus stocké qui renvoie un jeu d'enregistrements. Parfois, un processus stocké doit renvoyer plusieurs jeux d'enregistrements. Dans ASP, comment obtenir ces jeux d'enregistrements en même temps ? Afin d'illustrer ce problème, ajoutez deux champs à la table USERINFO : USERTEL et USERMAIL, et définissez que seuls les utilisateurs connectés peuvent afficher ces deux contenus.
/*SP7*/
CRÉER UNE PROCÉDURE DBO.GETUSERINFO
@USERIDINT,
@CHECKLOGINBIT
COMME
DÉFINIR NOCOUNT ON
COMMENCER
SI @USERID EST NULL OU @CHECKLOGIN EST NULL, RETOUR
SÉLECTIONNER UN NOM D'UTILISATEUR
DE DBO.[USRINFO]
OÙ USERID=@USERID
--Si vous êtes un utilisateur connecté, prenez USERTEL et USERMAIL
SI @CHECKLOGIN=1
SÉLECTIONNEZ USERTEL, USERMAIL
DE DBO.[INFO UTILISATEUR]
OÙ USERID=@USERID
RETOUR
FIN
ALLER
Voici le code ASP :
'**Appelle un processus stocké qui renvoie plusieurs jeux d'enregistrements**
DIM CHECKLG, USERID, USERNAME, USERTEL, USERMAIL
DIM MYCOMM,MYRST
IDENTIFIANT=1
'CHECKLOGIN() est une fonction personnalisée permettant de déterminer si le visiteur est connecté
CHECKLG = CHECKLOGIN()
DÉFINIR MYCOMM = SERVER.CREATEOBJECT(ADODB.COMMAND)
AVEC MYCOMM
.ACTIVECONNECTION = MYCONSTR 'MYCONSTR est la chaîne de connexion à la base de données
.COMMANDTEXT = GETUSERINFO 'Spécifiez le nom du processus stocké
.COMMANDTYPE = 4 'Indique qu'il s'agit d'un processus stocké
.PREPARED = TRUE 'Nécessite que les commandes SQL soient d'abord compilées
.PARAMETERS.APPEND .CREATEPARAMETER (@USERID,3,1,4,USERID)
.PARAMETERS.APPEND .CREATEPARAMETER (@CHECKLOGIN,11,1,1,CHECKLG)
DÉFINIR MYRST = .EXECUTE
FINIR PAR
RÉGLER MYCOMM = RIEN
'Obtenir la valeur du premier jeu d'enregistrements
NOM D'UTILISATEUR = MYRST(0)
'Obtenir la valeur du deuxième jeu d'enregistrements
SI CE N'EST PAS MYRST N'EST RIEN ALORS
SET MYRST = MYRST.NEXTRECORDSET()
USERTEL = MYRST(0)
MAIL UTILISATEUR = MYRST(1)
FIN SI
SET MYRST = RIEN
Dans le code ci-dessus, la méthode NEXTRECORDSET de l'objet RECORDSET est utilisée pour obtenir plusieurs jeux d'enregistrements renvoyés par le processus de stockage.
Jusqu'à présent, cet article a donné une explication relativement complète de diverses situations dans lesquelles ASP appelle des processus stockés. Enfin, parlons des différentes méthodes d'appel de plusieurs processus stockés dans un programme ASP.
Dans un programme ASP, au moins les trois méthodes suivantes sont possibles pour appeler plusieurs processus stockés :
1. Créez plusieurs objets COMMAND
DIMMYCOMM
DÉFINIR MYCOMM = SERVER.CREATEOBJECT(ADODB.COMMAND)
'Appeler le processus stocké un
...
RÉGLER MYCOMM = RIEN
DÉFINIR MYCOMM = SERVER.CREATEOBJECT(ADODB.COMMAND)
'Appeler le processus stocké deux
...
RÉGLER MYCOMM = RIEN
...
2. Créez un seul objet COMMAND et effacez ses paramètres à la fin d'un appel.
DIMMYCOMM
DÉFINIR MYCOMM = SERVER.CREATEOBJECT(ADODB.COMMAND)
'Appeler le processus stocké un
.....
'Effacer les paramètres (en supposant qu'il y ait trois paramètres)
MYCOMM.PARAMETERS.DELETE 2
MYCOMM.PARAMETERS.DELETE 1
MYCOMM.PARAMETERS.DELETE 0
'Appeler le processus stocké deux et effacer les paramètres
...
RÉGLER MYCOMM = RIEN
Pour le moment, veuillez noter : l'ordre d'effacement des paramètres est opposé à l'ordre de déclaration des paramètres, je ne connais pas la raison.
3. Utilisez la méthode REFRESH de la collecte de données PARAMETERS pour réinitialiser l'objet PARAMETER
DIMMYCOMM
DÉFINIR MYCOMM = SERVER.CREATEOBJECT(ADODB.COMMAND)
'Appeler le processus stocké un
.....
'Réinitialiser tous les objets PARAMETER contenus dans la collection de données PARAMETERS
MYCOMM.PARAMETERS.REFRESH
'Appeler le processus stocké deux
.....
RÉGLER MYCOMM = RIEN
Il est généralement admis que la création répétée d'objets est une méthode moins efficace, mais après test (l'outil de test est MICROSOFT APPLICATION CENTER TEST), les résultats sont inattendus :
Méthode 2 >= Méthode 1 >> Méthode 3
La vitesse d'exécution de la méthode 2 est supérieure ou égale à celle de la méthode 1 (jusqu'à environ 4 % de plus). La vitesse d'exécution de ces deux méthodes est beaucoup plus rapide que la méthode 3 (jusqu'à 130 %). méthode 1 lorsqu’il y a de nombreux paramètres. Sinon, utilisez la méthode 2.
Il m'a fallu une journée pour enfin mettre par écrit une partie de mon expérience superficielle dans l'appel de procédures stockées en ASP. Parmi eux, certains d’entre eux dont je ne connais que les effets mais pas les causes, et certains peuvent être erronés, mais tout cela résulte de ma pratique personnelle. Veuillez l’accepter d’un œil critique, lecteurs. Si vous avez des avis différents, n'hésitez pas à me le faire savoir. Merci d'avance.