Was ist ein Cursor?
Vorgänge in einer relationalen Datenbank fungieren für einen vollständigen Satz von Zeilen. Der Satz von Zeilen, die von einer SELECT-Anweisung zurückgegeben werden, besteht aus allen Zeilen, die die Bedingungen in der WHERE-Klausel der Anweisung erfüllen. Dieser vollständige Satz von Zeilen, der von der Anweisung zurückgegeben wird, wird als Ergebnismenge bezeichnet. Anwendungen, insbesondere solche, die interaktiv und online sind, können nicht immer effektiv mit dem gesamten Resultset als 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 bereitstellen.
Ein Cursor wird von einer Cursorbibliothek implementiert. Eine Cursorbibliothek ist Software, die häufig als Teil eines Datenbanksystems oder einer Datenzugriffs-API implementiert wird, die zum Verwalten von Attributen von Daten verwendet wird, die von einer Datenquelle (einem Resultset) zurückgegeben werden. Zu diesen Attributen gehören parallele Verwaltung, Position im Resultset, Anzahl der zurückgegebenen Zeilen und ob Sie vorwärts oder rückwärts (oder beide) durch das Resultset (Scrollbarkeit) wechseln können.
Ein Cursor verfolgt die Position im Resultset und ermöglicht es Ihnen, mehrere Vorgänge zeilenweise mit einem Resultset auszuführen, mit oder ohne zur ursprünglichen Tabelle zurückzukehren. Mit anderen Worten, Cursor geben konzeptionell ein Resultset zurück, das auf Tabellen innerhalb der Datenbanken basiert. Der Cursor ist so benannt, weil er die aktuelle Position im Resultset angibt, genau wie der Cursor auf einem Computerbildschirm die aktuelle Position angibt.
Es ist wichtig, sich mit dem Konzept von Cursorn vertraut zu machen, bevor Sie fortfahren, um die Besonderheiten ihrer Verwendung in ADO zu erlernen.
Mit Cursorn haben Sie folgende Möglichkeiten:
Geben Sie die Positionierung an bestimmten Zeilen im Resultset an.
Dient zum Abrufen einer Zeile oder eines Zeilenblocks basierend auf der aktuellen Ergebnissatzposition.
Ändern Sie Daten in den Zeilen an der aktuellen Position im Resultset.
Definieren Sie unterschiedliche Vertraulichkeitsstufen für Datenänderungen, die von anderen Benutzern vorgenommen wurden.
Ziehen Sie beispielsweise eine Anwendung in Betracht, die eine Liste der verfügbaren Produkte für einen potenziellen Käufer anzeigt. Der Käufer scrollt durch die Liste, um Produktdetails und Kosten anzuzeigen, und wählt schließlich ein Produkt zum Kauf aus. Für den verbleibenden Teil der Liste erfolgt zusätzlicher Bildlauf und eine zusätzliche Auswahl. Was den Käufer betrifft, werden die Produkte einzeln angezeigt, aber die Anwendung verwendet einen Bildlaufcursor, um durch das Resultset nach oben und unten zu navigieren.
Sie können Cursor auf unterschiedliche Weise verwenden:
Ohne jegliche Zeilen.
Mit einigen oder allen Zeilen in einer einzigen Tabelle.
Mit einigen oder allen Zeilen aus logisch verknüpften Tabellen.
Schreibgeschützt oder aktualisierbar auf Cursor- oder Feldebene.
Als nur vorwärts oder vollständig scrollbar.
Wenn sich die Cursortaste auf dem Server befindet.
Empfindlich gegenüber zugrunde liegenden Tabellenänderungen, die durch andere Anwendungen verursacht werden (z. B. Mitgliederschaft, Sortierung, Einfügungen, Aktualisierungen und Löschungen).
Vorhanden auf dem Server oder dem Client.
Schreibgeschützte Cursor helfen Benutzern beim Durchsuchen des Resultsets, und Lese-/Schreibcursor können einzelne Zeilenaktualisierungen implementieren. Komplexe Cursor können mit Keysets definiert werden, die auf Basistabellenzeilen verweisen. Obwohl einige Cursor schreibgeschützt in eine Vorwärtsrichtung sind, können andere hin- und herwechseln und eine dynamische Aktualisierung des Resultsets basierend auf Änderungen bereitstellen, die andere Anwendungen an der Datenbank vornehmen.
Nicht alle Anwendungen müssen Cursor verwenden, um auf Daten zuzugreifen oder diese zu aktualisieren. Einige Abfragen erfordern lediglich keine direkte Zeilenaktualisierung mithilfe eines Cursors. Cursor sollten eine der letzten Techniken sein, die Sie zum Abrufen von Daten auswählen. Anschließend sollten Sie den cursor mit der niedrigsten Auswirkung auswählen. Wenn Sie ein Resultset mithilfe einer gespeicherten Prozedur erstellen, kann das Resultset nicht mithilfe von Cursorbearbeitungs- oder Aktualisierungsmethoden aktualisiert werden.
Gleichzeitigkeit
Bei einigen Mehrbenutzeranwendungen ist es sehr wichtig, dass die daten, die dem Endbenutzer präsentiert werden, so aktuell wie möglich sind. Ein klassisches Beispiel für ein solches System ist ein Flugreservierungssystem, bei dem viele Benutzer möglicherweise für denselben Sitz auf einem bestimmten Flug kämpfen (und daher ein einziger Datensatz). In einem solchen Fall muss der Anwendungsentwurf gleichzeitige Vorgänge für einen einzelnen Datensatz verarbeiten.
In anderen Anwendungen ist die Parallelität nicht so wichtig. In solchen Fällen kann der Aufwand, der dazu dient, die Daten jederzeit aktuell zu halten, nicht gerechtfertigt werden.
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 dieser bestimmten Position im Array zeigt.
Scrollfähigkeit
Der von Ihrer Anwendung verwendete Cursortyp wirkt sich auch auf die Möglichkeit aus, die Zeilen in einem Resultset vorwärts und rückwärts zu durchlaufen; dies wird manchmal als Scrollbarkeit bezeichnet. Die Möglichkeit, vorwärts und rückwärts durch ein Resultset zu bewegen, erhöht die Komplexität des Cursors und ist daher teurer zu implementieren. Aus diesem Grund sollten Sie nur bei Bedarf nach einem Cursor mit dieser Funktion fragen.