Detaillierte Erläuterung der Anwendung gespeicherter Prozeduren in der ASP-Entwicklung | Aufruf, Parameter, Speicherung, Datenbank, Ausgabe, Kompilierung, Mycomm, Eingabe, Benutzer-ID, Code Es gibt viele Artikel über ASP und gespeicherte Prozeduren (Stored Procedures), aber ich bezweifle, dass die Autoren dies getan haben habe es tatsächlich geübt. 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. Der folgende Text ist eine Zusammenfassung der Praxis und hoffe, 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 wird die Effizienz erheblich verbessert. 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 wird die folgende einfache Klassifizierung basierend auf der Eingabe und Ausgabe der gespeicherten Prozedur vorgenommen:
1. Die gespeicherte Prozedur, die nur einen einzelnen Datensatz zurückgibt,
setzt die folgende gespeicherte Prozedur voraus (der Zweck dieses Artikels besteht nicht darin, sie zu beschreiben). T-SQL-Syntax, daher gibt die gespeicherte Prozedur nur den Code aus, keine Erklärung):
/*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:
'**Gespeicherte Prozedur über Command-Objekt aufrufen**
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 der CommandText-Parameter ein allgemeiner Befehlstyp ist Der CommandText-Parameter ist ein vorhandener Tabellenname. 4 gibt an, dass der CommandText-Parameter der Name einer gespeicherten Prozedur ist. Der Name einer gespeicherten Prozedur
kann auch zum Aufrufen der gespeicherten Prozedur über das Connection-Objekt oder Recordset-Objekt verwendet werden. Die Methoden sind wie folgt:
'**Gespeicherte Prozedur über Verbindungsobjekt aufrufen**
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 eine Datenbankverbindungszeichenfolge und der letzte Parameter hat dieselbe Bedeutung wie CommandType
2. Informationen zu gespeicherten Prozeduren ohne Ein- und Ausgabe
finden Sie in den folgenden gespeicherten Prozeduren:
/*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 aufrufende Methode ist im Grunde dieselbe wie oben erwähnt, außer dass der Datensatzsatz nicht abgerufen werden muss:
'**Gespeicherte Prozedur über Command-Objekt aufrufen**
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.Bei der Ausführung von SP2-ähnlichen Vorgängen
solltengespeicherte Prozeduren mit Rückgabewerten
die leistungsstarken Transaktionsverarbeitungsfunktionen von SQL Server vollständig nutzen, 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 Parameters-Auflistung verwenden, um Parameter zu deklarieren:
'**Rufen Sie eine gespeicherte Prozedur mit einem 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, den ich normalerweise auf „RETURE“ setze;
der zweite Parameter (2) gibt den Datentyp des Parameters an. Spezifische 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;
Für den Rückgabewert können nur Ganzzahlen 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; 4: Rückgabewert;
der oben angegebene ASP-Code
;sei auch ein vollständiger Code Das heißt, tatsächlich der komplexeste Code
Setze Mypara = MyComm.CreateParameter("RETURN",2,4)
MyComm.Parameters.Append MyPara
kann zu vereinfacht werden
MyComm.Parameters.Append MyComm.CreateParameter("RETURN",2,4)
kann sogar noch 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. Der Rückgabewert einer gespeicherten Prozedur mit Eingabe- und Ausgabeparametern
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:
'**Aufrufen einer gespeicherten Prozedur mit Eingabe- und Ausgabeparametern**
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, wird der ASP-Code umständlich. Sie können den Befehl with verwenden, um den Code zu vereinfachen:
'**Aufrufen einer gespeicherten Prozedur mit Eingabe- und Ausgabeparametern (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 'Gibt an, dass es sich um eine gespeicherte Prozedur handelt.Prepared = true 'Erfordert, dass der SQL-Befehl zuerst kompiliert wird.Parameter .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:
'**Die gleiche gespeicherte Prozedur mehrmals aufrufen**
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 'Gibt an, dass es sich um eine gespeicherte Prozedur handelt.Prepared = true 'Erfordert, dass der SQL-Befehl zuerst kompiliert wird, wenn Benutzer-ID = 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, die gleichzeitig Rückgabewerte, Eingabeparameter und Ausgabeparameter haben. Wie
bereits erwähnt, muss beim Aufruf einer gespeicherten Prozedur die Reihenfolge, in der die 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
Setze MyComm = Nothing
6. Gespeicherte Prozeduren, die gleichzeitig Parameter und Recordsets zurückgeben.
Wenn wir beispielsweise gespeicherte Prozeduren für Paging verwenden, müssen wir Parameter zurückgeben als Recordsets und Gesamtdaten gleichzeitig. 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):
'**Gespeicherte Paging-Prozedur aufrufen**
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 Prozeduren, die mehrere Datensatzsätze zurückgeben
In diesem Artikel werden zunächst die gespeicherten Prozeduren vorgestellt, die Datensatzsätze zurückgeben. 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
goDas
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 'Gibt an, dass es sich um eine gespeicherte Prozedur handelt.Prepared = true 'Erfordert, dass der SQL-Befehl zuerst kompiliert wird.Parameter .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 Command-Objekte
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 seine Parameter, wenn Sie einen Anruf beenden.
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 Parameter-Objekt zurückzusetzen
DIM MyComm
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 Größer oder gleich Methode 1 (bis zu etwa 4 % höher), die Laufgeschwindigkeit dieser beiden Methoden ist viel schneller als die von Methode 3 (bis zu 130 %), daher wird empfohlen, Methode 1 zu verwenden, wenn dies der Fall ist viele Parameter und verwenden Sie Methode 1, wenn nur wenige Parameter 2 vorhanden sind.