Was ist ein Cursor?
Gilt für: Access 2013, Office 2013
Vorgänge in einer relationalen Datenbank fungieren auf einem vollständigen Zeilensatz. Der Zeilensatz, der von einer SELECT-Anweisung zurückgegeben wird, besteht aus allen Zeilen, die den Bedingungen in der WHERE-Klausel der Anweisung entsprechen. Dieser vollständige Zeilensatz, der von der Anweisung zurückgegeben wird, wird als Resultset bezeichnet. Anwendungen, insbesondere interaktive Anwendungen und Onlineanwendungen, können nicht immer effizient mit dem gesamten Resultset als eine Einheit arbeiten. Diese Anwendungen benötigen einen Mechanismus, um jeweils mit einer Zeile oder einem kleinen Zeilenblock zu arbeiten. Cursor sind eine Erweiterung für Resultsets, die diesen Mechanismus anbieten.
Ein Cursor wird von einer Cursorbibliothek implementiert. Eine Cursorbibliothek ist Software, die häufig als Teil eines Datenbanksystems oder einer Datenzugriffs-API implementiert wird und zum Verwalten der Attribute von Daten, die von einer Datenquelle (ein Resultset) zurückgegeben werden, verwendet wird. Zu diesen Attributen zählen Parallelitätsverwaltung, Position im Resultset, Anzahl der zurückgegebenen Zeilen sowie, ob die Navigation vorwärts und/oder rückwärts im Resultset möglich ist (Bildlauffähigkeit).
Ein Cursor verfolgt die Position im Resultset und ermöglicht die zeilenweise Ausführung mehrerer Vorgänge für ein Resultset, wobei zur ursprünglichen Tabelle zurückgekehrt wird, oder auch nicht. Cursor geben also ein Resultset basierend auf Tabellen innerhalb der Datenbanken zurück. Der Cursor heißt so, weil er die aktuelle Position im Resultset angibt, so wie der Cursor auf einem Computerbildschirm die aktuelle Position anzeigt.
Sie sollten sich unbedingt mit dem Cursorkonzept vertraut machen, bevor Sie sich mit den Einzelheiten ihrer Verwendung in ADO beschäftigen.
Cursor ermöglichen Folgendes:
Angeben der Position in bestimmten Zeilen im Resultset.
Abrufen einer Zeile oder eines Zeilenblocks basierend auf der aktuellen Resultsetposition.
Ändern von Daten in den Zeilen an der aktuellen Position im Resultset.
Definieren unterschiedlicher Ebenen der Empfindlichkeit gegenüber Datenänderungen durch andere Benutzer.
Angenommen, eine Anwendung zeigt einem potenziellen Käufer eine Liste verfügbarer Produkte an. Der Käufer führt einen Bildlauf in der Liste aus, um Produktdetails und Kosten anzuzeigen, und wählt schließlich ein Produkt für den Kauf aus. Für den Rest der Liste werden zusätzliche Bildlauf- und Auswahlschritte ausgeführt. Was den Käufer betrifft, werden die Produkte einzeln angezeigt, aber die Anwendung verwendet einen bildlauffähigen Cursor, um das Resultset nach oben und unten zu durchsuchen.
Sie können Cursor auf verschiedene Weise verwenden:
Ohne Zeilen.
Mit einigen oder allen Zeilen in einer einzelnen Tabelle.
Mit einigen oder allen Zeilen aus logisch verknüpften Tabellen.
Als schreibgeschützt oder aktualisierbar auf Cursor- oder Feldebene.
Als Vorwärtscursor oder voll bildlauffähigen Cursor.
Mit dem Cursorkeyset auf dem Server.
Empfindlich für Änderungen an zugrunde liegenden Tabellen durch andere Anwendungen (z. B. Mitgliedschaft, Sortierung, Einfügungen, Aktualisierungen und Löschvorgänge).
Auf dem Server oder auf dem Client vorhanden.
Mit schreibgeschützten Cursorn können Benutzer das Resultset durchsuchen, und Cursor mit Lese-/Schreibzugriff können einzelne Zeilenaktualisierungen implementieren. Komplexe Cursor können mit Keysets definiert werden, die auf Basistabellenzeilen zurückverweisen. Manche Cursor sind für die Vorwärtsnavigation schreibgeschützt, während andere Cursor rückwärts und vorwärts navigieren können und eine dynamische Aktualisierung des Resultsets basierend auf Änderungen durch andere Anwendungen an der Datenbank ermöglichen.
Nicht alle Anwendungen müssen Cursor verwenden, um auf Daten zuzugreifen oder diese zu aktualisieren. Manche Abfragen erfordern keine direkte Zeilenaktualisierung mithilfe eines Cursors. Cursor sollten eines der letzten Verfahren sein, die Sie zum Abrufen von Daten auswählen - und in diesem Fall sollten Sie den Cursor mit dem geringsten Aufwand auswählen. Wenn Sie ein Resultset mithilfe einer gespeicherten Prozedur erstellen, kann das Resultset nicht mit Cursorbearbeitungs- oder Cursoraktualisierungsmethoden aktualisiert werden.
Parallelität
Bei manchen Mehrbenutzeranwendungen müssen die dem Endbenutzer angezeigten Daten unbedingt möglichst aktuell sein. Ein klassisches Beispiel für ein solches System ist ein Flugreservierungssystem, bei dem sich möglicherweise viele Benutzer um den gleichen Platz für einen bestimmten Flug schlagen (und damit einen einzelnen Datensatz). In diesem Fall muss der Anwendungsentwurf gleichzeitige Vorgänge für einen einzelnen Datensatz ermöglichen.
Bei anderen Anwendungen ist die Parallelität nicht so wichtig. In diesen Fällen ist der Aufwand, die Daten ständig auf dem aktuellen Stand zu halten, nicht gerechtfertigt.
Position
Ein Cursor verfolgt auch die aktuelle Position in einem Resultset. Stellen Sie sich die Cursorposition als Zeiger auf den aktuellen Datensatz vor, ähnlich wie ein Arrayindex auf den Wert an eben dieser Position im Array zeigt.
Bildlauffähigkeit
Der von Ihrer Anwendung verwendete Cursortyp wirkt sich auch auf die Fähigkeit aus, sich vorwärts und rückwärts durch die Zeilen in einem Resultset zu bewegen. Dies wird manchmal auch als Scrollfähigkeit bezeichnet. Die Fähigkeit, sich vorwärts und rückwärts durch ein Resultset zu bewegen, erhöht die Komplexität des Cursors und ist daher teurer in der Implementierung. Aus diesem Grund sollten Sie nur bei Bedarf nach einem Cursor mit dieser Funktionalität fragen.