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 :o)! 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

HinweisHinweis: 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.