Arbeiten mit Recordsets

Das Recordset-Objekt verfügt über integrierte Features, mit denen Sie die Reihenfolge der Daten im Resultset neu anordnen, nach einem bestimmten Datensatz anhand von Kriterien suchen können, die Sie bereitstellen, und sogar zum Optimieren dieser Suchvorgänge mithilfe von Indizes. Ob diese Features zur Verwendung verfügbar sind, hängt vom Anbieter ab und in einigen Fällen – z. B. von der Index Eigenschaft – die Struktur der Datenquelle selbst.

Anordnen von Daten

Häufig ist die effizienteste Möglichkeit, die Daten in Ihrem Recordset- zu ordnen, indem eine ORDER BY-Klausel im SQL-Befehl angegeben wird, mit der Ergebnisse zurückgegeben werden. Möglicherweise müssen Sie jedoch die Reihenfolge der Daten in einem Recordset- ändern, das bereits erstellt wurde. Mit der Sort-Eigenschaft können Sie die Reihenfolge festlegen, in der Zeilen eines Recordset- durchlaufen werden. Darüber hinaus bestimmt die eigenschaft Filter, auf welche Zeilen beim Durchlaufen von Zeilen zugegriffen werden kann.

Die Sort-Eigenschaft legt einen oder gibt einen String- Wert zurück, der die Feldnamen im Recordset- angibt, nach denen sortiert werden soll. Jeder Name wird durch ein Komma getrennt und gefolgt von optional einem Leerzeichen und dem Schlüsselwort ASC (das das Feld in aufsteigender Reihenfolge sortiert) oder DESC (das das Feld in absteigender Reihenfolge sortiert). Wenn kein Schlüsselwort angegeben wird, wird das Feld standardmäßig in aufsteigender Reihenfolge sortiert.

Der Sortiervorgang ist effizient, da Daten nicht physisch neu angeordnet, sondern in der durch einen Index angegebenen Reihenfolge aufgerufen werden.

Für die Eigenschaft Sort ist es erforderlich, die Eigenschaft CursorLocation auf adUseClientfestzulegen. Für jedes feld, das in der Sort-Eigenschaft angegeben ist, wird ein temporärer Index erstellt, wenn noch kein Index vorhanden ist.

Wenn Sie die eigenschaft Sort auf eine leere Zeichenfolge festlegen, werden die Zeilen auf ihre ursprüngliche Reihenfolge zurückgesetzt und temporäre Indizes gelöscht. Vorhandene Indizes werden nicht gelöscht.

Angenommen, ein Recordset- enthält drei Felder mit den Namen firstName, middleInitialund Nachname. Legen Sie die eigenschaft Sort auf die Zeichenfolge "lastName DESC, firstName ASC", die das Recordset nach Nachname in absteigender Reihenfolge und dann nach Vorname in aufsteigender Reihenfolge sortiert. Die mittlere Initiale wird ignoriert.

In einer Sortierkriterienzeichenfolge kann kein Feld mit dem Namen "ASC" oder "DESC" bezeichnet werden, da diese Namen mit den Schlüsselwörtern ASC- und DESC-in Konflikt stehen. Weisen Sie einem Feld mit einem konfliktierenden Namen ein Alias zu, indem Sie das Schlüsselwort AS in der Abfrage verwenden, die das -Datensatzzurückgibt.

Weitere Informationen zu Recordset- Filterung finden Sie weiter unten in diesem Thema unter "Filtern der Ergebnisse".

Suchen eines bestimmten Datensatzes

ADO stellt die Methoden Find und Seek bereit, um einen bestimmten Datensatz in einem Recordset-zu finden. Die Find-Methode wird von einer Vielzahl von Anbietern unterstützt, ist jedoch auf ein einzelnes Suchkriterium beschränkt. Die Seek-Methode unterstützt die Suche nach mehreren Kriterien, wird jedoch von vielen Anbietern nicht unterstützt.

Indizes für Felder können die Leistung der Find-Methode erheblich verbessern und Sort und Filter Eigenschaften des Recordset-Objekts filtern. Sie können einen internen Index für ein Field-Objekt erstellen, indem Sie die dynamische Optimize-Eigenschaft festlegen. Diese dynamische Eigenschaft wird der Properties -Auflistung des Field -Objekts hinzugefügt, wenn Sie die eigenschaft CursorLocation auf adUseClientfestlegen. Denken Sie daran, dass dieser Index intern für ADO ist – Sie können keinen Zugriff darauf erhalten oder für andere Zwecke verwenden. Außerdem unterscheidet sich dieser Index von der eigenschaft Index des Recordset-Objekts.

Die Find-Methode sucht schnell einen Wert innerhalb einer Spalte (Feld) eines Recordset-. Sie können die Geschwindigkeit der Find-Methode für eine Spalte häufig verbessern, indem Sie die Eigenschaft Optimize verwenden, um einen Index dafür zu erstellen.

Die Find-Methode beschränkt die Suche auf den Inhalt eines Felds. Die Seek-Methode erfordert, dass Sie über einen Index verfügen und auch andere Einschränkungen haben. Wenn Sie nach mehreren Feldern suchen müssen, die nicht die Basis eines Indexes sind oder wenn Ihr Anbieter Indizes nicht unterstützt, können Sie Die Ergebnisse mithilfe der Filter--Eigenschaft des Recordset--Objekts einschränken.

Finden

Die Find-Methode durchsucht ein Recordset- für die Zeile, die ein bestimmtes Kriterium erfüllt. Optional kann die Richtung der Suche, der Anfangszeile und des Offsets aus der Anfangszeile angegeben werden. Wenn das Kriterium erfüllt ist, wird die aktuelle Zeilenposition für den gefundenen Datensatz festgelegt; andernfalls wird die Position je nach Suchrichtung auf das Ende (oder den Anfang) des Recordsetfestgelegt.

Für das Kriterium kann nur ein Spaltenname angegeben werden. Mit anderen Worten, diese Methode unterstützt keine mehrspaltigen Suchvorgänge.

Der Vergleichsoperator für das Kriterium kann ">" (größer als), "<" (kleiner als), "=" (gleich), ">=" (größer oder gleich), "<=" (kleiner oder gleich), "<>" (nicht gleich) oder "LIKE" (für Mustervergleich) sein.

Der Kriteriumswert kann eine Zeichenfolge, Gleitkommazahl oder ein Datum sein. Zeichenfolgenwerte werden durch einfache Anführungszeichen oder "#" (Nummernzeichen) getrennt (z. B. "state = 'WA'" oder "state = #WA#"). Datumswerte werden durch "#" (Nummernzeichen) getrennt (z. B. "start_date > #7/22/97#").

Wenn der Vergleichsoperator "like" lautet, kann der Zeichenfolgenwert ein Sternchen (*) enthalten, um ein oder mehrere Vorkommen eines beliebigen Zeichens oder einer Teilzeichenfolge zu finden. "State like 'M*'" entspricht beispielsweise Maine und Massachusetts. Sie können auch führende und nachfolgende Sternchen verwenden, um eine Teilzeichenfolge zu finden, die in den Werten enthalten ist. Beispielsweise entsprechen "Bundesland wie '*as*'" Alaska, Arkansas und Massachusetts.

Sternchen können nur am Ende einer Kriterienzeichenfolge oder am Anfang und Ende einer Kriterienzeichenfolge verwendet werden, wie zuvor gezeigt. Sie können das Sternchen nicht als führendes Wildcardzeichen ('*str') oder eingebettete Wildcard ('s*r') verwenden. Dies führt zu einem Fehler.

Suchen und Index

Verwenden Sie die Seek-Methode zusammen mit der eigenschaft Index, wenn der zugrunde liegende Anbieter Indizes für das Recordset-Objekt unterstützt. Verwenden Sie die Supports(adSeek) Methode, um zu bestimmen, ob der zugrunde liegende Anbieter Seekunterstützt, und die Supports(adIndex) Methode, um zu bestimmen, ob der Anbieter Indizes unterstützt. (Beispielsweise unterstützt der OLE DB-Anbieter für Microsoft JetSeek und Index.)

Wenn Seek die gewünschte Zeile nicht findet, tritt kein Fehler auf, und die Zeile wird am Ende des Recordsetpositioniert. Legen Sie die Index-Eigenschaft auf den gewünschten Index fest, bevor Sie diese Methode ausführen.

Diese Methode wird nur mit serverseitigen Cursorn unterstützt. Seek wird nicht unterstützt, wenn der Eigenschaftswert CursorLocation des Recordset-Objekts adUseClientist.

Diese Methode kann nur verwendet werden, wenn das Recordset-Objekt mit dem CommandTypeEnum-Wert von adCmdTableDirectgeöffnet wurde.

Filtern der Ergebnisse

Die Find-Methode beschränkt die Suche auf den Inhalt eines Felds. Die Seek-Methode erfordert, dass Sie über einen Index verfügen und auch andere Einschränkungen haben. Wenn Sie nach mehreren Feldern suchen müssen, die nicht die Basis eines Indexes sind oder wenn Ihr Anbieter Indizes nicht unterstützt, können Sie Die Ergebnisse mithilfe der Filter--Eigenschaft des Recordset-objekts-Objekts einschränken.

Verwenden Sie die Eigenschaft Filter, um Datensätze in einem Recordset-Objekt selektiv herauszufiltern. Das gefilterte Recordset- wird zum aktuellen Cursor. Dies bedeutet, dass Datensätze, die die Filter- Kriterien nicht erfüllen, im Recordset- nicht verfügbar sind, bis das Filter- entfernt wird. Andere Eigenschaften, die Werte basierend auf dem aktuellen Cursor zurückgeben, sind betroffen, z. B. AbsolutePosition, AbsolutePage-, RecordCount-und PageCount. Dies liegt daran, dass das Festlegen der eigenschaft Filter auf einen bestimmten Wert den aktuellen Datensatz in den ersten Datensatz verschebt, der den neuen Wert erfüllt.

Die Filter--Eigenschaft verwendet ein Variant-Argument. Dieser Wert stellt eine von drei Methoden zur Verwendung der -Filter-Eigenschaft dar: ein Kriterienstring, eine -FilterGroupEnum-Konstante oder ein Array von Lesezeichen. Weitere Informationen finden Sie unter Filtern mit einer Kriterienzeichenfolge, Filtern mit einer Konstante und Filtern mit Lesezeichen weiter unten in diesem Thema.

Anmerkung

Wenn Sie die daten kennen, die Sie auswählen möchten, ist es in der Regel effizienter, ein Recordset- mit einer SQL-Anweisung zu öffnen, die das Resultset effektiv filtert, anstatt auf die eigenschaft Filter zu vertrauen.

Um einen Filter aus einem Recordset-zu entfernen, verwenden Sie die Konstante adFilterNone. Das Festlegen der Filter--Eigenschaft auf eine leere Zeichenfolge ("") hat den gleichen Effekt wie die Verwendung der adFilterNone Konstante.

Filtern mit einer Kriterienzeichenfolge

Die Kriterienzeichenfolge besteht aus Klauseln im Format FieldName Operator Value (z. B. "LastName = 'Smith'"). Sie können zusammengesetzte Klauseln erstellen, indem Sie einzelne Klauseln mit AND (z. B. "LastName = 'Smith' AND FirstName = 'John'") und OR- (z. B. "LastName = 'Smith' OR LastName = 'Jones'") verketten. Verwenden Sie die folgenden Richtlinien für Kriterienzeichenfolgen:

  • FieldName- muss ein gültiger Feldname aus dem Recordset-sein. Wenn der Feldname Leerzeichen enthält, müssen Sie den Namen in eckige Klammern einschließen.

  • Operator muss eine der folgenden sein: <, >, <=, >=, <>, =oder WIE.

  • Wert ist der Wert, mit dem Sie die Feldwerte vergleichen (z. B. 'Smith', #8/24/95#, 12.345oder $50.00). Verwenden Sie einfache Anführungszeichen (') für Zeichenfolgen und Rautezeichen (#) für Datumsangaben. Für Zahlen können Sie Dezimalkomma, Dollarzeichen und wissenschaftliche Schreibweise verwenden. Wenn OperatorLIKEist, können Wert- Wildcardzeichen verwenden. Es sind nur das Sternchen (*) und das Prozentzeichen (%) Platzhalterzeichen zulässig, und sie müssen das letzte Zeichen in der Zeichenfolge sein. Wert darf nicht null sein.

    Anmerkung

    Um einfache Anführungszeichen (') in den Filter Werteinzuschließen, verwenden Sie zwei einfache Anführungszeichen, um eins darzustellen. Um z. B. nach O'Malleyzu filtern, sollte "col1 = 'O''Malley'"als Kriterienzeichenfolge verwendet werden. Um einfache Anführungszeichen am Anfang und Ende des Filterwerts einzuschließen, schließen Sie den Text in Rautezeichen (#) ein. Um z. B. nach "1"zu filtern, sollte die Kriterienzeichenfolge "col1 = #'1'#"sein.

Es gibt keinen Vorrang zwischen UND und ODER. Klauseln können innerhalb von Klammern gruppiert werden. Sie können jedoch keine Klauseln gruppieren, die mit einem ODER- verknüpft sind, und dann die Gruppe mit einer AND-Klausel wie folgt zu einer anderen Klausel verbinden.

(LastName = 'Smith' OR LastName = 'Jones') AND FirstName = 'John'  

Stattdessen würden Sie diesen Filter wie folgt erstellen.

(LastName = 'Smith' AND FirstName = 'John') OR (LastName = 'Jones' AND FirstName = 'John')  

In einer LIKE-Klausel können Sie ein Wildcard am Anfang und Ende des Musters (z. B. LastName Like '*mit*') oder nur am Ende des Musters (z. B. LastName Like 'Smit*') verwenden.

Filtern mit einer Konstante

Die folgenden Konstanten können zum Filtern von Recordsetsverwendet werden.

Konstante Beschreibung
adFilterAffectedRecords- Filter zum Anzeigen von Datensätzen, die durch den letzten Aufruf von Delete, Resync, UpdateBatchoder CancelBatch betroffen sind.
adFilterConflictingRecords Filter zum Anzeigen der Datensätze, bei denen die letzte Batchaktualisierung fehlgeschlagen ist.
adFilterFetchedRecords- Filter zum Anzeigen von Datensätzen im aktuellen Cache, das heißt die Ergebnisse des letzten Abrufs von Datensätzen aus der Datenbank.
adFilterNone Entfernt den aktuellen Filter und stellt alle Datensätze zum Anzeigen wieder her.
adFilterPendingRecords- Filter zum Anzeigen von Datensätzen, die sich geändert haben, aber noch nicht an den Server gesendet wurden. Gilt nur für den Batchaktualisierungsmodus.

Die Filterkonstanten erleichtern das Beheben einzelner Datensatzkonflikte während des Batchaktualisierungsmodus, indem Sie beispielsweise nur die Datensätze anzeigen können, die während des letzten UpdateBatch Methodenaufrufs betroffen waren, wie im folgenden Beispiel gezeigt.

Attribute VB_Name = "modExaminingData"

Filtern mit Lesezeichen

Schließlich können Sie ein Variantenarray von Textmarken an die eigenschaft Filter übergeben. Der resultierende Cursor enthält nur die Datensätze, deren Textmarke an die Eigenschaft übergeben wurde. Im folgenden Codebeispiel wird ein Array von Lesezeichen aus den Datensätzen in einem Recordset- erstellt, die im Feld ProductName ein "B" enthalten. Anschließend wird das Array an die eigenschaft Filter übergeben und Informationen zum resultierenden gefilterten Recordset-angezeigt.

'BeginFilterBkmk  
Dim vBkmkArray() As Variant  
Dim i As Integer  
  
'Recordset created using "SELECT * FROM Products" as command.  
'So, we will check to see if ProductName has a capital B, and  
'if so, add to the array.  
i = 0  
Do While Not objRs.EOF  
    If InStr(1, objRs("ProductName"), "B") Then  
        ReDim Preserve vBkmkArray(i)  
        vBkmkArray(i) = objRs.Bookmark  
        i = i + 1  
        Debug.Print objRs("ProductName")  
    End If  
    objRs.MoveNext  
Loop  
  
'Filter using the array of bookmarks.  
objRs.Filter = vBkmkArray  
  
objRs.MoveFirst  
Do While Not objRs.EOF  
    Debug.Print objRs("ProductName")  
    objRs.MoveNext  
Loop  
'EndFilterBkmk  

Erstellen eines Klons eines Recordsets

Verwenden Sie die Clone-Methode, um mehrere, duplizierte Recordset- Objekte zu erstellen, insbesondere, wenn Sie mehr als einen aktuellen Datensatz in einer bestimmten Datensatzgruppe verwalten möchten. Die Verwendung der Clone-Methode ist effizienter als das Erstellen und Öffnen eines neuen Recordset-Objekts mit derselben Definition wie das Original.

Der aktuelle Datensatz eines neu erstellten Klons wird ursprünglich auf den ersten Datensatz festgelegt. Der aktuelle Zeiger im geklonten -Datensatz ist nicht mit dem Original synchronisiert oder umgekehrt. Sie können in jedem Datensatzunabhängig navigieren.

Änderungen, die Sie an einem Recordset--Objekt vornehmen, sind unabhängig vom Cursortyp in allen Klonen sichtbar. Nachdem Sie jedoch Requery für das ursprüngliche Recordset-ausgeführt haben, werden die Klonen nicht mehr mit dem Original synchronisiert.

Das Schließen des ursprünglichen -Recordset schließt dessen Kopien nicht, und genauso schließt das Schließen einer Kopie weder das Original noch eine der anderen Kopien.

Sie können ein Recordset-objekt nur klonen, wenn es Lesezeichen unterstützt. Textmarkenwerte sind austauschbar; d. h. ein Textmarkenverweis aus einem Recordset Objekt bezieht sich auf denselben Datensatz in einem seiner Klone.