ODBC: Die ODBC-Cursorbibliothek
In diesem Thema wird die ODBC-Cursorbibliothek beschrieben und ihre Verwendung erläutert. Weitere Informationen finden Sie unter folgenden Themen:
Cursorbibliothek und Level 1-ODBC-Treiber
Positionierbare Aktualisierungen und Timestampspalten
Verwenden der Cursorbibliothek
Die ODBC-Cursorbibliothek ist eine Dynamic Link Library (DLL), die mit dem ODBC-Treiber-Manager und dem Treiber zusammenwirkt. In ODBC-Terminologie ausgedrückt unterhält der Treiber einen Cursor, um seine Position innerhalb des Recordsets zu verwalten. Der Cursor markiert die Position innerhalb des Recordsets, zu dem Sie bereits gescrollt sind – dem aktuellen Datensatz.
Cursorbibliothek und Level 1-ODBC-Treiber
Die ODBC-Cursorbibliothek verleiht Level 1-Treibern folgende zusätzliche Fähigkeiten:
Vorwärts- und Rückwärtsscrollen. Für Level 2-Treiber ist keine Cursorbibliothek erforderlich, da sie bereits scrollbar sind.
Unterstützung für Momentaufnahmen. Die Cursorbibliothek verwaltet einen Puffer mit den Datensätzen der Momentaufnahme. Dieser Puffer gibt vom Programm vorgenommene Änderungen wieder (gelöschte und geänderte Datensätze), jedoch keine Änderungen, die von anderen Benutzern vorgenommen wurden (hinzugefügte, gelöschte und geänderte Datensätze). Die Momentaufnahme ist daher nur so aktuell wie der Puffer der Cursorbibliothek. Der Puffer gibt hinzugefügte Einträge solange nicht wieder, bis Requery aufgerufen wurde. Dynasets verwenden nicht die Cursorbibliothek.
Die Cursorbibliothek stellt selbst dann Momentaufnahmen (statische Cursor) zur Verfügung, wenn sie vom Treiber nicht unterstützt werden. Falls der Treiber bereits statische Cursor unterstützt, müssen Sie die Cursorbibliothek nicht laden, um Unterstützung für Momentaufnahmen zu erhalten. Falls Sie die Cursorbibliothek einsetzen, können Sie ausschließlich Momentaufnahmen und Vorwärts-Recordsets verwenden. Falls der Treiber Dynasets (KEYSET_DRIVEN-Cursor) unterstützt und Sie die Dynasets einsetzen möchten, dürfen Sie die Cursorbibliothek nicht verwenden. Falls Sie sowohl Momentaufnahmen als auch Dynasets einsetzen möchten, müssen Sie zwei verschiedene CDatabase-Objekte (zwei verschiedene Verbindungen) einsetzen, es sei denn, der Treiber unterstützt sowohl Momentaufnahmen als auch Dynasets.
Positionierbare Aktualisierungen und Timestampspalten
Tipp
Auf ODBC-Datenquellen können Sie über die MFC-ODBC-Klassen zugreifen, wie in diesem Thema beschrieben, oder über die MFC-Datenzugriffsobjekt-Klassen (DAO-Klassen).
Tipp
Wenn der ODBC-Treiber SQLSetPos unterstützt (wird von MFC verwendet, falls vorhanden), können Sie dieses Thema überspringen.
Die meisten Level 1-Treiber bieten keine Unterstützung für positionierbare Aktualisierungen. Für solche Treiber muss die Cursorbibliothek die Fähigkeiten von Level 2-Treibern emulieren. Die Cursorbibliothek emuliert die Unterstützung für positionierbare Aktualisierungen, indem sie eine Suchaktualisierung der unveränderlichen Felder durchführt.
In einigen Fällen kann ein Recordset als eines dieser unveränderlichen Felder eine Timestampspalte enthalten. Es sind zwei Aspekte zu beachten, wenn MFC-Recordsets mit Tabellen eingesetzt werden, die Timestampspalten enthalten.
Der erste Aspekt betrifft aktualisierbare Momentaufnahmen von Tabellen mit Timestampspalten. Falls die Tabelle, an die die Momentaufnahme gebunden ist, eine Timestampspalte enthält, müssen Sie Requery nach dem Aufruf von Edit und Update aufrufen. Andernfalls können Sie denselben Datensatz möglicherweise nicht erneut bearbeiten. Wenn Sie erst Edit und dann Update aufrufen, wird der Datensatz in die Datenquelle geschrieben, und die Timestampspalte wird aktualisiert. Falls Sie Requery nicht aufrufen, entspricht der Wert des Timestamps des Datensatzes in der Momentaufnahme nicht mehr dem entsprechenden Timestamp in der Datenquelle. Wenn Sie dann erneut versuchen, den Datensatz zu aktualisieren, verbietet die Datenquelle wegen dieser Diskrepanz möglicherweise die Aktualisierung.
Der zweite Aspekt betrifft die Beschränkungen der CTime-Klasse, wenn diese mit der Funktion RFX_Date zur Übertragung von Zeit- und Datumsinformationen in eine oder aus einer Tabelle verwendet wird. Die Verarbeitung des CTime-Objekts verursacht Verwaltungsaufwand in Form zusätzlicher Zwischenberechnungen während des Datentransfers. Außerdem ist der Datumsbereich der CTime-Objekte für manche Anwendungen möglicherweise zu eingeschränkt. Eine neue Version der RFX_Date-Funktion verwendet als Parameter statt eines CTime-Objekts den ODBC-Typ TIMESTAMP_STRUCT. Weitere Informationen finden Sie unter RFX_Date unter Macros and Globals (nur auf Englisch verfügbar) in der MFC-Referenz.
Verwenden der Cursorbibliothek
Wenn Sie die Verbindung zu einer Datenquelle aufbauen, indem Sie CDatabase::OpenEx oder CDatabase::Open aufrufen, können Sie angeben, ob die Cursorbibliothek für die Datenquelle verwendet werden soll. Wenn Sie für die Datenquelle Momentaufnahmen anlegen möchten, geben Sie im dwOptions-Parameter von OpenEx die Option CDatabase::useCursorLib an, oder geben Sie im bUseCursorLib-Parameter von Open den Wert TRUE an (TRUE ist der Standardwert). Verwenden Sie die Cursorbibliothek nicht, falls der ODBC-Treiber Dynasets unterstützt und Sie Dynasets der Datenquelle öffnen möchten (hierdurch wird ein Teil der Funktionalität des Treibers überdeckt, die für Dynasets erforderlich ist). Übergeben Sie in diesem Fall nicht CDatabase::useCursorLib an OpenEx oder im bUseCursorLib-Parameter von Open den Wert FALSE.