| So wie die Connection die Basis für die Kommunikation zwischen DB und Client ist ist der Recordset das wohl wichtigste Objekt für die Anwendung. Mit ihm werden Daten aus der Datenbank ausgelesen und können dann vom Anwender bearbeitet werden. Wichtige Parameter für Recordsets sind ActiveConnection, Source, LockType, CursorType. ActiveConnection gibt an auf welche (aktive) Connection sich der Recordset beziehen soll. Source gibt an welche Daten angezeigt werden sollen. Source kann sich auf eine Tabelle, eine Abfrage oder eine View beziehen oder man gibt ein eigenes SQL-Statement an. LockType gibt die Sicherheitsstufe des Recordsets an: | Konstante | Beschreibung | | adLockReadOnly | Nur Lesen, Daten können nicht verändert werden [Default] | | adLockPessimistic | Daten werden beim öffnen des Recordsets für andere User gesperrt. | | adLockOptimistic | Daten werden erst beim Update gesperrt. | | adLockBatchOptimistic | Dieser Modus wird nur für Sammelaktualisierungen benützt. | CursorType gibt an wie der Cursor sich verhält: | Konstante | Beschreibung | | adOpenForwardOnly | Dieser Cursor ist der schnellste. Er verbraucht am wenigsten Speicher und Netzresourcen. Cursor kann jedoch nur vorwärts bewegt werden. Änderungen sind Zeilenweise möglich, jedoch nicht für andere User sichtbar. | | adOpenStatic | Ruft eine Kopie der abgefragten Daten ab. Daten können nicht geändert werden. Cursor in alle Richtungen beweglich. | | adOpenKeyset | Dieser Cursor erstellt für jeden Datensatz einen Schlüssel. Er ist schneller als der Static- und der Dynamic-Cursor, da er nicht die ganzen Datensätze lädt sondern nur einen Schlüssel auf den Datensatz. Änderungen und löschen sind möglich und werden anderen Usern angezeigt. Einzig anfügen wird anderen Usern nicht angezeigt. | | adOpenDynamic | Dieser Cursor ist der flexibelste, er ermöglicht alle Bewegungen. Alle Änderungen werden allen angezeigt. Er ist aber auch der ressourcenbeanspruchenste. | Beispiel für Abfrage einer Datenbank: Tabellen & Abfragen Private Sub Form_Load()
Dim Rs As New ADODB.Recordset
With Rs
.CursorType = adOpenDynamic
.LockType = adLockOptimistic
.Open "tblTest", Cn
End With
End Sub Beispiel für Abfrage einer Datenbank: Bei SQL-Statements Private Sub Form_Load()
Dim Rs As New ADODB.Recordset
With Rs
.CursorType = adOpenKeyset
.LockType = adLockPessimistic
.Open "SELECT Nachname, Vorname FROM tblTest " & _
"WHERE Alte > 12", Cn
End With
End Sub Dynamische Recordsets erstellen. Es ist auch möglich eigene Recordsets zu erstellen, welche entweder nur temporär genutzt werden oder später an eine Datenquelle übergeben werden: Private Sub Form_Load()
Dim Rs As New ADODB.Recordset
With Rs
.Fields.Append "Spalte1", adInteger
.Fields.Append "Spalte2", adChar, 255
.Open
End With
End Sub Offline und Lokale Recordsets Recordsets können auch offline bearbeitet werden bzw. lokal zwischengespeichert werden. Über die Methode UpdateBatch können auf einmal alle durchgeführten Änderungen an die Datenbank übergeben werden. Diese Methode kann, richtig eingesetzt, den Datenverkehr im Netzwerk erheblich verringern. Beispiel für Offline Recordsets Option Explicit
Dim Rs As New ADODB.Recordset
Private Sub Form_Load()
cnSet
With Rs
.ActiveConnection = cnT
.CursorLocation = adUseClient
.CursorType = adOpenKeyset
.LockType = adLockBatchOptimistic
.Open "tblTest"
.MoveFirst
End With
End Sub
Private Sub cmdAendern_Click()
Dim i As Integer
For i = 0 To Rs.RecordCount - 1
Rs!Index = i
Rs.MoveNext
Next i
End Sub
Private Sub cmdUpdateAlle_Click()
Rs.UpdateBatch adAffectAllChapters
End Sub Es ist ebenfalls möglich Daten komplett von der Datenquelle zu entfernen und lokal zu speichern. Beispiel für locale Datensätze Option Explicit
Dim Rs As New ADODB.Recordset
Private Sub Form_Load()
With Rs
.ActiveConnection = Cn
.CursorLocation = adUseClient
.CursorType = adOpenKeyset
.LockType = adLockBatchOptimistic
.Open "tblTest"
.MoveFirst
End With
End Sub
Private Sub Form_Unload(Cancel As Integer)
Kill "C:\temp\rstest.dat"
End Sub
Private Sub cmdSpeicherLokal_Click()
Rs.Save "C:\temp\RsTest.dat"
Rs.Close
Rs.ActiveConnection = Nothing
End Sub
Private Sub cmdOeffneLokal_Click()
Rs.Open "C:\temp\RsTest.dat"
End Sub Mit Recordsets arbeiten Über die Methode Sort kann man die Datensätze in einem Recordset nach einem bestimmten Feld entweder aufsteigend (ASC) oder absteigend (DESC) sortieren: Rs.Sort = "Nachname ASC" Mit den Methoden Find oder Filter kann ich bestimmte Daten in meinem Recordset suchen ohne den DataSource neu zu definieren. Beide Methoden lassen aber nur ein Suchkriterium zu. (ACHTUNG: Find liefert nur den ersten gefundenen Datensatz mit dem angegebenen Kriterium!) Um einen bestimmten Datensatz zu suchen: Rs.Find "Nachname = 'Müller'" Um mehrere Datensätze zu erhalten über die Filter-Methode: Rs.Filter = "Alter > 20" Um Objekte mit Recordsets zu füllen muß man erst den DataSource bestimmen und dann das DataField bestimmen: Set Me.Text1.DataSource = Rs
Me.Text1.DataField = "Nachname" Sonstiges Wenn man nur einmal Daten aus einer Datenbank ziehen und an ein Objekt übergeben möchte kann man das auch ohne Recordset-Objekt und kann stattdessen über die Connection ein Execute schicken. z. B. um ein DataGrid einmalig mit Daten zu füllen: Set Me.DataGrid1.DataSource = Cn.Execute("tblTest") |