Freigeben über


Weitere Möglichkeiten zum Navigieren in einem Recordset

Die folgenden vier Methoden werden zum Navigieren oder Scrollen im Recordset verwendet: MoveFirst, MoveLast, MoveNext und MovePrevious. (Einige dieser Methoden sind für Vorwärtscursor nicht verfügbar.)

MoveFirst ändert die aktuelle Datensatzposition in den ersten Datensatz im Recordset. MoveLast ändert die aktuelle Datensatzposition in den letzten Datensatz im Recordset. Zum Verwenden von MoveFirst oder MoveLast muss das Recordset-Objekt Textmarken oder Rückwärtsbewegungen des Cursors unterstützen. Andernfalls generiert der Methodenaufruf einen Fehler.

MoveNext verschiebt die aktuelle Datensatzposition um eine Stelle nach vorn. Wenn Sie sich beim Aufrufen von MoveNext im letzten Datensatz befinden, wird EOF auf True festgelegt. MovePrevious verschiebt die aktuelle Datensatzposition um eine Stelle zurück. Wenn Sie sich beim Aufrufen von MovePrevious im ersten Datensatz befinden, wird BOF auf True festgelegt. Bei Verwendung dieser Methoden ist es ratsam, die EOF- und BOF-Eigenschaften zu überprüfen und den Cursor zurück zu einer gültigen aktuellen Datensatzposition zu verschieben, wenn sie sich wie hier gezeigt vom einen oder anderen Ende des Recordset aus bewegen:

. . .  
oRs.MoveNext  
If oRs.EOF Then oRs.MoveLast  
. . .   

Oder im Fall der MovePrevious-Methode:

. . .   
oRs.MovePrevious  
If oRs.BOF Then oRs.MoveFirst  
. . .  

In Fällen, in denen das Recordset gefiltert oder sortiert wurde und die Daten des aktuellen Datensatzes geändert werden, kann sich die Position ebenfalls ändern. In solchen Fällen funktioniert die MoveNext-Methode normal. Beachten Sie jedoch, dass sich die Position von der neuen (nicht der alten) Position aus um einen Datensatz nach vorn verschiebt. Wenn Sie beispielsweise die Daten im aktuellen Datensatz ändern, sodass der Datensatz an das Ende des sortierten Recordset verschoben wird, führt das Aufrufen von MoveNext dazu, dass der aktuelle Datensatz von ADO auf die Position hinter dem letzten Datensatz im Recordset (EOF = True) festgelegt wird.

Das Verhalten der verschiedenen Move-Methoden des Recordset-Objekts hängt bis zu einem gewissen Grad von den Daten im Recordset ab. Neue Datensätze, die dem Recordset hinzugefügt werden, werden zunächst in einer bestimmten Reihenfolge hinzugefügt, die von der Datenquelle definiert wird und implizit oder explizit von den Daten im neuen Datensatz abhängig sein kann. Wenn beispielsweise eine Sortierung oder eine Verknüpfung innerhalb der Abfrage ausgeführt wird, die das Recordset auffüllt, wird der neue Datensatz an der entsprechenden Stelle im Recordset eingefügt. Wenn die Sortierung beim Erstellen des Recordset nicht explizit angegeben wird, können Änderungen in der Datenquellenimplementierung dazu führen, dass die Reihenfolge der zurückgegebenen Zeilen versehentlich geändert wird. Darüber hinaus können sich die Sortier-, Filter- und Bearbeitungsfunktionen des Recordset auf die Reihenfolge auswirken und möglicherweise darauf welche Zeilen im Recordset sichtbar sind.

Daher sind MoveNext, MovePrevious, MoveFirst, MoveLast und Move alle für andere Vorgänge vertraulich, die auf demselben Recordset ausgeführt werden. ADO versucht immer, Ihre aktuelle Position beizubehalten, bis Sie sie explizit verschieben. Aber manchmal machen eingreifende Änderungen es schwierig, die Auswirkungen einer nachfolgenden Verschiebung zu verstehen. Wenn Sie z. B. MoveFirst aufrufen, um sich in der ersten Zeile eines sortierten Recordset zu positionieren und die Sortierung von aufsteigender Reihenfolge in absteigende Reihenfolge ändern, befinden Sie sich immer noch in derselben Zeile – aber jetzt ist es die letzte Zeile im Recordset. MoveFirst führt Sie zu einer anderen Zeile (die neue erste Zeile).

Wenn Sie als weiteres Beispiel in einer bestimmten Zeile in der Mitte eines Recordsets positioniert sind und erst Delete und dann MoveNext aufrufen, befinden Sie sich jetzt an dem Datensatz, der unmittelbar auf den gelöschten Datensatz folgt. Durch Aufrufen von MovePrevious wird der Datensatz vor dem gelöschten Datensatz zum aktuellen Datensatz, da der gelöschte Datensatz in der aktiven Mitgliedschaft des Recordset nicht mehr gezählt wird.

Es ist besonders schwierig, anbieterübergreifende einheitliche Move-Semantik für Methoden zu definieren, die angesichts der sich ändernden Daten im aktuellen Datensatz relativ zum aktuellen Datensatz verschoben werden – MovePrevious, MoveNext und Move. Wenn Sie z. B. mit einem sortierten, gefilterten Recordset arbeiten und die Daten im aktuellen Datensatz so ändern, dass sie allen anderen Datensätzen vorangestellt würden, aber ihre geänderten Daten auch nicht mehr mit dem Filter übereinstimmen, ist nicht klar, wohin Sie ein MoveNext-Vorgang führen würde. Der sicherste Schluss ist, dass die relative Bewegung innerhalb eines Recordset riskanter als absolute Bewegung (z. B. MoveFirst oder MoveLast) ist, wenn sich die Daten ändern, während Datensätze bearbeitet, hinzugefügt oder gelöscht werden. Sortierung und Filterung sollten auf einem Primärschlüssel oder einer ID basieren, da sich dieser Werttyp nicht ändern sollte.