KEYSET-Cursor

Mit seiner Fähigkeit, Änderungen zu erkennen, bietet der Keysetcursor Funktionalität zwischen einem statischen und einem dynamischen Cursor. Wie ein statischer Cursor ermittelt er nicht immer Änderungen an der Mitgliedschaft und Reihenfolge des Resultsets. Wie ein dynamischer Cursor ermittelt er Änderungen an den Werten der Zeilen im Resultset.

Keysetgesteuerte Cursor werden von einer Reihe von eindeutigen Bezeichnern (Schlüssel) gesteuert, die als das Keyset bezeichnet werden. Die Schlüssel werden anhand einer Reihe von Spalten erstellt, die die Zeilen im Resultset eindeutig identifizieren. Das Keyset besteht aus Schlüsselwerten aus allen Zeilen, die von der Abfrageanweisung zurückgegeben werden.

Mit einem keysetgesteuerten Cursor wird für jede Zeile im Cursor ein Schlüssel erstellt und gespeichert, der wiederum entweder auf der Clientarbeitsstation oder dem Server gespeichert wird. Wenn Sie auf eine beliebige Zeile zugreifen, wird der gespeicherte Schlüssel zum Abrufen der aktuellen Datenwerte aus der Datenquelle verwendet. In einem keysetgesteuerter Cursor wird die Mitgliedschaft des Resultsets fixiert, wenn das Keyset vollständig gefüllt wurde. Daher sind Ergänzungen und Updates, die die Mitgliedschaft betreffen, nicht Teil des Resultsets, bis dieses neu geöffnet wird.

Änderungen an Datenwerten – entweder durch den Besitzer des Keysets oder andere Prozesse – sind sichtbar, wenn Benutzer*innen durch das Resultset scrollen. INSERTs außerhalb des Cursors (durch andere Prozesse) sind nur sichtbar, wenn der Cursor beendet und neu gestartet wird. INSERTs innerhalb des Cursors werden am Ende des Resultsets angezeigt.

Wenn ein keysetgesteuerter Cursor versucht, eine gelöschte Zeile abzurufen, wird die Zeile als „Loch“ im Resultset angezeigt. Der Schlüssel für die Zeile ist im Keyset enthalten, aber die Zeile ist nicht mehr im Resultset vorhanden. Wenn die Schlüsselwerte in einer Zeile aktualisiert werden, wird die Zeile als gelöscht erachtet und dann eingefügt, sodass solche Zeilen auch als Löcher im Resultset angezeigt werden. Während ein keysetgesteuerter Cursor immer Zeilen erkennen kann, die von anderen Prozessen gelöscht werden, kann er optional die Schlüssel für Zeilen entfernen, die er selbst löscht. Diese keysetgesteuerten Cursors können ihre eigenen Löschungen nicht erkennen, da die Beweise entfernt wurden.

Ein Update einer Schlüsselspalte ist vergleichbar mit dem Löschen des alten Schlüssels gefolgt vom Einfügen des neuen Schlüssels. Der neue Schlüsselwert ist nicht sichtbar, wenn das Update nicht über den Cursor vorgenommen wurde. Wenn die Aktualisierung über den Cursor erfolgt ist, wird der neue Schlüsselwert am Ende des Resultsets angezeigt.

Es gibt eine Variation von keysetgesteuerten Cursors, die als keysetgesteuerte Standardcursor bezeichnet werden. Bei einem keysetgesteuerten Standardcursor werden die Mitgliedschaft von Zeilen im Resultset und die Reihenfolge der Zeilen beim Öffnen des Cursors behoben, doch Änderungen an Werten, die vom Cursorbesitzer vorgenommen werden, und die von anderen Prozessen durchgeführten Änderungen werden angezeigt. Wenn eine Änderung eine Zeile für die Mitgliedschaft disqualifiziert oder sich auf die Reihenfolge einer Zeile auswirkt, wird die Zeile nicht ausgeblendet oder verschoben, es sei denn, der Cursor wird geschlossen und wieder geöffnet. Eingefügte Daten werden nicht angezeigt, doch Änderungen an vorhandenen Daten werden angezeigt, wenn die Zeilen abgerufen werden.

Es ist schwierig, den keysetgesteuerten Cursor ist korrekt zu verwenden, da die Empfindlichkeit für Datenänderungen wie oben beschrieben von vielen verschiedenen Umständen abhängt. Wenn Ihre Anwendung jedoch keine gleichzeitigen Updates bearbeiten muss, fehlerhafte Schlüssel programmgesteuert behandeln kann und direkt auf bestimmte schlüsselgebundene Zeilen zugreifen muss, ist der keysetgesteuerte Cursor möglicherweise eine Lösung für Sie. Verwenden Sie adOpenKeyset CursorTypeEnum, um anzugeben, dass Sie einen Keysetcursor in ADO verwenden möchten.

Weitere Informationen

Vorwärtscursor
Statische Cursor
Dynamische Cursor