Cursori rettangolari, cursori scorrevoli e compatibilità con le versioni precedenti per le applicazioni ODBC 3.x

L'esistenza di SQLFetchScroll e SQLExtendedFetch rappresenta la prima suddivisione chiara di ODBC tra l'API (Application Programming Interface), ovvero il set di funzioni chiamate dall'applicazione, e l'interfaccia del provider di servizi (SPI), ovvero il set di funzioni implementate dal driver. Questa suddivisione è necessaria per bilanciare il requisito in ODBC 3.x, che usa SQLFetchScroll, per allinearsi agli standard ed essere compatibile con ODBC 2.x, che usa SQLExtendedFetch.

L'API ODBC 3.x, ovvero il set di funzioni chiamate dall'applicazione, include SQLFetchScroll e gli attributi di istruzione correlati. Lo SPI ODBC 3.x, ovvero il set di funzioni implementate dal driver, include SQLFetchScroll, SQLExtendedFetch e gli attributi di istruzione correlati. Poiché ODBC non applica formalmente questa suddivisione tra l'API e lo SPI, è possibile che le applicazioni ODBC 3.x chiamino SQLExtendedFetch e gli attributi di istruzione correlati. Tuttavia, non esiste alcun motivo per cui le applicazioni ODBC 3.x lo facciano. Per altre informazioni sulle API e sugli SPI, vedere l'introduzione all'architettura ODBC.

Per informazioni sul mapping delle chiamate da parte di Gestione driver ODBC 3.x ai driver ODBC 2.x e ODBC 3.x e sulle funzioni e gli attributi delle istruzioni che un driver ODBC 3.x deve implementare per i cursori rettangolari e scorrevoli, vedere Cosa fa il driver nell’Appendice G: Linee guida per la compatibilità del driver con le versioni precedenti.

La tabella seguente riepiloga le funzioni e gli attributi di istruzione che un'applicazione ODBC 3.x deve usare con cursori rettangolari e scorrevoli. Elenca inoltre le modifiche tra ODBC 2.x e ODBC 3.x in questa area in cui le applicazioni ODBC 3.x devono essere compatibili con i driver ODBC 2.x.

Funzione o

attributo di istruzione
Commenti
SQL_ATTR_FETCH_BOOKMARK_PTR Punta al segnalibro da usare con SQLFetchScroll.

Quando un'applicazione lo imposta in un driver ODBC 2.x, deve puntare a un segnalibro a lunghezza fissa.
SQL_ATTR_ROW_STATUS_PTR Punta alla matrice di stato della riga riempita da SQLFetch, SQLFetchScroll, SQLBulkOperations e SQLSetPos.

Se un'applicazione imposta questo valore in un driver ODBC 2.x e chiama SQLBulkOperation con un'operazione di SQL_ADD prima di chiamare SQLFetchScroll, SQLFetch o SQLExtendedFetch, viene restituito SQLSTATE HY011 (l'attributo non può essere impostato ora).

Quando un'applicazione chiama SQLFetch in un driver ODBC 2.x, SQLFetch viene mappato a SQLExtendedFetch e quindi restituisce i valori in questa matrice.
SQL_ATTR_ROWS_FETCHED_PTR Punta al buffer in cui SQLFetch e SQLFetchScroll restituiscono il numero di righe recuperate.

Quando un'applicazione chiama SQLFetch in un driver ODBC 2.x, SQLFetch viene mappato a SQLExtendedFetch e quindi restituisce un valore in questo buffer.
SQL_ATTR_ROW_ARRAY_SIZE Imposta le dimensioni del set di righe.

Se un'applicazione chiama SQLBulkOperations con un'operazione di SQL_ADD in un driver ODBC 2.x, verrà usato per la chiamata SQL_ROWSET_SIZE, e non SQL_ATTR_ROW_ARRAY_SIZE, perché la chiamata viene mappata a SQLSetPos con un'operazione di SQL_ADD, che usa SQL_ROWSET_SIZE.

La chiamata a SQLSetPos con un'operazione di SQL_ADD o SQLExtendedFetch in un driver ODBC 2.x usa SQL_ROWSET_SIZE.

La chiamata a SQLFetch o SQLFetchScroll in un driver ODBC 2.x usa SQL_ATTR_ROW_ARRAY_SIZE.
SQLBulkOperations Esegue operazioni di inserimento e segnalibro. Quando SQLBulkOperations con un'operazione di SQL_ADD viene chiamato in un driver ODBC 2.x, viene eseguito il mapping a SQLSetPos con un'operazione di SQL_ADD. Di seguito sono riportati i dettagli di implementazione:

- Quando si utilizza un driver ODBC 2.x, un'applicazione deve usare solo l’ARD allocato in modo implicito associato a StatementHandle. Non può allocare un altro ARD per l'aggiunta di righe, perché le operazioni esplicite del descrittore non sono supportate in un driver ODBC 2.x . Un'applicazione deve usare SQLBindCol per eseguire l'associazione all’ARD, non SQLSetDescField o SQLSetDescRec.
- Quando si chiama un driver ODBC 3.x, un'applicazione può chiamare SQLBulkOperations con un'operazione di SQL_ADD prima di chiamare SQLFetch o SQLFetchScroll. Quando si chiama un driver ODBC 2.x, un'applicazione deve chiamare SQLFetchScroll prima di chiamare SQLBulkOperations con un'operazione di SQL_ADD.
SQLFetch Restituisce il set di righe successivo. Di seguito sono riportati i dettagli di implementazione:

- Quando un'applicazione chiama SQLFetch in un driver ODBC 2.x, viene eseguito il mapping a SQLExtendedFetch.
- Quando un'applicazione chiama SQLFetch in un driver ODBC 3.x, restituisce il numero di righe specificate con l'attributo di istruzione SQL_ATTR_ROW_ARRAY_SIZE.
SQLFetchScroll Restituisce il set di righe specificato. Di seguito sono riportati i dettagli di implementazione:

- Quando un'applicazione chiama SQLFetchScroll in un driver ODBC 2.x, restituisce SQLSTATE 01S01 (errore di riga) prima di ogni errore applicabile a una singola riga. Questa operazione viene eseguita solo perché Gestione driver ODBC 3.x esegue il mapping a SQLExtendedFetch e SQLExtendedFetch restituisce questo SQLSTATE. Quando un'applicazione chiama SQLFetchScroll in un driver ODBC 3.x, non restituisce mai SQLSTATE 01S01 (errore di riga).
- Quando un'applicazione chiama SQLFetchScroll in un driver ODBC 2.x con FetchOrientation impostato su SQL_FETCH_BOOKMARK, l'argomento FetchOffset deve essere impostato su 0. SQLSTATE HYC00 (funzionalità facoltativa non implementata) viene restituito se si tenta il recupero di segnalibri basati su offset con un driver ODBC 2.x.

Nota

Le applicazioni ODBC 3.x non devono usare SQLExtendedFetch o l'attributo dell'istruzione SQL_ROWSET_SIZE. Devono invece usare SQLFetchScroll e l'attributo dell'istruzione SQL_ATTR_ROW_ARRAY_SIZE. Le applicazioni ODBC 3.x non devono usare SQLSetPos con un'operazione di SQL_ADD, ma devono usare SQLBulkOperations con un'operazione di SQL_ADD.