ASP-Vorlesung 8: ASP und Datenbank (3)
Autor:Eve Cole
Aktualisierungszeit:2009-05-30 19:55:00
In den letzten beiden Vorträgen haben wir die grundlegende Verwendung von Datenbanken in ASP erklärt. Heute stellen wir einige sehr praktische Technologien vor.
1. Paging-Technologie Wir haben eingeführt, wie man Daten abruft und an den Browser ausgibt. Bei großen Datenmengen mit Hunderten oder sogar Tausenden von Elementen ist eine solche einfache Ausgabeverarbeitung jedoch völlig akzeptabel , Es ist unrealistisch, so viele Daten auf einmal an den Client auszugeben. Zweitens ist die Belastung des Servers zu groß. Daher ist es unbedingt erforderlich, eine seitenweise Ausgabe vorzunehmen.
Anforderung: Geben Sie die Daten in der Tabelle „Produkt“ von Northwind.mdb an den Browser aus und zeigen Sie auf jeder Seite 10 Elemente an.
Nehmen Sie wuf60.asp als Beispiel. Dieser Code ist immer noch etwas schwierig. Sie müssen mehr über AdoAccess.asp erfahren.
Hinweis: Diese Routine enthält gute Teile aus einigen Büchern und erklärt sie hiermit.
<%@ LANGUAGE="VBSCRIPT" %>
<!--#include file="AdoAccess.asp"-->
<!--#include file="adovbs.inc"-->
<%
Dimmen Sie RecordPerPage, absPageNum, TotalPages, absRecordNum, rsTest, StrSQL
'absPageNum – Welche Seite ist die aktuelle Seite?
'TotalPages – Gesamtzahl der Seiten
'absRecordNum – die Seriennummer eines Datensatzes auf der aktuellen Seite, z. B. 1-10
RecordPerPage = 10 'Anzahl der pro Seite angezeigten Datensätze
' Ermitteln Sie die aktuelle Seitenzahl der Ausgabedaten
Wenn Request.ServerVariables("CONTENT_LENGTH") = 0, dann
„Wenn die über das Formular übermittelten Daten nicht empfangen werden (z. B. wenn die Seite zum ersten Mal geladen wird), werden sie ab Seite 1 angezeigt
absPageNum = 1
Anders
'Erhalten Sie die Seitenzahl, wenn Sie die Taste drücken
absPageNum = CInt(Request.Form("PressPageNum"))
„Wenn Sie auf die vorherige Seite drücken, ist die Seitenzahl -1, wenn Sie auf die nächste Seite drücken, ist die Seitenzahl +1
Wenn Request.Form("Submit") = "Vorherige Seite" Dann
absPageNum = absPageNum - 1
ElseIf Request.Form("Submit") = "Nächste Seite" Dann
absPageNum = absPageNum + 1
Ende wenn
Ende wenn
'Recordset-Objekt erstellen
Setze rsTest = Server.CreateObject("ADODB.Recordset")
rsTest.CursorLocation = adUseClient 'Diese Einstellung kann die Datenbanklast reduzieren
rsTest.CursorType = adOpenStatic 'Der Cursor muss sich vorwärts und rückwärts bewegen und kann nicht auf nur Vorwärtsbewegung eingestellt werden
rsTest.CacheSize = RecordPerPage 'Das Festlegen dieser Option verbessert die Leistung
StrSQL = „SELECT * FROM productOrder By productID“
rsTest.Open StrSQL, Cnn, , , adCmdText
rsTest.PageSize = RecordPerPage 'Legen Sie die Anzahl der Datensätze pro Seite fest
Wenn nicht (rsTest.EOF) dann
rsTest.AbsolutePage = absPageNum
Ende wenn
TotalPages = rsTest.PageCount
%>
<% 'Der folgende Teil gibt die Daten der aktuellen Seite an den Browser aus%>
<Html><Boby>
<table colspan=8 cellpadding=5 border=0>
<tr>
<td align=CENTER bgcolor="#800000" width="109"> <font style="ARIAL NARROW" color="#ffffff" size="2">Stückpreis</font></td>
<td align=CENTER width=459 bgcolor="#800000"> <font style="ARIAL NARROW" color="#ffffff" size="2">Produktname</font></td>
</tr>
<% 'Verwenden Sie eine Schleife, um 10 Daten auf der aktuellen Seite auszugeben
Für absRecordNum = 1 bis rsTest.PageSize
%>
<tr>
<td bgcolor="f7efde" align=CENTER> <font style="ARIAL NARROW" size="2"><%= rsTest("unit price")%></font></td>
<td bgcolor="f7efde" align=CENTER> <font style="ARIAL NARROW" size="2"><%= rsTest("Product Name")%></font></td>
</tr>
<%
rsTest.MoveNext
Wenn rsTest.EOF Dann
Exit For ' Wenn das Ende des Datensatzes erreicht wurde, Exit – wenn die letzte Datenseite nicht voll ist.
Ende wenn
Nächste
rsTest.Close: Cnn.Close
Setze rsTest = Nothing: Setze Cnn = Nothing
%>
</table>
<% 'Der untere Teil besteht aus zwei Schaltflächen: „Vorherige Seite“ „Nächste Seite“ %>
<Form Action = "<%= Request.ServerVariables("SCRIPT_NAME") %>" Method="Post">
<Input Type="Hidden" Name="PressPageNum" Value="<%= absPageNum%>">
<%
Wenn absPageNum > 1, dann 'Wenn die aktuelle Seite nicht die erste Seite ist, zeigen Sie die Schaltfläche für die vorherige Seite an%>
<Input Type="Submit" Name="Submit" Value="Previous Page">
<% Ende wenn
If absPageNum <> TotalPages Then 'Wenn die aktuelle Seite nicht die letzte Seite ist, zeigen Sie die Schaltfläche für die nächste Seite an%>
<Input Type="Submit" Name="Submit" Value="Next page">
<% End If %>
</Form>
<P><Center> [Page<font color="#CC0033"><%= absPageNum %></font>,
Gesamt<font color="#CC0033"><%= TotalPages %></font> Seiten] </Center></P>
</BODY></HTML>
analysieren:
1. Einige nützliche Eigenschaften des Recordset-Objekts:
l rsTest.CursorLocation = adUseClient: Sie können diesen Satz auch weglassen, aber dadurch kann die Datenbanklast reduziert werden;
l rsTest.CacheSize = RecordPerPage: Das CacheSize-Attribut wird verwendet, um zu bestimmen, wie viele Daten der Client jedes Mal vom Datenbankserver erhält;
l rsTest.PageSize: Das PageSize-Attribut wird verwendet, um die Anzahl der Datensätze auf jeder Seite festzulegen.
l rsTest.AbsolutePage: Die AbsolutePage-Eigenschaft legt die absolute Anzahl der Seiten der aktuellen Daten im Recordset-Objekt fest;
l rsTest.PageCount: Die PageCount-Eigenschaft wird verwendet, um die Gesamtzahl der Seiten im Datensatz zu ermitteln.
2. Dieses Beispielformular verwendet ein verstecktes Feld PressPageNum, um die Seite zu übergeben, wenn auf die Schaltfläche geklickt wird.
2. Fehlerbehandlung Während der Ausführung des Codes können aus verschiedenen Gründen Fehler auftreten, z. B. Probleme mit dem Code selbst, Netzwerkunterbrechung usw. Daher ist es unbedingt erforderlich, die Fehlererfassung und -verarbeitung im Programm einzurichten. In ASP können wir die Fehler- oder Warninformationen, die beim Ausführen des Codes auftreten, über die Fehlerdatensammlung des Connection-Objekts abrufen. Die Verwendungsmethode lautet wie folgt:
1. Verwenden Sie es direkt für das Connection-Objekt:
Setze Errs = Cnn.Errors
oder
Cnn.Fehler
2. Nachdem Sie das Recordset- oder Command-Objekt eingerichtet haben, verwenden Sie das Connection-Objekt über seine ActiveConnection-Eigenschaft:
Setze Errs = rsTest.ActiveConnection.Errors
oder
rsTest.ActiveConnection.Errors
Es klingt zu grob, um es zu sagen, also geben wir ein Beispiel: wuf61.asp
<%@ LANGUAGE="VBSCRIPT" %>
<% Option Explicit %>
<!--#include file="adovbs.inc"-->
<%
Response.Expires = 0
„Der folgende Satz garantiert: Auch wenn das Skript auf einen Fehler stößt, wird es mit der Ausführung des nächsten Satzes fortfahren.“
Bei Fehler Weiter fortsetzen
Dim Cnn, rsTest, Errs, I
Setze Cnn = Server.CreateObject("ADODB.Connection")
'CommandTimeout – die maximale Wartezeit für die Verbindung zur Datenbank, der Standardwert beträgt 15 Sekunden
Cnn.CommandTimeout = 5
„In den folgenden drei Situationen können Sie Fehler erkennen – am Beispiel von SQL Server.“
'1 – völlig korrekt; 2 – anfängliche Datenbank ist nicht festgelegt; 3 – Datenbankname ist falsch pvbs
Cnn.Open „Provider=sqloledb; Benutzer-ID=sa; Passwort=; Erstkatalog=pubs; Datenquelle=ICBCZJP“
'Cnn.Open „Provider=sqloledb; Benutzer-ID=sa; Passwort=; Erstkatalog=; Datenquelle=ICBCZJP“
'Cnn.Open „Provider=sqloledb; Benutzer-ID=sa; Passwort=; Erstkatalog=pvbs; Datenquelle=ICBCZJP“
Für I = 0 bis Cnn.Errors.Count - 1
'Quellenattribut gibt die Fehlerquelle an
Response.Write "[ " & Cnn.Errors(I).Source & " ] "
'Beschreibungsattribut gibt den Grund oder die Beschreibung des Fehlers an
Response.Write Cnn.Errors(I).Description & "<br>"
Nächste
Wenn Cnn.Errors.Count > 0, dann
Response.Write „Beim Herstellen der Verbindung aufgetreten“ & Cnn.Errors.Count & „ Fehler“ & „<br>“
Ende wenn
Setze rsTest = Server.CreateObject("ADODB.Recordset")
rsTest.Open „jobs“,Cnn,adOpenForwardOnly,adLockReadOnly,adCmdTable
Wenn rsTest.ActiveConnection.Errors.Count > 0, dann
Setze Session("Errs") = rsTest.ActiveConnection.Errors
Response.Redirect „ErrorHandle.asp“
Ende wenn
Cnn.Schließen
Setze rsTest = Nothing: Setze Cnn = Nothing
%>
ErrorHandle.asp-Code:
<%
Dim ich
Für I = 0 To Session("Errs").Count - 1
Response.Write "[ " & Session("Errs")(I).Source & " ] "
Response.Write Session("Errs")(I).Description & "<br>"
Nächste
%>
analysieren:
In diesem Fall ist der Fehler möglicherweise beim Herstellen der Verbindung aufgetreten, oder die Verbindung war möglicherweise korrekt, aber bei der Verwendung des Recordset-Objekts ist ein Fehler aufgetreten.
Darüber hinaus wird im folgenden Codeabschnitt die Fehlersammlung in ein Sitzungsobjekt eingefügt, sodass sie zwischen Seiten aufgerufen werden kann (wenn ein Fehler auftritt, wenden Sie sich an die Fehlerbehandlungsseite ErrorHandle.asp).
Tatsächlich können Sie das Recordset-Objekt auch dem Session-Objekt zuweisen, um den Aufruf des Recordset zwischen Seiten zu implementieren.
3. Das Konzept der Verwendung von Transaktionen ist sehr einfach und wichtig. Um seine Verwendung zu veranschaulichen, gehen wir zunächst von der folgenden Situation aus: Beispielsweise muss im E-Commerce bei der Durchführung von Währungsüberweisungen online ein bestimmter Betrag von einem Betrag abgezogen werden Konto eintragen und den entsprechenden Betrag einem anderen Konto hinzufügen. Unabhängig davon, welche der Aktualisierungen fehlschlägt, führt dies zu einem Ungleichgewicht im Kontostand (entweder gibt es hier einen Abzug, aber keine Erhöhung dort; oder es gibt hier keinen Abzug, aber dort eine Erhöhung). . Wenn Sie diese Änderungen über eine Transaktion vornehmen, stellen Sie sicher, dass Sie nur die Wahl haben, alle Änderungen vorzunehmen oder keine Änderungen vorzunehmen (entweder vollständig korrigieren oder vollständig abbrechen).
Transaktionen gehören zum Connection-Objekt, das über drei transaktionsbezogene Methoden verfügt:
l BeginTrans startet eine neue Transaktion.
l CommitTrans speichert alle Änderungen und beendet die aktuelle Transaktion.
l RollbackTrans bricht alle in der aktuellen Transaktion vorgenommenen Änderungen ab und beendet die Transaktion, was oft als „Rollback“ bezeichnet wird.
Wir könnten uns genauso gut ein Beispiel wuf62.asp ansehen.
<%@ LANGUAGE="VBSCRIPT" %>
<% Option Explicit %>
<!--#include file="adovbs.inc"-->
<%
Response.Expires = 0
Bei Fehler Weiter fortsetzen
DimCnn, StrSQL, rsTest
Setze Cnn = Server.CreateObject("ADODB.Connection")
Cnn.Open „Provider=sqloledb; Benutzer-ID=sa; Passwort=; Erstkatalog=pubs; Datenquelle=ICBCZJP“
„Eine Transaktion starten.“
Cnn.BeginTrans
StrSQL = „Insert jobs(job_desc, min_lvl, max_lvl) Values('Finance',16,86)“
Cnn.StrSQL ausführen
„Der erste Satz unten ist falsch, der zweite Satz ist richtig.“
StrSQL = „Update jobs_err SET job_desc = ‚Transaction‘ Where job_id = 14“
'StrSQL = "Jobs aktualisieren SET job_desc = 'Transaction' Where job_id = 14"
Cnn.StrSQL ausführen
Wenn Cnn.Errors.Count > 0, dann
Response.Write „Es ist ein Fehler aufgetreten, das System stellt den Zustand zu Beginn der Transaktion wieder her, es werden weder neue Ergänzungen noch Änderungen vorgenommen“ & „<br>“
Cnn.RollbackTrans
Anders
Response.Write „Keine Fehler, Änderungen an der Datenbank speichern, neue Daten hinzufügen, Daten ändern“ & „<br>“
Cnn.CommitTrans
Ende wenn
Setze rsTest = Cnn.Execute("Wähle * Aus Jobs aus, bei denen job_id>=14 ist")
Während nicht rsTest.EOF
Response.Write rstest(0) & rstest(1) & rstest(2) & rstest(3) & "<br>"
rsTest.MoveNext
Wend
„Dieses Beispiel dient nur zum Testen. Stellen Sie daher die Originaldaten der Datenbank wieder her.“
Cnn.Execute „Jobs aktualisieren SET job_desc = ‚Designer‘ Wo job_id = 14“
Cnn.Execute „DELETE jobs Where job_id > 14“
Cnn.Close: Setze Cnn = Nichts
%>
In diesem Beispiel erfolgen „Einfügen“ und „Aktualisieren“ entweder gleichzeitig oder keiner von beiden. Es kommt nicht zu einer Situation, in der ein Datenelement hinzugefügt wird, die Änderung jedoch aufgrund eines Anweisungsfehlers nicht erfolgt. Die Verwendung von Transaktionen ist eine sehr gute Angewohnheit beim Programmieren von Datenbanken.
4. Verarbeitung mehrerer Datensätze Manchmal müssen wir Daten aus zwei Tabellen gleichzeitig abrufen. Wenn sie in einer SQL-Anweisung zurückgegeben werden, kann die Netzwerkübertragung reduziert und die Betriebseffizienz verbessert werden.
Nehmen Sie als Beispiel wuf64.asp. In diesem Beispiel wird auch erläutert, wie eine Schleife zum Ausgeben von Feldwerten verwendet wird (in der Vergangenheit haben wir zum Ausgeben dumme Methoden wie „rsTest(0) & rsTest(1) &…“ verwendet). Wenn es nur zwei oder drei Felder gibt, ist diese Methode offensichtlich prägnanter. Wenn Sie es im Moment nicht verstehen, laden Sie bitte die einfachere wuf63.asp herunter. Denken Sie daran! .
<%@ LANGUAGE="VBSCRIPT" %>
<%
Option explizit
Response.Expires = 0
Dim Cnn, StrSQL, rsTest, I
Setze Cnn = Server.CreateObject("ADODB.Connection")
Cnn.Open „Provider=sqloledb; Benutzer-ID=sa; Passwort=; Erstkatalog=pubs; Datenquelle=ICBCZJP“
Setze rsTest = Server.CreateObject("ADODB.Recordset")
'Mehrere Datensätze abrufen
StrSQL = „Wählen Sie COUNT(*) AS ‚Anzahl der Mitarbeiter‘ vom Mitarbeiter; wählen Sie * aus Jobs“
rsTest.Open StrSQL, Cnn ', , ,adCmdText
Obwohl nicht, ist rsTest nichts
Response.Write „<Table Border = 2><tr>“
'rsTest.Fields.Count – Anzahl der Felder im Recordset
Für I = 0 bis rsTest.Fields.Count - 1
'rsTest(I).Name – der Feldname des I-Felds
Response.Write „<td>“ & rsTest(I).Name & „</td>“
Nächste
Response.Write „</tr>“
Während nicht rsTest.EOF
Response.Write „<tr>“
'Verwenden Sie eine Schleife, um den Wert jedes Felds auszugeben
Für I = 0 bis rsTest.Fields.Count - 1
Response.Write „<td>“ & rsTest(I) & „</td>“
Nächste
Response.Write „</tr>“
rsTest.MoveNext
Wend
'Lesen Sie das nächste Recordset-Objekt
Setzen Sie rsTest = rsTest.NextRecordset
Wend
Cnn.Schließen
Setze rsTest = Nothing: Setze Cnn = Nothing
%>
Hinweis: Die SQL Server-Datenbank unterstützt mehrere Datensatzsätze, die Access-Datenbank jedoch nicht.
5. Schließen Sie die Verbindung so früh wie möglich, um Ressourcen freizugeben
In den vorherigen Beispielen wurde die Verbindung jedoch zuletzt geschlossen. Gemäß der von wuf65.asp unten bereitgestellten Methode kann die Verbindung jedoch früher geschlossen werden.
<% @LANGUAGE = VBScript %>
<!--#include file="AdoAccess.asp"-->
<!--#include file="adovbs.inc"-->
<% ' wuf65.asp
Dimmen Sie StrSQL, rsTest
StrSQL = „Auswählen * Vom Versender“
Setze rsTest = server.CreateObject("ADODB.Recordset")
„Sie müssen einen Client-Cursor verwenden, sonst funktioniert es nicht.“
rsTest.CursorLocation = adUseClient
rsTest.Open StrSQL,Cnn,,,adCmdText
'Entfernen Sie die Abhängigkeit des Recordsets vom Connection-Objekt
Setzen Sie rsTest.ActiveConnection = Nothing
„Schließen Sie die Verbindung so früh wie möglich ab.“
Cnn.close: Setze Cnn = Nothing
Tun Sie dies, ohne rsTest.EOF
Response.Write rsTest(0) & " " & rsTest(1) & " " & rsTest(2) & " " & "<BR>"
rsTest.MoveNext
Schleife
Setze rsTest = Nothing
%>