» Start & Installation » ASP-Grundlagen » VBScript » Datenbanken » Erweiterte Techniken » Fehlercode-Suche » FAQ » Forum für aspfehlercodes » ASP » JavaScript » ASCII & ANSI » HTTP-Statuscodes » Codepage » LCID » VBScript » JScript
|
Link: Wichtiger Hinweis in eigener Sache!
Nach so viel Theorie jetzt mal etwas Praxis. Ich möchte Ihnen 3 unterschiedliche Möglichkeiten für den Datenbankzugriff darstellen und erklären. Die 2te Möglichkeit ist kompakter, es verwendet nur ein Objekt, das Recordset.
Falls Sie in naher Zukunft mit .NET arbeiten möchten, sollten Sie am besten das erste Beispiel verwenden. In ADO.NET gibt es das Recordset wie in ADO nicht mehr. Da wurde das Recordset in mehrere Objekte aufgeteilt.
Die Beispiele sind so einfach wie möglich aufgebaut, und lesen einfach nur mal Daten aus einer Datenbank aus. In der Tabelle tblAdressen sind mehrere Adressen gespeichert, diese sollen in einer HTML-Tabelle dargestellt werden.
So sieht die tblAdressen aus: tblAdressen: ID, Vorname, Nachname, Strasse, Ort
Zunächste einmal der Seitenheader, der auch eine explizite Variablendeklaration erzwingt. In Zeile 9 wird das ADODB - Connection-Objekt erstellt. Es wird für die Verbindung zur Datenbank benötigt.
In der Zeile 10 wird das Recordset-Objekt erstellt. Es wird für das Arbeiten mit den Daten und für die Übertragung der SQL- und ADO-Anweisung (wie z.B. movenext) benötigt.
1 2 3 4 5 6 7 8 9 10
| <% @ Language="VBScript" LCID = 1031 %><% Option Explicit Response.Buffer = true Session.LCID = 1031
Dim rs, strConn, Conn, strPfadDB, SQL
set Conn = Server.CreateObject("ADODB.Connection") set rs = Server.CreateObject("ADODB.Recordset") |
Zeile 13: Der OLE-Treiber für die Datenbankanbindung wird der Variablen zugeordnet. Die Pfad-Angaben inkl. dem OLE-Treiber können Sie auch in eine gesonderte Datei auslagern, z.B. Pfad.asp Zeile 16: Die Verbindung zur Datenbank per Connection-Objekt wird geöffnet. Bitte die Verbindung erst dann öffnen, wenn diese benötigt wird. Schliessen Sie dann die Verbindung, sobald diese nicht mehr benötigt wird. Dies schont die Server-Ressourcen.
12 13 14 15 16 17
| strPfadDB = Server.MapPath("~db\Test.mdb") strConn = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" & strPfadDB SQL = "Select * from tblAdressen"
Conn.Open (strConn) rs.Open SQL, Conn, 0, 1 |
Zeile 17: Das Recordset wird geöffnet. Übergeben wird dabei die SQL-Anweisung, als Verbindung das Connection-Objekt, dazu noch der Cursortype und der Locktype.
Cursortype gibt an, wie der Cursor in der Datenbank reagiert, die einzelnen Werte:
| Konstante | Wert | Beschreibung |
|---|
| adOpenForwardOnly | 0 | Der Cursor kann nur vorwärts bewegt werden. (Standard) | | adOpenKeyset | 1 | Dem Dynamischen Cursor (adOpenDynamic) ähnlich, nur daß hinzugefügte Datensätze nicht angezeigt werden. Reagiert auf Änderungen und Löschungen: Geänderte Datensätze werden aktualisiert dargestellt, gelöschte Datensätze werden nicht angezeigt. | | adOpenDynamic | 2 | Alle Einflüsse anderer Benutzer werden übertragen. Reagiert auf neue, geänderte und gelöschte Datensätze. | | adOpenStatic | 3 | Eine Statische Kopie der Daten. Wenn andere Benutzer Datensätze hinzfügen, ändern oder Löschen wird dies nicht angezeigt. |
Locktype gibt an, wie die Daten bei Änderungen gesperrt werden:
| Konstante | Wert | Beschreibung |
|---|
| adLockReadOnly | 1 | Standard, Schreibgeschützt, Datenmanipulation ist nicht möglich | | adLockPessimistic | 2 | Es wird immer nur der Datensatz gesperrt welcher aufgerufen wird. | | adLockOptimistic | 3 | Ähnlich adLockPessimistic, Unterschied: Es wird nur der Datensatz gesperrt, der geändert wird. | | adLockBatchOptimistic | 4 | Ein Sperren des aktuellen Datensatzes wird nur dann durchgeführt, wenn im Batchmodus ein Datensatz geändert wird. |
Möchten Sie nur Daten darstellen, und Sie verwenden nur rs.movefirst, ist
die effizienteste Datenzugriffsmöglichkeit. Möchten Sie Daten ändern, kann die Einstellung z.B. so aussehen:
Als nächstes noch der Tabellenkopf:
19 20 21 22 23 24 25 26 27 28
| %> <table border=1> <tr> <th bgcolor="#b9b9b9">Vorname</th> <th bgcolor="#b9b9b9">Nachname</th> <th bgcolor="#b9b9b9">Strasse</th> <th bgcolor="#b9b9b9">Plz</th> <th bgcolor="#b9b9b9">Ort</th> </tr> <% |
30 31 32 33 34 35 36 37 38 39
| Do while not rs.EOF Response.Write("<tr>") Response.Write("<td>" & rs.Fields("Vorname").Value & "</td>") Response.Write("<td>" & rs.Fields("Nachname").Value & "</td>") Response.Write("<td>" & rs.Fields("Strasse").Value & "</td>") Response.Write("<td>" & rs.Fields("Plz").Value & "</td>") Response.Write("<td>" & rs.Fields("Ort").Value & "</td>") Response.Write("</tr>") rs.MoveNext Loop |
In der Schleife werden nun alle Datensätze ausgegeben. Der Zugriff auf die Daten im jeweiligen Feld erfolgt hier mit:
| rs.Fields("Vorname").Value |
Es kann aber auch verwendet werden:
Allerdings ist die erste Variante effizienter. Sie sollten die erste Version verwenden. In der Schleife muss dann noch rs.MoveNext aufgerufen werden, da Sie sonst eine Endlosschleife haben.
41 42 43 44 45 46 47
| rs.Close Conn.Close
set rs = nothing set Conn = nothing
%> |
Und zuletzt werden die erstellten Objekte rs und Conn explizit geschlossen und terminiert. Lt. Microsoft ist das explizite Terminieren nicht erforderlich, da dies automatisch durch die Script-Engine durchgeführt wird.
Allerdings hat sich gezeigt, daß ein explizites Terminieren optimaler ist. Sowohl bei der Performance, bei der Speicherverwaltung und bei der Fehlervermeidung. Das implizierte terminieren der Objekte durch die ScriptEngine wird nicht automatisch nach dem Abarbeiten durchgeführt.
Es kann sein, daß die implizite Terminierung direkt nach dem Abarbeiten der Seite durchgeführt wird. Es ist aber auch sehr wohl möglich, daß die Terminierung "irgendwann" durchgeführt wird. Wann, ist leider unbekannt. Wenn dann zuviele Objekte (vor allem ADO-Objekte) bestehen, können hierdurch Fehler erzeugt werden.
Das nachfolgende Beispiel ist etwas kompakter als die erste Version. Es wird nur das Recordset verwendet, auf den Einsatz des Connection-Objekts wird verzichtet. Statt dem Connection Objekt wird in der Zeile 14
| rs.Open SQL, strConn, 0, 1 |
direkt die Variable strConn angegeben. Vorteil hiervon ist eine gesteigerte Performance, da das Connection-Objekt nicht erstellt werden muss.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40
| <% @ Language="VBScript" LCID = 1031 %><% Option Explicit Response.Buffer = true Session.LCID = 1031
Dim rs, strConn, Conn, strPfadDB, SQL
set rs = Server.CreateObject("ADODB.Recordset") strPfadDB = Server.MapPath("~db\Test.mdb") strConn = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" & strPfadDB SQL = "Select * from tblAdressen" rs.Open SQL, strConn, 0, 1
%> <table border=1> <tr> <th bgcolor="#b9b9b9">Vorname</th> <th bgcolor="#b9b9b9">Nachname</th> <th bgcolor="#b9b9b9">Strasse</th> <th bgcolor="#b9b9b9">Plz</th> <th bgcolor="#b9b9b9">Ort</th> </tr> <%
Do while not rs.EOF Response.Write("<tr>") Response.Write("<td>" & rs.Fields("Vorname").Value & "</td>") Response.Write("<td>" & rs.Fields("Nachname").Value & "</td>") Response.Write("<td>" & rs.Fields("Strasse").Value & "</td>") Response.Write("<td>" & rs.Fields("Plz").Value & "</td>") Response.Write("<td>" & rs.Fields("Ort").Value & "</td>") Response.Write("</tr>") rs.MoveNext Loop
rs.Close set rs = nothing %> </table> |
Möchten Sie nur bestimmte Datensätze anzeigen, kann dies mit der Where-Klausel in der SQL-Anweisung erfolgen. Falls es sich beim entsprechendem Tabellenfeld um ein Alphanumerischer Typ handelt, muss der String in Hochkommas gesetzt werden, z.B.:
| SQL = "Select * from Tabelle Where Vorname = 'Otto'" |
Mit einer Variablen sieht dies so aus:
strName = "Otto" SQL = "Select * from Tabelle Where Vorname = '" & strName & "'" |
WICHTIG! Es muss sowohl das öffnende als auch das schliessende Hochkomma angegeben werden. Falls z.B. das schliessende Hochkomma nicht vorhanden ist, wird eine Fehlermeldung erzeugt.
|
|