ADO Recordset
Zuletzt geändert: 30.01.2026 06:58

ADO Recordset #

Das ADO Recordset (ActiveX Data Objects) ist das zentrale Objekt für den Datenbankzugriff in EULANDA iScript. Es repräsentiert eine Ergebnismenge aus einer SQL-Abfrage als “virtuelle Tabelle” im Speicher.

Recordset erzeugen #

In EULANDA wird ein Recordset über Client.ExecuteSql erzeugt:

Dim rs
Set rs = Client.ExecuteSql("SELECT * FROM Artikel WHERE ArtNummer = 'ABC123'")

Die Methode führt die SQL-Abfrage aus und liefert ein geöffnetes Recordset zurück.

Wichtige Eigenschaften #

Eigenschaft Typ Beschreibung
EOF Boolean True, wenn der Cursor hinter dem letzten Datensatz steht
BOF Boolean True, wenn der Cursor vor dem ersten Datensatz steht
RecordCount Long Anzahl der Datensätze (-1 wenn nicht ermittelbar)
AbsolutePosition Long Aktuelle Position des Cursors (1-basiert)
Methode Beschreibung
MoveFirst Springt zum ersten Datensatz
MoveLast Springt zum letzten Datensatz
MoveNext Springt zum nächsten Datensatz
MovePrevious Springt zum vorherigen Datensatz
Move n Springt n Datensätze vorwärts (positiv) oder rückwärts (negativ)

Leeres Recordset erkennen #

Ein Recordset ohne Datensätze hat sowohl BOF als auch EOF auf True:

Set rs = Client.ExecuteSql("SELECT * FROM Artikel WHERE 1=0")
If rs.BOF And rs.EOF Then
    ellib.ShowMessage "Keine Datensätze gefunden"
End If

Feldzugriff #

Feldwerte lesen #

' Über Feldnamen (empfohlen)
wert = rs.Fields("ArtNummer").Value

' Kurzschreibweise
wert = rs("ArtNummer")

' Über Index (0-basiert)
wert = rs.Fields(0).Value

NULL-Werte behandeln #

Datenbankfelder können NULL sein. In VBScript muss dies explizit geprüft werden:

If IsNull(rs("Bemerkung")) Then
    bemerkung = ""
Else
    bemerkung = rs("Bemerkung")
End If

' Oder kompakt mit Hilfsfunktion
Function NullToEmpty(val)
    If IsNull(val) Then NullToEmpty = "" Else NullToEmpty = val
End Function

bemerkung = NullToEmpty(rs("Bemerkung"))

Feldinformationen #

Eigenschaft Beschreibung
Fields.Count Anzahl der Felder
Fields(i).Name Name des Feldes (0-basiert)
Fields(i).Type ADO-Datentyp des Feldes
Fields(i).ActualSize Tatsächliche Größe des Wertes
Fields(i).DefinedSize Definierte maximale Größe

Standard-Verarbeitungsmuster #

Alle Datensätze durchlaufen (MoveNext/EOF) #

Das klassische Muster zur Verarbeitung aller Datensätze:

Option Explicit
Dim rs, sql, ausgabe

sql = "SELECT ArtNummer, Kurztext1, VK FROM Artikel WHERE AuslaufFlg = 0 ORDER BY ArtNummer"
Set rs = Client.ExecuteSql(sql)

ausgabe = ""
Do While Not rs.EOF
    ausgabe = ausgabe & rs("ArtNummer") & " - " & rs("Kurztext1") & vbCrLf
    rs.MoveNext
Loop

Set rs = Nothing
ellib.ShowMessage ausgabe

Wichtig: Vergessen Sie nicht rs.MoveNext in der Schleife! Ohne diese Anweisung entsteht eine Endlosschleife.

Einzelnen Datensatz verarbeiten #

Wenn nur ein Datensatz erwartet wird:

Dim rs, artikelname, nummer
nummer = "4711"

Set rs = Client.ExecuteSql("SELECT Kurztext1 FROM Artikel WHERE ArtNummer = " &_
   ellib.SqlString(nummer))

If Not rs.EOF Then
    artikelname = rs("Kurztext1")
    if IsNull(artikelname) Then artikelname = "(null)"
    if Trim(artikelname) = "" Then artikelname = "(leer)"
Else
    artikelname = "(nicht gefunden)"
End If

ellib.ShowMessage nummer & ": " & artikelname
Set rs = Nothing

Datensätze zählen #

Dim rs, anzahl

Set rs = Client.ExecuteSql("SELECT COUNT(*) AS Anzahl FROM Artikel WHERE AuslaufFlg=0")
anzahl = rs("Anzahl")
Set rs = Nothing

ellib.ShowMessage "Es gibt " & anzahl & " aktive Artikel"

Filter und Sortierung #

Filter-Eigenschaft #

Mit der Filter-Eigenschaft kann ein geöffnetes Recordset nachträglich gefiltert werden, ohne eine neue SQL-Abfrage auszuführen:

Option Explicit
Dim rs, sql

' Alle Artikel laden
sql = "SELECT ArtNummer, Kurztext1, WarenGr, VK FROM Artikel ORDER BY ArtNummer"
Set rs = Client.ExecuteSql(sql)

ellib.ShowMessage "Alle Artikel: " & rs.RecordCount

' Nur Artikel einer bestimmten Warengruppe anzeigen
rs.Filter = "WarenGr = 'ELEKTRONIK'"
ellib.ShowMessage "Gefiltert (ELEKTRONIK): " & rs.RecordCount

' Preisfilter
rs.Filter = "VK > 100"
ellib.ShowMessage "Gefiltert (VK > 100): " & rs.RecordCount

' Filter aufheben
rs.Filter = ""
ellib.ShowMessage "Ohne Filter: " & rs.RecordCount

Set rs = Nothing

Filter-Syntax #

Operator Beispiel Beschreibung
= "Status = 1" Gleich
<> "Status <> 0" Ungleich
>, <, >=, <= "VK >= 50" Vergleich
LIKE "ArtNummer LIKE 'A*'" Mustervergleich (* = beliebig viele Zeichen)
AND, OR "VK > 10 AND VK < 100" Logische Verknüpfung

Hinweis: Der Filter arbeitet nur auf den bereits geladenen Daten. Für komplexe Filterungen ist eine angepasste SQL-Abfrage performanter.

Sort-Eigenschaft #

Die Sortierung kann ebenfalls nachträglich geändert werden:

rs.Sort = "VK DESC"           ' Absteigend nach Preis
rs.Sort = "WarenGr, VK"   ' Mehrere Felder
rs.Sort = ""                  ' Sortierung aufheben (Original)

Template-basierte Ausgabe #

Für die formatierte Ausgabe von Recordset-Daten bietet die ellib komfortable Funktionen.

ellib.ReplaceVars mit Recordset #

Ersetzt Platzhalter mit Feldwerten des aktuellen Datensatzes:

Option Explicit
Dim rs, zeile

Set rs = Client.ExecuteSql("SELECT Match, PLZ, Ort FROM Adresse WHERE ID = 956")

zeile = ellib.ReplaceVars("%MATCH% - %PLZ% %ORT%", rs)
ellib.ShowMessage zeile

Ausgabe: FIRMA MEIER - 65510 Idstein

ellib.ReplaceVarsRecordset #

Verarbeitet alle Datensätze eines Recordsets auf einmal und fügt einen Trenner zwischen jede Zeile ein:

ellib.ReplaceVarsRecordset(Vorlage, Recordset, Zeilentrennung)
Parameter Beschreibung
Vorlage Text mit Platzhaltern in Prozentzeichen
Recordset Das zu verarbeitende Recordset
Zeilentrennung String, der zwischen jede Zeile eingefügt wird

Beispiel: Adressliste erstellen #

Option Explicit
Dim rs, liste

Set rs = Client.ExecuteSql("SELECT TOP 10 Match, PLZ, Ort FROM Adresse ORDER BY Match")

liste = ellib.ReplaceVarsRecordset("%MATCH% - %PLZ% %ORT%", rs, vbCrLf)
ellib.ShowMessage liste

Ausgabe:

BAUER GMBH - 60311 Frankfurt
FIRMA MEIER - 65510 Idstein
MUELLER AG - 80331 München
...

Beispiel: CSV-Export #

Option Explicit
Dim rs, csv

Set rs = Client.ExecuteSql("SELECT ArtNummer, Kurztext1, VK FROM Artikel WHERE Gesperrt = 0")

' CSV mit Semikolon als Feldtrenner
csv = "ArtNummer;Kurztext1;VK" & vbCrLf
csv = csv & ellib.ReplaceVarsRecordset("%ArtNummer%;%Kurztext1%;%VK%", rs, vbCrLf)

ellib.SaveString csv, "C:\Export\artikel.csv"

Tipp: Für komplexe CSV-Exporte mit Anführungszeichen-Behandlung, konfigurierbaren Trennzeichen und weiteren Optionen bietet EULANDA die Funktion Client.RenderData.

Beispiel: HTML-Tabelle #

Option Explicit
Dim rs, html

Set rs = Client.ExecuteSql(_
  "SELECT ArtNummer, Kurztext1, VK FROM Artikel WHERE VK > 100")

html = Client.renderData(rs, "preset=HTMLTable")
ellib.ShowHtml html, "Artikelliste", _
  "Beispiel aus Entwickler-Dokumentation"

Die Template-Syntax ist identisch mit ellib.ReplaceObjectValues - Platzhalter werden in Prozentzeichen eingeschlossen und entsprechen den Feldnamen der SQL-Abfrage.

Daten als Array abrufen #

Die GetRows-Methode liefert alle Daten als zweidimensionales Array:

Option Explicit
Dim rs, daten, zeile, spalte

Set rs = Client.ExecuteSql("SELECT ArtNummer, Kurztext1 FROM Artikel WHERE AuslaufFlg = 0")

If Not rs.EOF Then
    daten = rs.GetRows()

    ' daten(Spalte, Zeile) - Achtung: Spalte zuerst!
    For zeile = 0 To UBound(daten, 2)
        For spalte = 0 To UBound(daten, 1)
            ' Verarbeitung...
        Next
    Next
End If

Set rs = Nothing

Hinweis: Bei GetRows ist die Indexierung (Spalte, Zeile), nicht (Zeile, Spalte).

Recordset klonen #

Mit Clone wird eine Kopie des Recordsets erstellt, die unabhängig navigiert werden kann:

Dim rs, rsKopie

Set rs = Client.ExecuteSql("SELECT * FROM Artikel")
Set rsKopie = rs.Clone

' Beide können nun unabhängig navigiert werden
rs.MoveFirst
rsKopie.MoveLast

Schreibzugriff (Übersicht) #

Das ADO Recordset unterstützt auch das Ändern von Daten. Diese Funktionen werden in EULANDA jedoch selten direkt verwendet, da Änderungen meist über die EULANDA-Datenobjekte oder direkte SQL-Befehle erfolgen.

Methode Beschreibung
AddNew Neuen Datensatz anlegen
Update Änderungen speichern
Delete Aktuellen Datensatz löschen
CancelUpdate Änderungen verwerfen

Für Details zu diesen Methoden siehe die Microsoft ADO-Dokumentation.

Ressourcen freigeben #

Nach der Verwendung sollte das Recordset freigegeben werden:

Set rs = Nothing

Häufige Fehler #

Endlosschleife durch fehlendes MoveNext #

' FALSCH - Endlosschleife!
Do While Not rs.EOF
    wert = rs("Feld")
    ' MoveNext fehlt!
Loop

' RICHTIG
Do While Not rs.EOF
    wert = rs("Feld")
    rs.MoveNext
Loop

Zugriff auf leeres Recordset #

' FALSCH - Fehler wenn Recordset leer
wert = rs("Feld")

' RICHTIG - Prüfung auf EOF
If Not rs.EOF Then
    wert = rs("Feld")
End If

NULL-Werte nicht behandelt #

' FALSCH - Fehler bei NULL-Werten in Berechnungen
summe = rs("Menge") * rs("Preis")

' RICHTIG - NULL prüfen oder in SQL behandeln
Set rs = Client.ExecuteSql("SELECT ISNULL(Menge,0) * ISNULL(Preis,0) AS Summe FROM ...")

Weiterführende Informationen #