Tipp 4.15 - Recordset nach Array
Wie kann ich ein gefülltes Recordset in ein Array kopieren?
Um ein Recordset in ein Array zu überführen, vereinbaren Sie ein zweidimensionales Array und kopieren die Datensätze nacheinander in dieses Array, wobei der erste Arrayindex für die Felder und der zweite für die Datensätze zuständig ist. Beispiel: vRst(lField, lRecord).
Sie können es sich aber auch einfacher machen
! Für die Durchführung der o.g. Aufgabe stellt Ihnen DAO bzw. ADO die Methode GetRows zur Verfügung. Diese gibt Ihnen automatisch ein bereits gefülltes zweidimensionales Array als Ergebnis zurück.
Das folgende Beispiel legt ein Recordset-Objekt über einer SQL-Anweisung für die Auswahl von zwei Feldern aus der Tabelle Personal der Nordwind-Datenbank an und setzt dann die GetRows-Methode ein, um alle Datensätze des Recordsets in eine Variable des Typs Variant zu übertragen. Das Ergebnis ist ein zweidimensionales Array, dessen Datenfelder Kopien der Feldwerte enthalten. Damit Sie genau sehen, wie die Arrayindizes mit den Feldwerten und Datensätzen zusammenspielen, erfolgt die Ausgabe über eine verschachtelte For-Schleife:
DAO-Beispiel GetRows-Methode:
Beispiel:
' DAO Recordset to Array Public Sub DaoRecordsetToArray() Dim dbs As DAO.Database Dim rst As DAO.Recordset Dim vRst As Variant Dim lCount As Long Dim lColumns As Long Dim lColumn As Long Dim lRow As Long Dim sSql As String On Error GoTo DaoRecordsetToArray_Err sSql = "SELECT [Position], [Nachname] & (', '+[Vorname]) AS Gesamtname FROM Personal ORDER BY [Position], [Nachname], [Vorname];" ' Datenbankobjekt zuweisen Set dbs = CurrentDb() ' Recordset öffnen Set rst = dbs.OpenRecordset(sSql) ' Wenn Datensätze vorhanden, With rst If Not .BOF And Not .EOF Then ' dann Anzahl der DS ermitteln .MoveLast lCount = .RecordCount .MoveFirst ' Recordset ins Array kopieren vRst = .GetRows(lCount) ' Anzahl der Zeilen ermitteln lCount = UBound(vRst, 2) ' Anzahl der Spalten ermitteln lColumns = UBound(vRst, 1) ' Schleife über alle Zeilen For lRow = 0 To lCount ' Ausgabe der Zeilennummer Debug.Print "Zeile: " & lRow & " - " & lRow + 1 & ". Datensatz" Debug.Print String$(45, "=") ' Schleife über alle Spalten For lColumn = 0 To lColumns ' Ausgaben der Spaltenwerte Debug.Print String$(3, " "); "Spalte: " & lColumn; vbTab; "Wert: "; vRst(lColumn, lRow) Next lColumn Debug.Print vbCrLf Next lRow End If End With DaoRecordsetToArray_Exit: On Error GoTo 0 ' Speicher freigeben If Not rst Is Nothing Then rst.Close: Set rst = Nothing If Not dbs Is Nothing Then dbs.Close: Set dbs = Nothing Erase vRst Exit Sub DaoRecordsetToArray_Err: MsgBox "Fehler " & Err.Number & ": " & _ Err.Description, vbCritical, _ "modDaoAdo.DaoRecordsetToArray" Resume DaoRecordsetToArray_Exit End Sub
ADO-Beispiel GetRows-Methode:
Beispiel:
' ADO Recordset to Array Public Sub AdoRecordsetToArray() Dim cnn As ADODB.Connection Dim rst As ADODB.Recordset Dim vRst As Variant Dim lCount As Long Dim lColumns As Long Dim lColumn As Long Dim lRow As Long Dim sSql As String On Error GoTo AdoRecordsetToArray_Err sSql = "SELECT [Position], [Nachname] & (', '+[Vorname]) AS Gesamtname FROM Personal ORDER BY [Position], [Nachname], [Vorname];" ' Connection-Objekt auf die aktuelle Datenbank setzen. Set cnn = CurrentProject.Connection ' Recordset initialiseren Set rst = New ADODB.Recordset With rst ' Recordset-Objekt vom Typ Abfrage öffnen. .Open Source:=sSql, _ ActiveConnection:=cnn, _ CursorType:=adOpenKeyset, _ LockType:=adLockOptimistic, _ Options:=adCmdText ' Wenn Datensätze vorhanden, If Not .BOF And Not .EOF Then ' dann Anzahl der DS ermitteln lCount = .RecordCount ' Recordset ins Array kopieren vRst = .GetRows(lCount) ' Anzahl der Zeilen ermitteln lCount = UBound(vRst, 2) ' Anzahl der Spalten ermitteln lColumns = UBound(vRst, 1) ' Schleife über alle Zeilen For lRow = 0 To lCount ' Ausgabe der Zeilennummer Debug.Print "Zeile: " & lRow & " - " & lRow + 1 & ". Datensatz" Debug.Print String$(45, "=") ' Schleife über alle Spalten For lColumn = 0 To lColumns ' Ausgaben der Spaltenwerte Debug.Print String$(3, " "); "Spalte: " & lColumn; vbTab; "Wert: "; vRst(lColumn, lRow) Next lColumn Debug.Print vbCrLf Next lRow End If End With AdoRecordsetToArray_Exit: On Error GoTo 0 ' Speicher freigeben If Not rst Is Nothing Then rst.Close: Set rst = Nothing If Not cnn Is Nothing Then cnn.Close: Set cnn = Nothing Erase vRst Exit Sub AdoRecordsetToArray_Err: MsgBox "Fehler " & Err.Number & ": " & _ Err.Description, vbCritical, _ "modDaoAdo.AdoRecordsetToArray" Resume AdoRecordsetToArray_Exit End Sub
Hinweis: Da die GetRows-Methode keine Filterung vornehmen kann, sollte das Recordset bereits eine richtige Auswahl der Datensätze enthalten. Das gilt insbesondere im Zusammenhang mit OLE- und Memo-Feldern.