Bei einem gespeicherten Prozess handelt es sich um einen oder mehrere SQL-Befehle, die als ausführbare Objekte in der Datenbank gespeichert sind.
Definitionen sind immer abstrakt. Ein gespeicherter Prozess ist eigentlich eine Reihe von SQL-Anweisungen, die bestimmte Vorgänge abschließen können. Diese Anweisungen werden jedoch in der Datenbank abgelegt (hier sprechen wir nur über SQL SERVER). Wenn wir einen gespeicherten Prozess erstellen und den gespeicherten Prozess in ASP aufrufen, können wir vermeiden, SQL-Anweisungen mit ASP-Code zu vermischen. Dies hat mindestens drei Vorteile:
Erstens, die Effizienz erheblich verbessern. Die Ausführungsgeschwindigkeit des gespeicherten Prozesses selbst ist sehr hoch, und der Aufruf des gespeicherten Prozesses kann die Anzahl der Interaktionen mit der Datenbank erheblich reduzieren.
Zweitens: Verbesserung der Sicherheit. Wenn Sie SQL-Anweisungen in ASP-Code mischen, bedeutet dies, sobald der Code gefährdet ist, auch, dass die Bibliotheksstruktur gefährdet ist.
Drittens fördert es die Wiederverwendung von SQL-Anweisungen.
In ASP werden gespeicherte Prozesse im Allgemeinen über das COMMAND-Objekt aufgerufen. Je nach Situation werden in diesem Artikel auch andere Aufrufmethoden vorgestellt. Zur Vereinfachung der Erklärung werden die folgenden einfachen Klassifizierungen basierend auf der Eingabe und Ausgabe des gespeicherten Prozesses vorgenommen:
1. Ein gespeicherter Prozess, der nur einen einzigen Datensatz zurückgibt
Angenommen, es gibt den folgenden gespeicherten Prozess (der Zweck dieses Artikels besteht nicht darin, die T-SQL-Syntax zu beschreiben, daher gibt der gespeicherte Prozess nur den Code ohne Erklärung an):
/*SP1*/
PROZEDUR DBO.GETUSERLIST ERSTELLEN
ALS
NOCOUNT EINSTELLEN
BEGINNEN
* AUS DBO AUSWÄHLEN.[USERINFO]
ENDE
GEHEN
Der oben gespeicherte Prozess ruft alle Datensätze in der USERINFO-Tabelle ab und gibt einen Datensatz zurück. Der ASP-Code zum Aufrufen des gespeicherten Prozesses über das COMMAND-Objekt lautet wie folgt:
'**Gespeicherten Prozess über COMMAND-Objekt aufrufen**
DIM MYCOMM,MYRST
SET MYCOMM = SERVER.CREATEOBJECT(ADODB.COMMAND)
MYCOMM.ACTIVECONNECTION = MYCONSTR 'MYCONSTR ist die Datenbankverbindungszeichenfolge
MYCOMM.COMMANDTEXT = GETUSERLIST 'Geben Sie den Namen des gespeicherten Prozesses an
MYCOMM.COMMANDTYPE = 4 'Zeigt an, dass es sich um einen gespeicherten Prozess handelt
MYCOMM.PREPARED = TRUE 'Erfordert, dass SQL-Befehle zuerst kompiliert werden
SET MYRST = MYCOMM.EXECUTE
SETZE MYCOMM = NICHTS
Der durch den Speicherprozess erhaltene Datensatz wird MYRST zugewiesen. Als nächstes kann MYRST bedient werden.
Im obigen Code gibt das COMMANDTYPE-Attribut den Typ der Anfrage an. Der Wert und die Beschreibung lauten wie folgt:
-1 gibt an, dass der Typ des COMMANDTEXT-Parameters nicht bestimmt werden kann
1 gibt an, dass COMMANDTEXT ein allgemeiner Befehlstyp ist
2 gibt an, dass der Parameter COMMANDTEXT ein Tabellenname mit ist
4 gibt an, dass der COMMANDTEXT-Parameter der Name eines gespeicherten Prozesses ist
Sie können den gespeicherten Prozess auch über das CONNECTION-Objekt oder RECORDSET-Objekt aufrufen. Die Methoden sind wie folgt:
'**Aufrufen des gespeicherten Prozesses über das CONNECTION-Objekt**
DIMMYCONN, MYRST
SET MYCONN = SERVER.CREATEOBJECT(ADODB.CONNECTION)
MYCONN.OPEN MYCONSTR 'MYCONSTR ist die Datenbankverbindungszeichenfolge
SET MYRST = MYCONN.EXECUTE(GETUSERLIST,0,4) 'Der letzte Parameter hat die gleiche Bedeutung wie COMMANDTYPE
SET MYCONN = NICHTS
'**Aufrufen des gespeicherten Prozesses über das RECORDSET-Objekt**
DIMMYRST
SET MYRST = SERVER.CREATEOBJECT(ADODB.RECORDSET)
MYRST.OPEN GETUSERLIST,MYCONSTR,0,1,4
'MYCONSTR ist die Datenbankverbindungszeichenfolge, der letzte Parameter hat die gleiche Bedeutung wie COMMANDTYPE
2. Gespeicherter Prozess ohne Eingabe und Ausgabe
Schauen Sie sich die folgenden gespeicherten Prozeduren an:
/*SP2*/
PROZEDUR DBO.DELUSERALL ERSTELLEN
ALS
NOCOUNT EINSTELLEN
BEGINNEN
AUS DBO LÖSCHEN.[USERINFO]
ENDE
GEHEN
Dieser gespeicherte Prozess löscht alle Datensätze in der USERINFO-Tabelle ohne Eingabe oder Ausgabe. Die Aufrufmethode ist im Wesentlichen die gleiche wie oben erwähnt, außer dass der Datensatzsatz nicht abgerufen werden muss:
'**Gespeicherten Prozess über COMMAND-Objekt aufrufen**
DIMMYCOMM
SET MYCOMM = SERVER.CREATEOBJECT(ADODB.COMMAND)
MYCOMM.ACTIVECONNECTION = MYCONSTR 'MYCONSTR ist die Datenbankverbindungszeichenfolge
MYCOMM.COMMANDTEXT = DELUSERALL 'Geben Sie den Namen des gespeicherten Prozesses an
MYCOMM.COMMANDTYPE = 4 'Zeigt an, dass es sich um einen gespeicherten Prozess handelt
MYCOMM.PREPARED = TRUE 'Erfordert, dass SQL-Befehle zuerst kompiliert werden
MYCOMM.EXECUTE 'Der Datensatz muss hier nicht abgerufen werden
SETZE MYCOMM = NICHTS
Natürlich kann diese Art von gespeichertem Prozess auch über das CONNECTION-Objekt oder RECORDSET-Objekt aufgerufen werden. Zum Abrufen des Datensatzes wird jedoch das COMMAND-Objekt verwendet.
3. Gespeicherte Prozeduren mit Rückgabewerten
Wenn Sie SP2-ähnliche Vorgänge ausführen, sollten Sie die leistungsstarken Transaktionsverarbeitungsfunktionen von SQL SERVER voll ausnutzen, um die Datenkonsistenz aufrechtzuerhalten. Darüber hinaus müssen wir möglicherweise den vom Prozess zurückgegebenen Ausführungsstatus speichern. Ändern Sie dazu SP2 wie folgt:
/*SP3*/
PROZEDUR DBO.DELUSERALL ERSTELLEN
ALS
NOCOUNT EINSTELLEN
BEGINNEN
TRANSAKTION BEGINNEN
AUS DBO LÖSCHEN.[USERINFO]
WENN @@ERROR=0
BEGINNEN
COMMIT-TRANSAKTION
RÜCKKEHR 1
ENDE
ANDERS
BEGINNEN
ROLLBACK-TRANSAKTION
RÜCKKEHR 0
ENDE
ZURÜCKKEHREN
ENDE
GEHEN
Der oben gespeicherte Prozess gibt 1 zurück, wenn DELETE erfolgreich ausgeführt wird, andernfalls gibt er 0 zurück und führt einen Rollback-Vorgang aus. Um den Rückgabewert in ASP zu erhalten, müssen Sie die PARAMETERS-Sammlung verwenden, um Parameter zu deklarieren:
'**Rufen Sie einen gespeicherten Prozess mit einem Rückgabewert auf und erhalten Sie den Rückgabewert**
DIM MYCOMM,MYPARA
SET MYCOMM = SERVER.CREATEOBJECT(ADODB.COMMAND)
MYCOMM.ACTIVECONNECTION = MYCONSTR 'MYCONSTR ist die Datenbankverbindungszeichenfolge
MYCOMM.COMMANDTEXT = DELUSERALL 'Geben Sie den Namen des gespeicherten Prozesses an
MYCOMM.COMMANDTYPE = 4 'Zeigt an, dass es sich um einen gespeicherten Prozess handelt
MYCOMM.PREPARED = TRUE 'Erfordert, dass SQL-Befehle zuerst kompiliert werden
'Rückgabewert deklarieren
SET MYPARA = MYCOMM.CREATEPARAMETER(RETURN,2,4)
MYCOMM.PARAMETERS.APPEND MYPARA
MYCOMM.EXECUTE
'Holen Sie sich den Rückgabewert
DIM RETVALUE
RETVALUE = MYCOMM(0) 'oder RETVALUE = MYCOMM.PARAMETERS(0)
SETZE MYCOMM = NICHTS
In MYCOMM.CREATEPARAMETER(RETURN,2,4) hat jeder Parameter folgende Bedeutung:
Der erste Parameter (RETURE) ist der Parametername. Der Parametername kann beliebig festgelegt werden, im Allgemeinen sollte er jedoch mit dem im gespeicherten Prozess deklarierten Parameternamen identisch sein. Hier ist der Rückgabewert. Normalerweise setze ich ihn auf RETURE.
Der zweite Parameter (2) gibt den Datentyp des Parameters an. Die allgemeinen Typcodes finden Sie in der ADO-Referenz.
ADBIGINT: 20;
ADBINÄR: 128;
ADBOOLEAN: 11;
ADCHAR: 129;
ADDBTIMESTAMP: 135;
ADEMTY: 0;
ADINTEGER: 3;
ADSMALLINT: 2;
ADTINYINT: 16;
ADVARCHAR: 200;
Als Rückgabewert können nur ganzzahlige Werte verwendet werden, und -1 bis -99 sind reservierte Werte;
Der dritte Parameter (4) gibt die Art des Parameters an, wobei 4 angibt, dass es sich um einen Rückgabewert handelt. Die Beschreibung des Werts dieses Parameters lautet wie folgt:
0: Der Typ kann nicht bestimmt werden; 2: Eingabeparameter; 3: Eingabe- oder Ausgabeparameter;
Der oben angegebene ASP-Code sollte als vollständiger Code bezeichnet werden, dh als der komplexeste Code.
SET MYPARA = MYCOMM.CREATEPARAMETER(RETURN,2,4)
MYCOMM.PARAMETERS.APPEND MYPARA
kann vereinfacht werden zu
MYCOMM.PARAMETERS.APPEND MYCOMM.CREATEPARAMETER(RETURN,2,4)
Es kann sogar noch weiter vereinfacht werden, wie später erläutert wird.
Gespeicherte Prozeduren mit Parametern können nur über das COMMAND-Objekt aufgerufen werden (es gibt auch Informationen darüber, dass sie über das CONNECTION-Objekt oder RECORDSET-Objekt aufgerufen werden können, aber ich habe es nicht ausprobiert).
4. Gespeicherter Prozess mit Eingabeparametern und Ausgabeparametern
Der Rückgabewert ist eigentlich ein spezieller Ausgabeparameter. In den meisten Fällen verwenden wir einen gespeicherten Prozess, der sowohl Eingabe- als auch Ausgabeparameter hat. Beispielsweise möchten wir den Benutzernamen eines Benutzers mit einer bestimmten ID in der Benutzerinformationstabelle erhalten. ---Benutzer-ID und ein Ausgabeparameter----Benutzername. Der gespeicherte Prozess, der diese Funktion implementiert, lautet wie folgt:
/*SP4*/
PROZEDUR DBO.GETUSERNAME ERSTELLEN
@USERIDINT,
@USERNAME VARCHAR(40) AUSGABE
ALS
NOCOUNT EINSTELLEN
BEGINNEN
WENN @USERID NULL IST, RÜCKKEHR
SELECT @USERNAME=BENUTZERNAME
VON DBO.[USERINFO]
WO USERID=@USERID
ZURÜCKKEHREN
ENDE
GEHEN
Der ASP-Code, der den gespeicherten Prozess aufruft, lautet wie folgt:
'**Aufrufen eines gespeicherten Prozesses mit Eingabe- und Ausgabeparametern**
DIM MYCOMM,USERID,BENUTZERNAME
BENUTZERID=1
SET MYCOMM = SERVER.CREATEOBJECT(ADODB.COMMAND)
MYCOMM.ACTIVECONNECTION = MYCONSTR 'MYCONSTR ist die Datenbankverbindungszeichenfolge
MYCOMM.COMMANDTEXT = GETUSERNAME 'Geben Sie den Namen des gespeicherten Prozesses an
MYCOMM.COMMANDTYPE = 4 'Zeigt an, dass es sich um einen gespeicherten Prozess handelt
MYCOMM.PREPARED = TRUE 'Erfordert, dass SQL-Befehle zuerst kompiliert werden
'Parameter deklarieren
MYCOMM.PARAMETERS.APPEND MYCOMM.CREATEPARAMETER(@USERID,3,1,4,USERID)
MYCOMM.PARAMETERS.APPEND MYCOMM.CREATEPARAMETER(@USERNAME,200,2,40)
MYCOMM.EXECUTE
'Holen Sie sich die Parameter
BENUTZERNAME = MYCOMM(1)
SETZE MYCOMM = NICHTS
Im obigen Code können Sie sehen, dass im Gegensatz zur Deklaration eines Rückgabewerts bei der Deklaration von Eingabeparametern 5 Parameter und bei der Deklaration von Ausgabeparametern 4 Parameter erforderlich sind. Bei der Deklaration von Eingabeparametern sind die fünf Parameter: Parametername, Parameterdatentyp, Parametertyp, Datenlänge und Parameterwert. Bei der Deklaration eines Ausgabeparameters gibt es keinen letzten Parameter: den Parameterwert.
Besonderes Augenmerk sollte darauf gelegt werden: Bei der Deklaration von Parametern muss die Reihenfolge mit der im Speicherprozess definierten Reihenfolge übereinstimmen, und der Datentyp und die Länge jedes Parameters müssen mit denen im Speicherprozess übereinstimmen.
Wenn der gespeicherte Prozess mehrere Parameter hat, erscheint der ASP-Code umständlich. Sie können den Befehl WITH verwenden, um den Code zu vereinfachen:
'**Aufrufen eines gespeicherten Prozesses mit Eingabe- und Ausgabeparametern (vereinfachter Code)**
DIM MYCOMM,USERID,BENUTZERNAME
BENUTZERID=1
SET MYCOMM = SERVER.CREATEOBJECT(ADODB.COMMAND)
MIT MYCOMM
.ACTIVECONNECTION = MYCONSTR 'MYCONSTR ist die Datenbankverbindungszeichenfolge
.COMMANDTEXT = GETUSERNAME 'Geben Sie den Namen des gespeicherten Prozesses an
.COMMANDTYPE = 4 'Zeigt an, dass es sich um einen gespeicherten Prozess handelt
.PREPARED = TRUE 'Erfordert, dass zuerst SQL-Befehle kompiliert werden
.PARAMETERS.APPEND .CREATEPARAMETER(@USERID,3,1,4,USERID)
.PARAMETERS.APPEND .CREATEPARAMETER(@USERNAME,200,2,40)
.AUSFÜHREN
ENDE MIT
BENUTZERNAME = MYCOMM(1)
SETZE MYCOMM = NICHTS
Wenn wir die Benutzernamen von 10 Benutzern mit den IDs 1 bis 10 erhalten möchten, müssen wir dann COMMAND-Objekte 10 Mal erstellen? NEIN. Wenn Sie denselben gespeicherten Prozess mehrmals aufrufen müssen, ändern Sie einfach die Eingabeparameter und Sie erhalten eine andere Ausgabe:
'**Mehrere Aufrufe desselben gespeicherten Prozesses**
DIM MYCOMM,USERID,BENUTZERNAME
BENUTZERNAME=
SET MYCOMM = SERVER.CREATEOBJECT(ADODB.COMMAND)
FÜR USERID = 1 BIS 10
MIT MYCOMM
.ACTIVECONNECTION = MYCONSTR 'MYCONSTR ist die Datenbankverbindungszeichenfolge
.COMMANDTEXT = GETUSERNAME 'Geben Sie den Namen des gespeicherten Prozesses an
.COMMANDTYPE = 4 'Zeigt an, dass es sich um einen gespeicherten Prozess handelt
.PREPARED = TRUE 'Erfordert, dass zuerst SQL-Befehle kompiliert werden
WENN USERID = 1 DANN
.PARAMETERS.APPEND .CREATEPARAMETER(@USERID,3,1,4,USERID)
.PARAMETERS.APPEND .CREATEPARAMETER(@USERNAME,200,2,40)
.AUSFÜHREN
ANDERS
'Weisen Sie den Eingabeparametern Werte zu (Eingabeparameter und Ausgabeparameter, deren Parameterwerte sich zu diesem Zeitpunkt nicht ändern, müssen nicht erneut deklariert werden)
.PARAMETERS(@USERID) = USERID
.AUSFÜHREN
ENDE WENN
ENDE MIT
USERNAME = USERNAME + MYCOMM(1) + , 'Vielleicht möchten Sie Array-Speicher verwenden
NÄCHSTE
SETZE MYCOMM = NICHTS
Wie aus dem obigen Code ersichtlich ist: Wenn Sie denselben gespeicherten Prozess wiederholt aufrufen, müssen Sie nur die Eingabeparameter neu zuweisen, deren Werte sich geändert haben. Diese Methode verfügt über mehrere Eingabe- und Ausgabeparameter und es wird jeweils nur ein Eingabeparameterwert aufgerufen Bei Änderungen kann die Codemenge erheblich reduziert werden.
5. Ein gespeicherter Prozess mit gleichzeitigen Rückgabewerten, Eingabeparametern und Ausgabeparametern
Wie bereits erwähnt, muss beim Aufruf eines gespeicherten Prozesses die Reihenfolge, in der Parameter deklariert werden, mit der im gespeicherten Prozess definierten Reihenfolge übereinstimmen. Ein weiterer Punkt, auf den Sie besonders achten sollten: Wenn der gespeicherte Prozess sowohl einen Rückgabewert als auch Eingabe- und Ausgabeparameter hat, muss der Rückgabewert zuerst deklariert werden.
Um die aufrufende Methode in diesem Fall zu demonstrieren, verbessern wir das obige Beispiel. Rufen Sie weiterhin den Benutzernamen des Benutzers mit der ID 1 ab, aber es ist möglich, dass der Benutzer ihn nicht hat (der Benutzer wurde gelöscht und USERID ist ein sich selbst erhöhendes Feld). Der gespeicherte Prozess gibt unterschiedliche Werte zurück, je nachdem, ob der Benutzer ihn hat oder nicht. Zu diesem Zeitpunkt lauten der gespeicherte Prozess und der ASP-Code wie folgt:
/*SP5*/
PROZEDUR DBO.GETUSERNAME ERSTELLEN
--Um den Eindruck der Reihenfolge zu vertiefen, kehren Sie die Definitionsreihenfolge der folgenden beiden Parameter um.
@USERNAME VARCHAR(40) AUSGABE,
@USERIDINT
ALS
NOCOUNT EINSTELLEN
BEGINNEN
WENN @USERID NULL IST, RÜCKKEHR
SELECT @USERNAME=BENUTZERNAME
VON DBO.[USERINFO]
WO USERID=@USERID
WENN @@ROWCOUNT>0
RÜCKKEHR 1
ANDERS
RÜCKKEHR 0
ZURÜCKKEHREN
ENDE
GEHEN
'**Rufen Sie einen gespeicherten Prozess mit Rückgabewert, Eingabeparametern und Ausgabeparametern auf**
DIM MYCOMM,USERID,BENUTZERNAME
BENUTZERID=1
SET MYCOMM = SERVER.CREATEOBJECT(ADODB.COMMAND)
MIT MYCOMM
.ACTIVECONNECTION = MYCONSTR 'MYCONSTR ist die Datenbankverbindungszeichenfolge
.COMMANDTEXT = GETUSERNAME 'Geben Sie den Namen des gespeicherten Prozesses an
.COMMANDTYPE = 4 'Zeigt an, dass es sich um einen gespeicherten Prozess handelt
.PREPARED = TRUE 'Erfordert, dass zuerst SQL-Befehle kompiliert werden
'Der Rückgabewert muss zuerst deklariert werden
.PARAMETERS.APPEND .CREATEPARAMETER(RETURN,2,4)
'Auch die Deklarationsreihenfolge der folgenden beiden Parameter wird entsprechend umgekehrt.
.PARAMETERS.APPEND .CREATEPARAMETER(@USERNAME,200,2,40)
.PARAMETERS.APPEND .CREATEPARAMETER(@USERID,3,1,4,USERID)
.AUSFÜHREN
ENDE MIT
WENN MYCOMM(0) = 1 DANN
BENUTZERNAME = MYCOMM(1)
ANDERS
USERNAME = Dieser Benutzer hat nicht
ENDE WENN
SETZE MYCOMM = NICHTS
6. Gespeicherter Prozess, der gleichzeitig Parameter und Recordset zurückgibt
Manchmal muss der Speicherprozess gleichzeitig Parameter und Datensatzsätze zurückgeben. Wenn wir den Speicherprozess beispielsweise für Paging verwenden, müssen wir gleichzeitig Parameter wie Datensatzsätze und das Gesamtdatenvolumen zurückgeben. Das Folgende ist ein gespeicherter Prozess für Paging:
/*SP6*/
PROZEDUR DBO.GETUSERLIST ERSTELLEN
@IPAGECOUNT INT OUTPUT, – Gesamtzahl der Seiten
@IPAGE INT, --Aktuelle Seitennummer
@IPAGESIZE INT – Anzahl der Datensätze pro Seite
ALS
NOCOUNT EINSTELLEN
BEGINNEN
--Temporäre Tabelle erstellen
CREATE TABLE #T (ID INT IDENTITY, --auto-increment-Feld
BENUTZERID INT,
BENUTZERNAME VARCHAR(40))
--Daten in temporäre Tabelle schreiben
IN #T EINFÜGEN
WÄHLEN SIE BENUTZER-ID, BENUTZERNAME VON DBO.[USERINFO]
NACH BENUTZER-ID BESTELLEN
--Ermitteln Sie die Gesamtzahl der Datensätze
DECLARE @IRECORDCOUNT INT
SET @IRECORDCOUNT = @@ROWCOUNT
--Bestimmen Sie die Gesamtzahl der Seiten
WENN @IRECORDCOUNT%@IPAGESIZE=0
SET @IPAGECOUNT=CEILING(@IRECORDCOUNT/@IPAGESIZE)
ANDERS
SET @IPAGECOUNT=CEILING(@IRECORDCOUNT/@IPAGESIZE)+1
--Wenn die angeforderte Seitenzahl größer als die Gesamtseitenzahl ist, wird die letzte Seite angezeigt
WENN @IPAGE > @IPAGECOUNT
SELECT @IPAGE = @IPAGECOUNT
--Bestimmen Sie die Anfangs- und Enddatensätze der aktuellen Seite
DECLARE @ISTART INT --START RECORD
DECLARE @IEND INT --END RECORD
SELECT @ISTART = (@IPAGE - 1) * @IPAGESIZE
SELECT @IEND = @ISTART + @IPAGESIZE + 1
--Holen Sie sich den aktuellen Seitendatensatz
SELECT * FROM #T WHERE ID>@ISTART AND ID<@IEND
--Temporäre Tabelle löschen
DROP TABLE #T
--Gibt die Gesamtzahl der Datensätze zurück
RÜCKKEHR @IRECORDCOUNT
ENDE
GEHEN
Geben Sie im obigen Speichervorgang die aktuelle Seitennummer und die Anzahl der Datensätze pro Seite ein und geben Sie den Datensatzsatz der aktuellen Seite, die Gesamtzahl der Seiten und die Gesamtzahl der Datensätze zurück. Typischer ausgedrückt wird die Gesamtzahl der Datensätze als Rückgabewert zurückgegeben. Das Folgende ist der ASP-Code, der den gespeicherten Prozess aufruft (der spezifische Paging-Vorgang wird weggelassen):
'**Anruf-Paging-Speicherprozess**
DIM PAGENOW, PAGESIZE, PAGECOUNT, RECORDCOUNT
DIM MYCOMM,MYRST
PAGENOW = REQUEST(PN)
'Benutzerdefinierte Funktion zur Überprüfung natürlicher Zahlen
WENN CHECKNAR(PAGENOW) = FALSE, DANN PAGENOW = 1
SEITENGRÖSSE = 20
SET MYCOMM = SERVER.CREATEOBJECT(ADODB.COMMAND)
MIT MYCOMM
.ACTIVECONNECTION = MYCONSTR 'MYCONSTR ist die Datenbankverbindungszeichenfolge
.COMMANDTEXT = GETUSERLIST 'Geben Sie den Namen des gespeicherten Prozesses an
.COMMANDTYPE = 4 'Zeigt an, dass es sich um einen gespeicherten Prozess handelt
.PREPARED = TRUE 'Erfordert, dass zuerst SQL-Befehle kompiliert werden
'Rückgabewert (Gesamtzahl der Datensätze)
.PARAMETERS.APPEND .CREATEPARAMETER(RETURN,2,4)
'Ausgabeparameter (Gesamtzahl der Seiten)
.PARAMETERS.APPEND .CREATEPARAMETER(@IPAGECOUNT,3,2)
'Eingabeparameter (aktuelle Seitennummer)
.PARAMETERS.APPEND .CREATEPARAMETER(@IPAGE,3,1,4,PAGENOW)
'Eingabeparameter (Anzahl Datensätze pro Seite)
.PARAMETERS.APPEND .CREATEPARAMETER(@IPAGESIZE,3,1,4,PAGESIZE)
SET MYRST = .EXECUTE
ENDE MIT
IF MYRST.STATE = 0 THEN 'Es wurden keine Daten abgerufen, MYRST ist geschlossen
RECORDCOUNT = -1
ANDERS
MYRST.CLOSE 'Hinweis: Um Parameterwerte zu erhalten, müssen Sie zuerst das Recordset-Objekt schließen
RECORDCOUNT = MYCOMM(0)
PAGECOUNT = MYCOMM(1)
WENN CINT(PAGENOW)>=CINT(PAGECOUNT), DANN PAGENOW=PAGECOUNT
ENDE WENN
SETZE MYCOMM = NICHTS
'Datensätze unten anzeigen
WENN RECORDCOUNT = 0 DANN
RESPONSE.WRITE Kein Datensatz
ELSEIF RECORDCOUNT > 0 THEN
MYRSTE.ÖFFNEN
TUN BIS MYRST.EOF
...
SCHLEIFE
'Im Folgenden werden Paging-Informationen angezeigt
...
ELSE 'RECORDCOUNT=-1
RESPONSE.WRITE-Parameterfehler
ENDE WENN
In Bezug auf den obigen Code muss nur ein Punkt erklärt werden: Wenn Sie das Recordset und die Parameter gleichzeitig zurückgeben und die Parameter erhalten möchten, müssen Sie zuerst das Recordset schließen und es dann öffnen, wenn Sie es verwenden Datensatz.
7. Gespeicherter Prozess, der mehrere Recordsets zurückgibt
In diesem Artikel wird zunächst der gespeicherte Prozess vorgestellt, der ein Recordset zurückgibt. Manchmal muss ein gespeicherter Prozess mehrere Datensatzsätze zurückgeben. Wie können diese Datensatzsätze in ASP gleichzeitig abgerufen werden? Um dieses Problem zu veranschaulichen, fügen Sie der USERINFO-Tabelle zwei Felder hinzu: USERTEL und USERMAIL, und legen Sie fest, dass nur angemeldete Benutzer diese beiden Inhalte anzeigen können.
/*SP7*/
PROZEDUR DBO.GETUSERINFO ERSTELLEN
@USERIDINT,
@CHECKLOGIN-BIT
ALS
NOCOUNT EINSTELLEN
BEGINNEN
WENN @USERID NULL IST ODER @CHECKLOGIN NULL IST, RETURN
BENUTZERNAME AUSWÄHLEN
VON DBO.[USRINFO]
WO USERID=@USERID
--Wenn Sie ein angemeldeter Benutzer sind, nehmen Sie USERTEL und USERMAIL
WENN @CHECKLOGIN=1
WÄHLEN SIE BENUTZERTEL, BENUTZERMAIL
VON DBO.[USERINFO]
WO USERID=@USERID
ZURÜCKKEHREN
ENDE
GEHEN
Das Folgende ist der ASP-Code:
'**Rufen Sie einen gespeicherten Prozess auf, der mehrere Recordsets zurückgibt**
DIM CHECKLG, USERID, USERNAME, USERTEL, USERMAIL
DIM MYCOMM,MYRST
BENUTZERID=1
'CHECKLOGIN() ist eine benutzerdefinierte Funktion, um festzustellen, ob der Besucher angemeldet ist
CHECKLG = CHECKLOGIN()
SET MYCOMM = SERVER.CREATEOBJECT(ADODB.COMMAND)
MIT MYCOMM
.ACTIVECONNECTION = MYCONSTR 'MYCONSTR ist die Datenbankverbindungszeichenfolge
.COMMANDTEXT = GETUSERINFO 'Geben Sie den Namen des gespeicherten Prozesses an
.COMMANDTYPE = 4 'Zeigt an, dass es sich um einen gespeicherten Prozess handelt
.PREPARED = TRUE 'Erfordert, dass zuerst SQL-Befehle kompiliert werden
.PARAMETERS.APPEND .CREATEPARAMETER(@USERID,3,1,4,USERID)
.PARAMETERS.APPEND .CREATEPARAMETER(@CHECKLOGIN,11,1,1,CHECKLG)
SET MYRST = .EXECUTE
ENDE MIT
SETZE MYCOMM = NICHTS
'Erhalten Sie den Wert aus dem ersten Datensatz
BENUTZERNAME = MYRST(0)
'Holen Sie sich den Wert aus dem zweiten Datensatz
WENN NICHT, IST MYRST NICHTS, DANN
SET MYRST = MYRST.NEXTRECORDSET()
USERTEL = MYRST(0)
USERMAIL = MYRST(1)
ENDE WENN
SETZE MYRST = NICHTS
Im obigen Code wird die NEXTRECORDSET-Methode des RECORDSET-Objekts verwendet, um mehrere vom Speicherprozess zurückgegebene Datensatzsätze abzurufen.
Bisher hat dieser Artikel eine relativ umfassende Erklärung verschiedener Situationen gegeben, in denen ASP gespeicherte Prozesse aufruft. Lassen Sie uns abschließend über die verschiedenen Methoden zum Aufrufen mehrerer gespeicherter Prozesse in einem ASP-Programm sprechen.
In einem ASP-Programm sind mindestens die folgenden drei Methoden möglich, um mehrere gespeicherte Prozesse aufzurufen:
1. Erstellen Sie mehrere COMMAND-Objekte
DIMMYCOMM
SET MYCOMM = SERVER.CREATEOBJECT(ADODB.COMMAND)
'Rufen Sie den gespeicherten Prozess eins auf
...
SETZE MYCOMM = NICHTS
SET MYCOMM = SERVER.CREATEOBJECT(ADODB.COMMAND)
„Rufen Sie den gespeicherten Prozess zwei auf.“
...
SETZE MYCOMM = NICHTS
...
2. Erstellen Sie nur ein COMMAND-Objekt und löschen Sie seine Parameter, wenn Sie einen Anruf beenden.
DIMMYCOMM
SET MYCOMM = SERVER.CREATEOBJECT(ADODB.COMMAND)
'Rufen Sie den gespeicherten Prozess eins auf
.....
'Parameter löschen (vorausgesetzt, es gibt drei Parameter)
MYCOMM.PARAMETERS.DELETE 2
MYCOMM.PARAMETERS.DELETE 1
MYCOMM.PARAMETERS.DELETE 0
'Rufen Sie den gespeicherten Prozess zwei auf und löschen Sie die Parameter
...
SETZE MYCOMM = NICHTS
Bitte beachten Sie zu diesem Zeitpunkt: Die Reihenfolge beim Löschen der Parameter ist entgegengesetzt zur Reihenfolge bei der Parameterdeklaration. Ich kenne den Grund nicht.
3. Verwenden Sie die REFRESH-Methode der PARAMETERS-Datensammlung, um das PARAMETER-Objekt zurückzusetzen
DIMMYCOMM
SET MYCOMM = SERVER.CREATEOBJECT(ADODB.COMMAND)
'Rufen Sie den gespeicherten Prozess eins auf
.....
'Alle PARAMETER-Objekte zurücksetzen, die in der PARAMETERS-Datensammlung enthalten sind
MYCOMM.PARAMETERS.REFRESH
„Rufen Sie den gespeicherten Prozess zwei auf.“
.....
SETZE MYCOMM = NICHTS
Es wird allgemein angenommen, dass das wiederholte Erstellen von Objekten eine weniger effiziente Methode ist, aber nach dem Testen (das Testtool ist MICROSOFT APPLICATION CENTER TEST) sind die Ergebnisse unerwartet:
Methode 2 >= Methode 1 >> Methode 3
Die Laufgeschwindigkeit von Methode 2 ist größer oder gleich der von Methode 1 (bis zu etwa 4 % höher) als die von Methode 3 (bis zu 130 %). Methode 1, wenn viele Parameter vorhanden sind. Wenn nicht, verwenden Sie Methode 2.
Es hat einen Tag gedauert, bis ich endlich einige meiner oberflächlichen Erfahrungen beim Aufruf gespeicherter Prozeduren in ASP niedergeschrieben habe. Bei manchen davon kenne ich nur die Wirkung, aber nicht die Ursache, und bei manchen mag es falsch sein, aber das ist alles das Ergebnis meiner persönlichen Praxis. Bitte nehmen Sie es kritisch hin, liebe Leser. Wenn Sie anderer Meinung sind, lassen Sie es mich bitte wissen. Vielen Dank im Voraus.