Teilen über


Blockcursor, scrollbare Cursor und Abwärtskompatibilität für ODBC 3.x-Anwendungen

Das Vorhandensein von SQLFetchScroll und SQLExtendedFetch stellt die erste eindeutige Aufteilung in ODBC zwischen der Api (Application Programming Interface) dar, bei der es sich um die Gruppe von Funktionen handelt, die die Anwendung aufruft, und die Dienstanbieterschnittstelle (Service Provider Interface, SPI), die vom Treiber implementiert wird. Diese Aufteilung ist erforderlich, um die Anforderung in ODBC 3.x auszugleichen, die SQLFetchScroll verwendet, um die Standards anzupassen und mit ODBC 2.x kompatibel zu sein, die SQLExtendedFetch verwendet.

Die ODBC 3.x-API , die der Satz von Funktionen ist, die die Anwendung aufruft, enthält SQLFetchScroll und zugehörige Anweisungsattribute. Der ODBC 3.x SPI, der die Reihe von Funktionen darstellt, die der Treiber implementiert, umfasst SQLFetchScroll, SQLExtendedFetch und zugehörige Anweisungsattribute. Da ODBC diese Aufteilung zwischen der API und dem SPI nicht formal erzwingt, ist es für ODBC 3.x-Anwendungen möglich, SQLExtendedFetch- und zugehörige Anweisungsattribute aufzurufen. Hierfür gibt es jedoch keinen Grund für ODBC 3.x-Anwendungen. Weitere Informationen zu APIs und SPIs finden Sie in der Einführung in die ODBC-Architektur.

Informationen dazu, wie der ODBC 3.x-Treiber-Manager Aufrufe von ODBC 2.x- und ODBC 3.x-Treibern zuordnet und welche Funktionen und Anweisungsattribute ein ODBC 3.x-Treiberfür Block- und Bildlaufcursor implementieren sollte, finden Sie in Anhang G: Treiberrichtlinien für Abwärtskompatibilität.

In der folgenden Tabelle wird zusammengefasst, welche Funktionen und Anweisungsattribute eine ODBC 3.x-Anwendung mit Block- und Bildlaufcursorn verwenden soll. Außerdem werden Änderungen zwischen ODBC 2.x und ODBC 3.x in diesem Bereich aufgelistet, dass ODBC 3.x-Anwendungenmit ODBC 2.x-Treibern kompatibel sein sollten.

Funktion oder

Anweisungsattribut
Kommentare
SQL_ATTR_FETCH_BOOKMARK_PTR Verweist auf die Textmarke, die mit SQLFetchScroll verwendet werden soll.

Wenn eine Anwendung dies in einem ODBC 2.x-Treiber festlegt, muss dies auf eine Textmarke mit fester Länge verweisen.
SQL_ATTR_ROW_STATUS_PTR Verweist auf das Zeilenstatusarray, das von SQLFetch, SQLFetchScroll, SQLBulkOperations und SQLSetPos gefüllt ist.

Wenn eine Anwendung dies in einem ODBC 2.x-Treiber festlegt und SQLBulkOperation mit einem Vorgang von SQL_ADD aufruft, bevor SQLFetchScroll, SQLFetch oder SQLExtendedFetch aufgerufen wird, wird SQLSTATE HY011 (Attribut kann jetzt nicht festgelegt werden) zurückgegeben.

Wenn eine Anwendung SQLFetch in einem ODBC 2.x-Treiberaufruft, wird SQLFetch SQLExtendedFetch zugeordnet und gibt daher Werte in diesem Array zurück.
SQL_ATTR_ROWS_FETCHED_PTR Verweist auf den Puffer, in dem SQLFetch und SQLFetchScroll die Anzahl der abgerufenen Zeilen zurückgeben.

Wenn eine Anwendung SQLFetch in einem ODBC 2.x-Treiberaufruft, wird SQLFetch SQLExtendedFetch zugeordnet und gibt daher einen Wert in diesem Puffer zurück.
SQL_ATTR_ROW_ARRAY_SIZE Legt die Zeilensatzgröße fest.

Wenn eine Anwendung SQLBulkOperations mit einem Vorgang von SQL_ADD in einem ODBC 2.x-Treiber aufruft, wird SQL_ROWSET_SIZE für den Aufruf verwendet, nicht SQL_ATTR_ROW_ARRAY_SIZE, da der Aufruf SQLSetPos mit einem Vorgang von SQL_ADD zugeordnet wird, der SQL_ROWSET_SIZE verwendet.

Das Aufrufen von SQLSetPos mit einem Vorgang von SQL_ADD oder SQLExtendedFetch in einem ODBC 2.x-Treiberverwendet SQL_ROWSET_SIZE.

Das Aufrufen von SQLFetch oder SQLFetchScroll in einem ODBC 2.x-Treiberverwendet SQL_ATTR_ROW_ARRAY_SIZE.
SQLBulkOperations Führt Einfüge- und Textmarkenvorgänge aus. Wenn SQLBulkOperations mit einem Vorgang von SQL_ADD in einem ODBC 2.x-Treiber aufgerufen wird, wird es SQLSetPos mit einem Vorgang von SQL_ADD zugeordnet. Im Folgenden sind Implementierungsdetails aufgeführt:

- Beim Arbeiten mit einem ODBC 2.x-Treiber darf eine Anwendung nur die implizit zugeordnete ARD verwenden, die dem StatementHandle zugeordnet ist. Sie kann keine weitere ARD zum Hinzufügen von Zeilen zuordnen, da explizite Deskriptorvorgänge in einem ODBC 2.x-Treiber nicht unterstützt werden. Eine Anwendung muss SQLBindCol verwenden, um eine Bindung an die ARD, nicht an SQLSetDescField oder SQLSetDescRec zu senden.
– Beim Aufrufen eines ODBC 3.x-Treibers kann eine Anwendung SQLBulkOperations mit einem Vorgang von SQL_ADD aufrufen, bevor SQLFetch oder SQLFetchScroll aufgerufen wird. Beim Aufrufen eines ODBC 2.x-Treibers muss eine Anwendung SQLFetchScroll aufrufen, bevor SQLBulkOperations mit einem Vorgang von SQL_ADD aufgerufen wird.
SQLFetch Gibt das nächste Rowset zurück. Im Folgenden sind Implementierungsdetails aufgeführt:

– Wenn eine Anwendung SQLFetch in einem ODBC 2.x-Treiberaufruft, wird sie SQLExtendedFetch zugeordnet.
- Wenn eine Anwendung SQLFetch in einem ODBC 3.x-Treiberaufruft, gibt sie die Anzahl der Zeilen zurück, die mit dem attribut der SQL_ATTR_ROW_ARRAY_SIZE-Anweisung angegeben wurden.
SQLFetchScroll Gibt das angegebene Rowset zurück. Im Folgenden sind Implementierungsdetails aufgeführt:

- Wenn eine Anwendung SQLFetchScroll in einem ODBC 2.x-Treiberaufruft, gibt sie SQLSTATE 01S01 (Fehler in Zeile) vor jedem Fehler zurück, der für eine einzelne Zeile gilt. Dies geschieht nur, weil der ODBC 3.x-Treiber-Manager dies SQLExtendedFetch zugeordnet, und SQLExtendedFetch gibt diesen SQLSTATE-Wert zurück. Wenn eine Anwendung SQLFetchScroll in einem ODBC 3.x-Treiberaufruft, gibt sie nie SQLSTATE 01S01 (Fehler in Zeile) zurück.
- Wenn eine Anwendung SQLFetchScroll in einem ODBC 2.x-Treiberaufruft, wobei FetchOrientation auf SQL_FETCH_BOOKMARK festgelegt ist, muss das FetchOffset-Argument auf 0 festgelegt werden. SQLSTATE HYC00 (Optional feature not implemented) is returned if offset-based bookmark fetching is attempted with an ODBC 2.x driver.

Hinweis

ODBC 3.x-Anwendungen sollten nicht SQLExtendedFetch oder das attribut der SQL_ROWSET_SIZE-Anweisung verwenden. Stattdessen sollten sie SQLFetchScroll und das attribut der SQL_ATTR_ROW_ARRAY_SIZE-Anweisung verwenden. ODBC 3.x-Anwendungen sollten sqlSetPos nicht mit einem Vorgang von SQL_ADD verwenden, sollten aber SQLBulkOperations mit einem Vorgang von SQL_ADD verwenden.