Es gibt viele Artikel über ASP und gespeicherte Prozeduren (Stored Procedures), aber ich bezweifle, dass die Autoren sie tatsächlich praktiziert haben. Als ich ein Anfänger war, habe ich viele relevante Informationen konsultiert und festgestellt, dass viele der angebotenen Methoden in der Praxis nicht dieselben waren. Für einfache Anwendungen können diese Materialien hilfreich sein, sie sind jedoch darauf beschränkt, da sie grundsätzlich gleich sind und sich gegenseitig kopieren. Bei etwas komplexeren Anwendungen sind sie alle unklar.
Nun greife ich grundsätzlich auf SQL Server zu, indem ich gespeicherte Prozeduren aufrufe. Obwohl nicht garantiert werden kann, dass der folgende Text absolut korrekt ist, hoffe ich, dass er für alle hilfreich ist.
Bei einer gespeicherten Prozedur handelt es sich um einen oder mehrere SQL-Befehle, die als ausführbare Objekte in der Datenbank gespeichert sind.
Definitionen sind immer abstrakt. Eine gespeicherte Prozedur 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 gespeicherte Prozeduren erstellen und gespeicherte Prozeduren 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 der gespeicherten Prozedur selbst ist sehr hoch, und der Aufruf der gespeicherten Prozedur 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 Prozeduren im Allgemeinen über das Befehlsobjekt aufgerufen. Abhängig von der Situation werden in diesem Artikel auch andere Aufrufmethoden vorgestellt. Zur Vereinfachung der Erklärung werden die folgenden einfachen Klassifizierungen entsprechend der Eingabe und Ausgabe des gespeicherten Prozesses vorgenommen:
1. Eine gespeicherte Prozedur, die nur einen einzigen Datensatz zurückgibt
Angenommen, es gibt die folgende gespeicherte Prozedur (der Zweck dieses Artikels besteht nicht darin, die T-SQL-Syntax zu beschreiben, daher gibt die gespeicherte Prozedur nur den Code ohne Erklärung an):
/*SP1*/
PROZEDUR ERSTELLEN dbo.getUserList
als
nocount einschalten
beginnen
Wählen Sie * aus dbo.[Benutzerinfo]
Ende
von go
ruft alle Datensätze in der Benutzerinfo-Tabelle ab und gibt einen Datensatz zurück. Der ASP-Code zum Aufrufen der gespeicherten Prozedur über das Befehlsobjekt lautet wie folgt:
„**Aufrufen der gespeicherten Prozedur über das Befehlsobjekt**
DIM MyComm,MyRst
Setze MyComm = Server.CreateObject("ADODB.Command")
MyComm.ActiveConnection = MyConStr 'MyConStr ist die Datenbankverbindungszeichenfolge
MyComm.CommandText = "getUserList" 'Geben Sie den Namen der gespeicherten Prozedur an
MyComm.CommandType = 4 'Zeigt an, dass es sich um eine gespeicherte Prozedur handelt
MyComm.Prepared = true 'Erfordert, dass zuerst SQL-Befehle kompiliert werden
Setzen Sie MyRst = MyComm.Execute
Set MyComm = Nothing
Der durch die gespeicherte Prozedur erhaltene Datensatz wird MyRst zugewiesen. Als nächstes kann MyRst bedient werden.
Im obigen Code gibt das CommandType-Attribut den Typ der Anforderung 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 CommandText-Parameter ein vorhandener Tabellenname ist
4 Gibt an, dass der CommandText-Parameter der Name einer gespeicherten Prozedur ist
. Die gespeicherte Prozedur kann auch über das Connection-Objekt oder Recordset-Objekt aufgerufen werden. Die Methoden lauten wie folgt:
„**Rufen Sie die gespeicherte Prozedur über das Connection-Objekt auf.“
DIM MyConn,MyRst
Setze 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 = Nothing
'**Gespeicherte Prozedur über Recordset-Objekt aufrufen**
DIM MyRst
Setze 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. Gespeicherte Prozeduren ohne Eingabe und Ausgabe
Bitte sehen Sie sich die folgende gespeicherte Prozedur an:
/*SP2*/
PROZEDUR ERSTELLEN dbo.delUserAll
als
nocount einschalten
beginnen
aus dbo löschen.[Benutzerinfo]
Ende
„go“
löscht alle Datensätze in der Benutzerinfo-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:
„** Rufen Sie die gespeicherte Prozedur über den Befehl auf Objekt**
DIM MyComm
Setze MyComm = Server.CreateObject("ADODB.Command")
MyComm.ActiveConnection = MyConStr 'MyConStr ist die Datenbankverbindungszeichenfolge
MyComm.CommandText = "delUserAll" 'Geben Sie den Namen der gespeicherten Prozedur an
MyComm.CommandType = 4 'Zeigt an, dass es sich um eine gespeicherte Prozedur handelt
MyComm.Prepared = true 'Erfordert, dass zuerst SQL-Befehle kompiliert werden
MyComm.Execute 'Der Datensatz muss hier nicht abgerufen werden
Set MyComm = Nothing
Natürlich können solche gespeicherten Prozeduren auch über das Connection-Objekt oder Recordset-Objekt aufgerufen werden, aber das Recordset-Objekt wird erstellt, um das Recordset abzurufen. Wenn das Recordset nicht zurückgegeben wird, ist es besser, das Command-Objekt zu verwenden.
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 benötigen wir möglicherweise die gespeicherte Prozedur, um den Ausführungsstatus zurückzugeben. Ändern Sie dazu SP2 wie folgt:
/*SP3*/.
PROZEDUR ERSTELLEN dbo.delUserAll
als
nocount einschalten
beginnen
TRANSAKTION BEGINNEN
aus dbo löschen.[Benutzerinfo]
WENN @@error=0
beginnen
COMMIT-TRANSAKTION
Rückkehr 1
Ende
ANDERS
beginnen
ROLLBACK-TRANSAKTION
0 zurückgeben
Ende
zurückkehren
Ende
go
gibt 1 zurück, wenn der Löschvorgang erfolgreich ausgeführt wurde, andernfalls gibt sie 0 zurück und führt einen Rollback-Vorgang aus. Um den Rückgabewert in ASP zu erhalten, müssen Sie die Parametersammlung verwenden, um die Parameter zu deklarieren:
„**Rufen Sie die gespeicherte Prozedur mit dem Rückgabewert auf und erhalten Sie den Rückgabewert**
DIM MyComm, MyPara
Setze MyComm = Server.CreateObject("ADODB.Command")
MyComm.ActiveConnection = MyConStr 'MyConStr ist die Datenbankverbindungszeichenfolge
MyComm.CommandText = "delUserAll" 'Geben Sie den Namen der gespeicherten Prozedur an
MyComm.CommandType = 4 'Zeigt an, dass es sich um eine gespeicherte Prozedur handelt
MyComm.Prepared = true 'Erfordert, dass zuerst SQL-Befehle kompiliert werden
'Rückgabewert deklarieren
Setze 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 = Nothing
In MyComm.CreateParameter("RETURN",2,4) ist die Bedeutung jedes Parameters wie folgt:
Der erste Parameter („RETURE“) ist der Parametername. Der Parametername kann beliebig festgelegt werden, im Allgemeinen sollte er jedoch mit dem in der gespeicherten Prozedur deklarierten Parameternamen identisch sein. Hier ist der Rückgabewert, ich setze ihn normalerweise 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;
adEmpty: 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; 1: Eingabeparameter; 3: Eingabe- oder Ausgabeparameter;
Der oben angegebene ASP-Code sollte als vollständiger Code bezeichnet werden; Tatsächlich
ist Set Mypara = MyComm.CreateParameter("RETURN",2,
MyComm.Parameters.Append MyPara
kann zu
MyComm.Parameters.Append MyComm.CreateParameter("RETURN",2,4)
vereinfacht werdenund kann sogar weiter vereinfacht werden, was 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. Gespeicherte Prozeduren mit Eingabeparametern und Ausgabeparametern
Der Rückgabewert ist eigentlich ein spezieller Ausgabeparameter. In den meisten Fällen verwenden wir gespeicherte Prozeduren, die sowohl Eingabe- als auch Ausgabeparameter haben. Beispielsweise möchten wir den Benutzernamen eines Benutzers mit einer bestimmten ID in der Benutzerinformationstabelle erhalten. --user ID und ein Ausgabeparameter----user name. Die gespeicherte Prozedur zum Implementieren dieser Funktion lautet wie folgt:
/*SP4*/
PROZEDUR ERSTELLEN dbo.getUserName
@UserID int,
@UserName varchar(40)-Ausgabe
als
nocount einschalten
beginnen
wenn @UserID null ist, Rückgabe
Wählen Sie @UserName=Benutzername
von dbo.[Benutzerinfo]
wobei userid=@UserID
zurückkehren
Ende
den Aufruf
der gespeicherten Prozedur lautet wie folgt:
„**Eine gespeicherte Prozedur mit Eingabe- und Ausgabeparametern aufrufen**
DIM MyComm,Benutzer-ID,Benutzername
Benutzer-ID = 1
Setze MyComm = Server.CreateObject("ADODB.Command")
MyComm.ActiveConnection = MyConStr 'MyConStr ist die Datenbankverbindungszeichenfolge
MyComm.CommandText = "getUserName" 'Geben Sie den Namen der gespeicherten Prozedur an
MyComm.CommandType = 4 'Zeigt an, dass es sich um eine gespeicherte Prozedur handelt
MyComm.Prepared = true 'Erfordert, dass zuerst SQL-Befehle 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)
Set MyComm = Nothing
Im obigen Code können Sie sehen, dass im Gegensatz zur Deklaration des 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: Beim Deklarieren von Parametern muss die Reihenfolge mit der in der gespeicherten Prozedur definierten Reihenfolge übereinstimmen, und der Datentyp und die Länge jedes Parameters müssen ebenfalls mit denen übereinstimmen, die in der gespeicherten Prozedur definiert sind.
Wenn die gespeicherte Prozedur mehrere Parameter hat, erscheint der ASP-Code umständlich. Sie können den Befehl with verwenden, um den Code zu vereinfachen:
„**Eine gespeicherte Prozedur mit Eingabe- und Ausgabeparametern aufrufen (vereinfachter Code)**.“
DIM MyComm,Benutzer-ID,Benutzername
Benutzer-ID = 1
Setze MyComm = Server.CreateObject("ADODB.Command")
mitMyComm
.ActiveConnection = MyConStr 'MyConStr ist die Datenbankverbindungszeichenfolge
.CommandText = "getUserName" 'Geben Sie den Namen der gespeicherten Prozedur an
.CommandType = 4 'Zeigt an, dass es sich um eine gespeicherte Prozedur 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
Schluss mit
Benutzername = MyComm(1)
Setze MyComm = Nothing
Wenn wir die Benutzernamen von 10 Benutzern mit den IDs 1 bis 10 erhalten möchten, müssen wir das Command-Objekt dann 10 Mal erstellen? NEIN. Wenn Sie dieselbe gespeicherte Prozedur mehrmals aufrufen müssen, ändern Sie einfach die Eingabeparameter und Sie erhalten unterschiedliche Ausgaben:
„**Mehrere Aufrufe derselben gespeicherten Prozedur**
DIM MyComm,Benutzer-ID,Benutzername
Benutzername = ""
Setze MyComm = Server.CreateObject("ADODB.Command")
für UserID = 1 bis 10
mitMyComm
.ActiveConnection = MyConStr 'MyConStr ist die Datenbankverbindungszeichenfolge
.CommandText = "getUserName" 'Geben Sie den Namen der gespeicherten Prozedur an
.CommandType = 4 'Zeigt an, dass es sich um eine gespeicherte Prozedur 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") = BenutzerID
.Ausführen
Ende wenn
Schluss mit
UserName = UserName + MyComm(1) + "," 'Vielleicht möchten Sie Array-Speicher verwenden
nächste
Set MyComm = Nothing
Wie aus dem obigen Code ersichtlich ist: Wenn Sie dieselbe gespeicherte Prozedur 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 nur einer aufgerufen Jedes Mal kann die Codemenge erheblich reduziert werden, wenn sich der Wert des Eingabeparameters ändert.
5. Gespeicherte Prozeduren mit gleichzeitigen Rückgabewerten, Eingabeparametern und Ausgabeparametern
Wie bereits erwähnt, muss beim Aufruf einer gespeicherten Prozedur die Reihenfolge, in der Parameter deklariert werden, mit der in der gespeicherten Prozedur definierten Reihenfolge übereinstimmen. Ein weiterer Punkt, auf den Sie besonders achten sollten: Wenn die gespeicherte Prozedur 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. Erhalten Sie weiterhin den Benutzernamen des Benutzers mit der ID 1, aber es ist möglich, dass der Benutzer nicht existiert (der Benutzer wurde gelöscht und die Benutzer-ID ist ein sich selbst erhöhendes Feld). Die gespeicherte Prozedur gibt unterschiedliche Werte zurück, je nachdem, ob der Benutzer existiert oder nicht. Zu diesem Zeitpunkt lauten die gespeicherte Prozedur und der ASP-Code wie folgt:
/*SP5*/
PROZEDUR ERSTELLEN dbo.getUserName
--Um den Eindruck von „Ordnung“ zu vertiefen, kehren Sie die Definitionsreihenfolge der folgenden beiden Parameter um.
@UserName varchar(40) Ausgabe,
@UserID int
als
nocount einschalten
beginnen
wenn @UserID null ist, Rückgabe
Wählen Sie @UserName=Benutzername
von dbo.[Benutzerinfo]
wobei userid=@UserID
wenn @@rowcount>0
Rückkehr 1
anders
0 zurückgeben
zurückkehren
Ende
go
'**Eine gespeicherte Prozedur mit Rückgabewert, Eingabeparametern und Ausgabeparametern aufrufen**
DIM MyComm,Benutzer-ID,Benutzername
Benutzer-ID = 1
Setze MyComm = Server.CreateObject("ADODB.Command")
mitMyComm
.ActiveConnection = MyConStr 'MyConStr ist die Datenbankverbindungszeichenfolge
.CommandText = "getUserName" 'Geben Sie den Namen der gespeicherten Prozedur an
.CommandType = 4 'Zeigt an, dass es sich um eine gespeicherte Prozedur 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
Schluss mit
wenn MyComm(0) = 1 dann
Benutzername = MyComm(1)
anders
Benutzername = „Dieser Benutzer existiert nicht“
Ende wenn
Setzen Sie MyComm = Nothing
6. Gespeicherte Prozedur, die gleichzeitig Parameter und Recordset zurückgibt
Manchmal benötigen wir die gespeicherte Prozedur, um gleichzeitig Parameter und Datensatzsätze zurückzugeben. Wenn wir beispielsweise gespeicherte Prozeduren für Paging verwenden, müssen wir gleichzeitig Parameter wie Datensatzsätze und die Gesamtdatenmenge zurückgeben. Das Folgende ist eine gespeicherte Prozedur für Paging:
/*SP6*/
PROZEDUR ERSTELLEN dbo.getUserList
@iPageCount int OUTPUT, --Gesamtzahl der Seiten
@iPage int, --Aktuelle Seitennummer
@iPageSize int – Anzahl der Datensätze pro Seite
als
nocount einschalten
beginnen
--Temporäre Tabelle erstellen
Tabelle erstellen #t (ID int IDENTITY, --auto-increment-Feld
Benutzer-ID int,
Benutzername varchar(40))
--Daten in temporäre Tabelle schreiben
in #t einfügen
Wählen Sie Benutzer-ID und Benutzernamen von dbo aus.[UserInfo]
Nach Benutzer-ID sortieren
– Ermitteln Sie die Gesamtzahl der Datensätze
deklariere @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 Gesamtzahl der Seiten ist, wird die letzte Seite angezeigt
WENN @iPage > @iPageCount
SELECT @iPage = @iPageCount
– Bestimmen Sie den Anfang und das Ende 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
Wählen Sie * aus #t aus, wobei ID>@iStart und ID<@iEnd
– Temporäre Tabelle löschen
DROP TABLE #t
– gibt die Gesamtzahl der Datensätze zurück
gib @iRecordCount zurück
Ende
In der oben gespeicherten Prozedur
gibtgo
die aktuelle Seitennummer und die Anzahl der Datensätze pro Seite ein und gibt den Datensatz 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 die gespeicherte Prozedur aufruft (der spezifische Paging-Vorgang wird weggelassen):
'**Rufen Sie die gespeicherte Paging-Prozedur auf**
DIM pagenow, seitengröße, seitenzahl, datensatzzahl
DIM MyComm,MyRst
pagenow = Request("pn")
'Benutzerdefinierte Funktion zur Überprüfung natürlicher Zahlen
Wenn CheckNar(pagenow) = false, dann ist pagenow = 1
Seitengröße = 20
Setze MyComm = Server.CreateObject("ADODB.Command")
mitMyComm
.ActiveConnection = MyConStr 'MyConStr ist die Datenbankverbindungszeichenfolge
.CommandText = "getUserList" 'Geben Sie den Namen der gespeicherten Prozedur an
.CommandType = 4 'Zeigt an, dass es sich um eine gespeicherte Prozedur 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)
SetMyRst = .Execute
Schluss mit
Wenn MyRst.state = 0, dann „Es wurden keine Daten abgerufen, MyRst ist geschlossen.“
Datensatzanzahl = -1
anders
MyRst.close 'Hinweis: Um Parameterwerte zu erhalten, müssen Sie zuerst das Recordset-Objekt schließen
Datensatzanzahl = MyComm(0)
Seitenanzahl = MyComm(1)
Wenn cint(pagenow)>=cint(pagecount), dann pagenow=pagecount
Ende wenn
Setze MyComm = Nothing
'Datensätze unten anzeigen
wenn recordcount = 0 dann
Response.Write „Kein Datensatz“
Sonst, wenn Datensatzanzahl > 0, dann
MyRst.open
tun bis MyRst.EOF
...
Schleife
'Im Folgenden werden Paging-Informationen angezeigt
...
sonst 'recordcount=-1
Response.Write „Parameterfehler“
end if
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 Verwenden des Recordsets.
7. Gespeicherte Prozedur, die mehrere Datensatzsätze zurückgibt
Das erste, was in diesem Artikel vorgestellt wird, ist die gespeicherte Prozedur, die ein Recordset zurückgibt. Manchmal ist eine gespeicherte Prozedur erforderlich, um mehrere Datensatzsätze in ASP zurückzugeben. Wie erhält man diese Datensatzsätze gleichzeitig? Um dieses Problem zu veranschaulichen, fügen Sie der Tabelle „userinfo“ zwei Felder hinzu: „usertel“ und „usermail“ und legen Sie fest, dass nur angemeldete Benutzer diese beiden Inhalte anzeigen können.
/*SP7*/
PROZEDUR ERSTELLEN dbo.getUserInfo
@userid int,
@checklogin-Bit
als
nocount einschalten
beginnen
Wenn @userid null oder @checklogin null ist, wird zurückgegeben
Benutzernamen auswählen
von dbo.[usrinfo]
wobei userid=@userid
--Wenn Sie ein angemeldeter Benutzer sind, nehmen Sie Usertel und Usermail
wenn @checklogin=1
Wählen Sie usertel,usermail
von dbo.[Benutzerinfo]
wobei userid=@userid
zurückkehren
Ende
Folgende
ist der ASP-Code:
„**Rufen Sie eine gespeicherte Prozedur auf, die mehrere Recordsets zurückgibt**
DIM checklg,UserID,UserName,UserTel,UserMail
DIM MyComm,MyRst
Benutzer-ID = 1
'checklogin() ist eine benutzerdefinierte Funktion, um festzustellen, ob der Besucher angemeldet ist
checklg = checklogin()
Setze MyComm = Server.CreateObject("ADODB.Command")
mitMyComm
.ActiveConnection = MyConStr 'MyConStr ist die Datenbankverbindungszeichenfolge
.CommandText = "getUserInfo" 'Geben Sie den Namen der gespeicherten Prozedur an
.CommandType = 4 'Zeigt an, dass es sich um eine gespeicherte Prozedur 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)
SetMyRst = .Execute
Schluss mit
Set MyComm = Nothing
'Erhalten Sie den Wert aus dem ersten Datensatz
Benutzername = MyRst(0)
'Holen Sie sich den Wert aus dem zweiten Datensatz
Wenn nicht, ist MyRst Nothing, dann
Setze MyRst = MyRst.NextRecordset()
UserTel = MyRst(0)
UserMail = MyRst(1)
Ende wenn
Set MyRst = Nothing
Im obigen Code wird die NextRecordset-Methode des Recordset-Objekts verwendet, um mehrere von der gespeicherten Prozedur zurückgegebene Datensatzsätze abzurufen.
Bisher hat dieser Artikel eine relativ umfassende Erklärung verschiedener Situationen gegeben, in denen ASP gespeicherte Prozeduren aufruft. Lassen Sie uns abschließend über die verschiedenen Methoden zum Aufrufen mehrerer gespeicherter Prozeduren in einem ASP-Programm sprechen.
In einem ASP-Programm sind mindestens die folgenden drei Methoden möglich, um mehrere gespeicherte Prozeduren aufzurufen:
1. Erstellen Sie mehrere Befehlsobjekte
DIM MyComm
Setze MyComm = Server.CreateObject("ADODB.Command")
'Rufen Sie die gespeicherte Prozedur eins auf
...
Setzen Sie MyComm = Nothing
Setze MyComm = Server.CreateObject("ADODB.Command")
'Rufen Sie die gespeicherte Prozedur zwei auf
...
Setzen Sie MyComm = Nothing
......
2. Erstellen Sie nur ein Command-Objekt und löschen Sie beim Beenden eines Anrufs dessen Parameter
DIM MyComm
Setze MyComm = Server.CreateObject("ADODB.Command")
'Rufen Sie die gespeicherte Prozedur eins auf
.....
'Parameter löschen (vorausgesetzt, es gibt drei Parameter)
MyComm.Parameters.delete 2
MyComm.Parameters.delete 1
MyComm.Parameters.delete 0
'Rufen Sie die gespeicherte Prozedur zwei auf und löschen Sie die Parameter
...
Set MyComm = Nothing
Bitte beachten Sie zu diesem Zeitpunkt: Die Reihenfolge beim Löschen von Parametern ist entgegengesetzt zur Reihenfolge bei der Parameterdeklaration. Ich kenne den Grund nicht.
3. Verwenden Sie die Refresh-Methode der Parameter-Datensammlung, um das Parameterobjekt
DIM MyComm
zurückzusetzen
Setze MyComm = Server.CreateObject("ADODB.Command")
'Rufen Sie die gespeicherte Prozedur eins auf
.....
'Alle Parameterobjekte zurücksetzen, die in der Parameterdatensammlung enthalten sind
MyComm.Parameters.Refresh
'Rufen Sie die gespeicherte Prozedur zwei auf
.....
Set MyComm = Nothing
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.