Glengamoi (Forum) · AspHeute · .NET Heute (RSS-Suche) · AspxFiles (Wiki) · .NET Blogs

Einsatz des Recordset Objektes als Multifunktionaler Datenspeicher

Geschrieben von: Christian Koller
Kategorie: ASP Tricks

This printed page brought to you by AlphaSierraPapa

Das ADO Recordset Object (ADODB.Recordset) ist nicht nur geeignet, um Ergebnisse von Datenbankabfragen zu speichern. Man kann es auch Anstelle eines Arrays benutzen um komplexe Datensätze in ASP Seiten zu speichern und zu verwalten.

Durch die Konzeption des ADO Recordsets als Objekt mit Eigenschaften und Methoden hat man einen einfachen und komfortablen Zugriff auf die gespeicherten Daten. Unter anderem bietet jedes Recordset Objekt von Haus aus die Möglichkeit nach bestimmten Werten zu suchen, Werte zu sortieren, Datensätze hinzuzufügen oder wieder zu löschen.

Mit der ADO Version 2.1 ist es sogar möglich, alle Daten eines Recordsets als XML auf einer Festplatte oder Diskette zu speichern. Damit kann das Recordset per Email oder Download verschickt werden. Im XML Format bleiben nicht nur die Daten erhalten, auch die komplette Recordsetstruktur wird im XML Dokument gespeichert.

All dies macht das Recordset zu einem wertvollen und praktischen Datenspeicher, der auch in ASP Applikationen gute Dienste leisten kann.

Um ein Recordset Objekt als Datenspeicher zu nutzen, muss man es erstellen (CreateObject), und dann die Struktur eines Datensatzes definieren. Ein Datensatz besteht dabei aus Feldern mit Feldnamen und Datentyp (Text, Zahl, Datum).

Das folgende Beispiel erstellt ein ADO Recordset Objekt und speichert es in der Variable rs. Danach definiert es die Felder des Recordsets und legt sowohl Namen als auch Datentyp fest:

Um nun die Felder des Recordsets zu definieren benutzt man die Append Methode der Fields Collection. Die Fields Collection enthält alle Felder des Recordsets, und mit Hilfe der Append Method kann man neue Felder zur Fields Collection, und damit zum Recordset, hinzufügen:

' Definition der ADO Datentypen (DataTypeEnum)
Const adBinary = 128    ' Daten
Const adBoolean = 11    ' Boolean (True/False)
Const adChar = 129      ' Text
Const adCurrency = 6    ' Waehrung
Const adDate = 7        ' Datum
Const adDecimal = 14    ' Exakte Dezimalzahl
Const adDouble = 5      ' Fliesskommazahl hoher Genauigkeit
Const adInteger = 3     ' Ganze Zahl
Const adSingle = 4      ' Fliesskommazahl niedriger Genauigkeit

' Erstellen des Recordset Objektes
Set rs = CreateObject("ADODB.Recordset")

' Definition der Datenstruktur des Recordsets
'    rs.Fields.Append Name, Datentype, Laenge, Attribute
rs.Fields.Append "ID", adInteger
rs.Fields.Append "Name", adChar, 64
rs.Fields.Append "Notiz", adChar, 2048

Nachdem nun die Struktur des Recordsets in Form der Felder (Name und Datentyp) feststeht, kann man daran gehen, das Recordset mit Werten zu füllen. Zu diesem Zweck öffnet man das Recordset mit der Open Methode und fügt mit der AddNew Methode neue Datensätze hinzu:

' Oeffnen des Recordsets um Daten darin zu speichern
rs.Open

' Datensaetze in Recordset speichern
rs.AddNew
rs("ID") = 1
rs("Name") = "Christian" 
rs("Notiz") = "Dies ist eine sehr lange Notiz " & Space(900) & "!"

rs.AddNew 
rs("ID") = 2
rs("Name") = "Stefan" 
rs("Notiz") = "Dies ist eine weitere, sehr lange Notiz " & Space(900) & "!"

rs.AddNew 
rs("ID") = 3
rs("Name") = "Guenter" 
rs("Notiz") = "Dies ist eine kurze Notiz !"

Um Werte aus dem Recordset wieder auszulesen navigiert man den Recordset Cursor zum gewünschten Datensatz und liest dann die Werte der Felder aus. Das folgende Skript zum Beispiel geht zum zweiten Datensatz (rs.AbsolutePosition = 2) und gibt die Werte der 3 Felder des Datensatzes aus:

' Zum 2. Datensatz gehen und alle Felder ausgeben:
Response.Write "Werte des zweiten Datensatzes:<br>" & VbCrLf
rs.AbsolutePosition = 2
Response.Write rs("ID") & " " & rs("Name") 
Response.Write "(" & rs("Notiz") & ")<br>" & VbCrLf
Response.Write "<br>" & VbCrLf

Um alle Datensätze des Recordsets zu durchlaufen, verwendet man üblicherweise eine While...Wend Schleife:

' Gesamtes Recordset ausgeben:
Response.Write "Inhalt des Recordsets:<br>" & VbCrLf
rs.MoveFirst
While Not rs.EOF
	Response.Write rs("ID") & " "
	Response.Write rs("Name") & "<br>" & VbCrLf
	rs.MoveNext
Wend
Response.Write "<br>" & VbCrLf

Die Anzahl der Datensätze im Recordset Objekt ist in der RecordCount Eigenschaft des Recordsets enthalten:

' Anzahl der Datensaetze:
Response.Write "Recordset enthaelt " & rs.RecordCount & " Datensaetze.<br>"
Response.Write "<br>" & VbCrLf

Darüber hinaus erlaubt das Recordset Objekt noch fortgeschrittene Operationen, wie das Sortieren aller Datensätze, das Finden einzelner Daten, oder das Filtern des gesamten Recordsets.

Um alle Datensätze des Recordsets zu sortieren, weist man der Sort Eigenschaft des Recordset Objektes die Sortierkriterien zu. Die Sortierkriterien enthalten den Namen der Datensatzspalte, nach der sortiert werden soll, und den Zusatz ASC (für aufsteigend) oder DESC (für absteigend).

' Recordset sortieren und ausgeben
Response.Write "Recordset, sortiert nach Namen und ID:<br>" & VbCrLf
' Name absteigend (DESC) und ID aufsteigend (ASC) sortieren:
rs.Sort = "Name DESC, ID ASC"   

rs.MoveFirst
While Not rs.EOF
	Response.Write rs("ID") & " "
	Response.Write rs("Name") & "<br>" & VbCrLf
	rs.MoveNext
Wend

' Sortierung aufheben
rs.Sort = ""
Response.Write "<br>" & VbCrLf

Das Filtern eines Recordset wird durch die Filter Methode ermöglicht. Nach dem Filtern sind im Recordset nur mehr jene Datensätze sichtbar, die dem Filterkriterium genügen. Das Filterkriterium ist in diesem Fall ein Ausdruck aus Feldnamen, Operatoren (wie "=", "<", ">", LIKE, AND, OR) und Vergleichswerten:

' Recordset filtern und ausgeben
Response.Write "Gefiltertes Recordset:<br>" & VbCrLf
rs.Filter = "((ID > 1) AND (Name > 'G')) OR " & _
               "((Name LIKE '%ist%') AND (ID > 1))"

rs.MoveFirst
While Not rs.EOF
	Response.Write rs("ID") & " "
	Response.Write rs("Name") & "<br>" & VbCrLf
	rs.MoveNext
Wend

' Filter entfernen
rs.Filter = 0
Response.Write "<br>" & VbCrLf

Wenn man Datensätze mit ganz bestimmten Datenwerten sucht, so nimmt man die Find Methode zu Hilfe. Diese sucht im gesamten Recordset bis es den ersten Datensatz findet, der das Suchkriterium erfüllt:

' Finden eines Datensatzes und Löschen des selbigen:
Response.Write "Suchen des Datensatzes mit der ID = 2.<br>" & VbCrLf
rs.MoveFirst
rs.Find "ID = 2"
If Not rs.EOF Then
	' Datensatz gefunden, daher loeschen:
	rs.Delete
	rs.MoveFirst
	Response.Write "Datensatz geloescht.<br>" & VbCrLf
End If
Response.Write "<br>" & VbCrLf

Wie das vorherige Beispiel bereits zeigt, kann man nicht mehr benötigte Datensätze einfach mit der Delete Methode löschen wenn der Recordset Cursor auf den zu löschenden Datensatz zeigt.

Sobald man das Recordset Objekt nicht mehr zum Speichern benötigt schließt man es mit der Close Methode und gibt seine Resourcen frei.

' verbliebene Datensaetze ausgeben:
Response.Write "Verbliebene Datensaetze:<br>" & VbCrLf
rs.MoveFirst
While Not rs.EOF
	Response.Write rs("ID") & " "
	Response.Write rs("Name") & " ("
	Response.Write rs("Notiz") & ")<br>" & VbCrLf
	rs.MoveNext
Wend

' Recordset schliessen und Resourcen freigeben
rs.Close
Set rs = Nothing

Das Recordset bietet also beim Speichern von Daten eine interessante Alternative zu Arrays, da es Such- und Sortieralgorithmen quasi nebenbei zur Verfügung stellt. Speziell für Datenbank-Programmierer mit Erfahrung unter ADO ist das Recordset Objekt oftmals ein einfach zu handhabender Datenspeicher für eine überschaubare Menge von Datensätzen.

Einen weiteren Vorteil in der Handhabung ist die Möglichkeit (ab ADO Version 2.1), daß man ein Recordset (inklusive Daten, Struktur und Feld-Definitionen) als XML auf einer Festplatte, einer Floppy, in einer Application- oder Session-Variblen speichern kann.

Um ein generiertes Recordset als XML auf der Festplatte zu speichern, führt man die Save Methode wie folgt aus:

Const adPersistXML = 1

' Speichern des Recordsets auf der Harddisk:
rs.Save "A:\Data\MyRecordsetData.xml", adPersistXML

Das Auslesen eines als XML gespeicherten Recordset ist ähnlich einfach:

' Auslesen 
rs.Open "A:\Data\MyRecordsetData.xml"
...

This printed page brought to you by AlphaSierraPapa

Download des Codes

Klicken Sie hier, um den Download zu starten.
http://www.aspheute.com/code/20000516.zip

Verwandte Artikel

ADO und ASP - Datenbanken einmal näher betrachtet
http:/www.aspheute.com/artikel/19990825.htm
Auslesen von XML Dateien mit dem DOM
http:/www.aspheute.com/artikel/20000417.htm
Installation der neuesten ADO Version (ADO 2.5)
http:/www.aspheute.com/artikel/20000328.htm
Speichern von Recordsets in Application-Variablen (Teil II)
http:/www.aspheute.com/artikel/20000425.htm

 

©2000-2006 AspHeute.com
Alle Rechte vorbehalten. Der Inhalt dieser Seiten ist urheberrechtlich geschützt.
Eine Übernahme von Texten (auch nur auszugsweise) oder Graphiken bedarf unserer schriftlichen Zustimmung.