Cursortypen
Microsoft SQL Server 2005 Compact Edition (SQL Server Compact Edition) verwendet Cursor, die vergleichbar mit Cursorn in SQL Server sind. Die Unterschiede werden in diesem Abschnitt näher erläutert. Eine vollständige Beschreibung von Datenbankcursorn finden Sie in der Onlinedokumentation zu SQL Server.
SQL Server Compact Edition unterstützt die folgenden Cursortypen:
- Basistabellencursor
- Statische Cursor
- Vorwärtscursor
- Schreibgeschützte Vorwärtscursor
- Keysetgesteuerte Cursor
Basistabellencursor
Basistabellencursor sind Cursor der untersten Ebene. Diese Cursor greifen direkt auf das Speichermodul zu und sind von allen unterstützten Cursortypen am schnellsten. Basistabellencursor können bei geringen Kosten vorwärts oder rückwärts gescrollt und aktualisiert werden.
Sie können einen Cursor auch direkt in einem Index öffnen. Indizes werden zur Sortierung der Zeilen in einer Tabelle unterstützt, damit nach bestimmten Werten gesucht werden kann und die Zeilen anhand eines Wertebereichs innerhalb eines Index eingeschränkt werden können.
Basistabellencursor zeichnen sich durch eine dynamische Mitgliedschaft aus. Das bedeutet, dass zwei Cursor, die über derselben Tabelle geöffnet werden, sofort Einfügungen, Löschungen und Änderungen an den Daten erkennen können, sofern sich beide im gleichen Transaktionsbereich befinden. Da Basistabellencursor aktualisiert werden können, ist es Clients möglich, Änderungen an den zugrunde liegenden Daten mithilfe dieses Cursortyps vorzunehmen.
Basistabellencursor sind nicht in der Lage, das Ergebnis einer Abfrage darzustellen. Ergebnisse von Abfragen, wie z. B. SELECT * FROM tablename
, werden nicht über einen Basistabellencursor zurückgegeben. Anstelle dessen wird einer der unterstützten Abfrageergebniscursor verwendet.
Folgendes ist ein Beispiel für das Beziehen eines Basistabellencursors mithilfe von ADO.NET.
//Base Table Cursor
cmd.CommandText = "tablename";
cmd.CommandType = CommandType.TableDirect;
SqlCeResultSet rs = cmd.ExecuteResultSet(ResultSetOptions.Scrollable | ResultSetOptions.Updatable);
Folgendes ist ein Beispiel für das Beziehen eines Indexcursors mithilfe von ADO.NET.
cmd.CommandText = "tablename";
cmd.IndexName = "indexname";
cmd.CommandType = CommandType.TableDirect;
SqlCeResultSet rs = cmd.ExecuteResultSet(ResultSetOptions.Scrollable | ResultSetOptions.Updatable);
Statische Cursor
Ein statischer Cursor, der in früheren Versionen von SQL Server Compact Edition auch als scrollfähiger Abfragecursor bezeichnet wurde, erstellt und speichert eine vollständige Kopie des Resultsets. Ausgenommen sind Daten vom Wert long, die abgerufen werden, wenn sie explizit von einem Benutzer angefordert werden. Dieses Resultset wird nur bei Bedarf gefüllt. Bei SQL Server hingegen wird das Resultset beim Erstellen des Cursors aufgefüllt. Statische Cursor können vorwärts und rückwärts gescrollt werden, unterstützen jedoch keine Aktualisierungen. Externe Änderungen an insensitiven Daten können sie nicht erkennen. Die Abfrageergebnisse werden auf Lebenszeit des Cursors zwischengespeichert. Obwohl statische Cursor funktioneller als Vorwärtscursor sind, sind statische Cursor langsamer und benötigen mehr Speicherplatz. Es wird empfohlen, statische Cursor nur dann zu verwenden, wenn Scrollen erforderlich ist und ein Keysetcursor ungeeignet ist.
Folgendes ist ein Beispiel für das Beziehen eines statischen Cursors mithilfe von ADO.NET.
cmd.CommandText = "Select * from tablename";
SqlCeResultSet rs = cmd.ExecuteResultSet(ResultSetOptions.Scrollable | ResultSetOptions.Insensitive);
Vorwärtscursor
Vorwärtscursor sind die schnellsten Cursor, die aktualisiert werden können, doch unterstützen sie kein Scrollen. Bei diesem Cursortyp können die Zeilen nur seriell vom Anfang bis zum Ende des Cursors abgerufen werden. Die Zeilen werden beim Abrufen aus der Datenbank übertragen. Alle Ergebnisse von INSERT-, UPDATE- und DELETE-Anweisungen, die vom aktuellen Benutzer oder durch Commits anderer Benutzer ausgelöst worden sind und sich auf Zeilen im Resultset auswirken, werden beim Abrufen der Zeilen aus dem Cursor sichtbar. Da der Cursor nicht rückwärts gescrollt werden kann, sind Änderungen an Zeilen in der Datenbank nach dem Abrufen der Zeile mithilfe des Cursors nicht sichtbar.
Vorwärtscursor und schreibgeschützte Vorwärtscursor sind die schnellsten abfragebasierten Cursor. Sie sollten in Szenarien verwendet werden, in denen Geschwindigkeit und Speicherplatz ausschlaggebend sind.
Folgendes ist ein Beispiel für das Beziehen eines Vorwärtscursors mithilfe von ADO.NET.
cmd.CommandText = "Select * from tablename";
SqlCeResultSet rs = cmd.ExecuteResultSet(ResultSetOptions.Updatable);
Schreibgeschützte Vorwärtscursor
Schreibgeschützte Vorwärtscursor, in früheren Versionen von SQL Server Compact Edition auch als Vorwärtscursor bezeichnet, sind die schnellsten Cursor, können jedoch nicht aktualisiert werden.
Folgendes ist ein Beispiel für das Beziehen eines schreibgeschützten Vorwärtscursors mithilfe von ADO.NET.
cmd.CommandText = "Select * from tablename";
SqlCeResultSet rs = cmd.ExecuteResultSet(ResultSetOptions.None);
Hinweis Bei einer Abfrage, die nur schreibgeschützte Spalten zurückgibt, können Sie keine Schreibschutzcursor erstellen, da intern alle SQL Server Compact Edition-Cursor aktualisiert werden können. SQL Server Compact Edition kann keine in SqlCeResultSet zurückgegebenen Schreibschutzcursor aktualisieren. Deshalb schlägt der Vorgang unter Ausgabe der Fehlermeldung "Ein aktualisierbarer Cursor kann für die Abfrage nicht generiert werden. Es ist keine aktualisierbare Spalte vorhanden." fehl.
Keysetgesteuerte Cursor
Bei einem keysetgesteuerten Cursor in SQL Server Compact Edition handelt es sich um einen scrollfähigen Cursor, den Sie aktualisieren können. Ein keysetgesteuerter Cursor wird durch eine Reihe physischer Bezeichner gesteuert, die als Keyset bezeichnet werden. Das Keyset basiert auf allen Zeilen, die zum Zeitpunkt des Öffnens des Cursors für die SELECT-Anweisung qualifiziert wurden. Das Keyset wird beim Öffnen des Cursors in einer temporären Tabelle erstellt. Bei einem keysetgesteuerten Cursor wird die Mitgliedschaft zum Zeitpunkt der Ausführung der Abfrage ermittelt.
Keysetgesteuerte Cursor in SQL Server Compact Edition weichen geringfügig von jenen in SQL Server ab. In SQL Server verwendet der keysetgesteuerte Cursor eine Reihe eindeutiger Bezeichner als Schlüssel im Keyset. In SQL Server Compact Edition sind die Schlüssel Textmarken für die Stellen, an denen Werte logisch in einer Tabelle gespeichert sind. Sie sind keine eindeutigen Bezeichner.
Obwohl keysetgesteuerte Cursor eine Reihe von Änderungen erkennen können, sind sie nicht so empfindlich wie andere Cursor. So wird beispielsweise eine Einfügung außerhalb des Cursors nicht erkannt, obwohl Einfügungen innerhalb des Cursors schließlich erkannt werden. In diesem Fall wird empfohlen, den Cursor zu schließen und erneut zu öffnen oder einen der Vorwärtscursor zu verwenden.
Da SQL Server Compact Edition Textmarker zur Definition eines Keysets verwendet, sind alle Änderungen an Datenwerten für im Keyset enthaltene Zeilen beim Verwenden des Cursors sichtbar. Dies trifft sowohl bei Änderungen innerhalb als auch außerhalb des Cursors zu.
Bei Löschungen in einem Keysetcursor, gleich ob innerhalb oder außerhalb des Cursors, wird beim Versuch, die Zeile abzurufen, diese als gelöscht gemeldet.
Folgendes ist ein Beispiel für das Beziehen eines keysetgesteuerten Cursors mithilfe von ADO.NET.
cmd.CommandText = "Select * from tablename";
SqlCeResultSet rs = cmd.ExecuteResultSet(ResultSetOptions.Scrollable | ResultSetOptions.Updatable);
Arbeiten mit Verknüpfungen
Wenn die zum Öffnen eines keysetgesteuerten Cursors verwendete Abfrage verknüpfte Spalten enthält, können diese Spalten nicht aktualisiert werden. Der Benutzer kann zwar neue Werte in diese Spalten einfügen, doch werden Aktualisierungen nicht unterstützt.
Wird das Keyset zum Auffüllen eines Steuerelements verwendet (beispielsweise einem DataGrid-Objekt), das von Benutzern aktualisiert werden kann, wird von diesen Benutzern möglicherweise versucht, die Werte im Steuerelement zu aktualisieren. Die Aktualisierung schlägt dann fehl. Wenn Sie eine Anwendung entwickeln, in der die Daten verknüpfter Spalten mithilfe von DataGrid angezeigt werden, müssen Sie den Schreibschutz der verknüpften Spalten in DataGrid aktivieren.
Siehe auch
Konzepte
Cursor (SQL Server Compact Edition)
Auswählen eines Cursortyps
Cursor und Sperrungen
Implizite Cursorkonvertierung
Aktualisieren keysetgesteuerter Cursor