TN042: suggerimenti per gli sviluppatori di driver ODBC

Nota

La seguente nota tecnica non è stata aggiornata da quando è stata inclusa per la prima volta nella documentazione online. Di conseguenza, alcune procedure e argomenti potrebbero essere non aggiornati o errati. Per le informazioni più recenti, è consigliabile cercare l'argomento di interesse nell'indice della documentazione online.

Questa nota descrive le linee guida per i writer di driver ODBC. Descrive i requisiti generali e i presupposti della funzionalità ODBC che le classi di database MFC rendono disponibili e vari dettagli semantici previsti. Sono descritte le funzionalità del driver necessarie per supportare le tre CRecordset modalità Open (forwardOnly, snapshot e dynaset).

Libreria di cursori ODBC

Le classi di database MFC presentano funzionalità all'utente che in molti casi superano le funzionalità fornite dalla maggior parte dei driver ODBC di livello 1. Fortunatamente, la libreria di cursori odbc si layererà tra le classi di database e il driver e fornirà automaticamente gran parte di questa funzionalità aggiuntiva.

Ad esempio, la maggior parte dei driver 1.0 non supporta lo scorrimento indietro. La libreria di cursori può rilevare questo problema e memorizza nella cache le righe dal driver e le presenta come richiesto nelle chiamate FETCH_PREV in SQLExtendedFetch.

Un altro esempio importante della dipendenza della libreria di cursori è costituito dagli aggiornamenti posizionati. La maggior parte dei driver 1.0 non dispone anche di aggiornamenti posizionati, ma la libreria di cursori genererà istruzioni di aggiornamento che identificano una riga di destinazione nell'origine dati in base ai valori dei dati memorizzati nella cache correnti o a un valore timestamp memorizzato nella cache.

La libreria di classi non usa mai più set di righe. Di conseguenza, le poche SQLSetPos istruzioni vengono sempre applicate alla riga 1 del set di righe.

CDatabases

Ogni CDatabase alloca un singolo HDBC. Se CDatabaseviene usata la funzione di ExecuteSQL , viene allocata temporaneamente un HSTMT . Pertanto, se sono necessari più CDatabasefile, è necessario supportare più file HDBCper HENV .

Le classi di database richiedono la libreria di cursori. Questo si riflette in una SQLSetConnections chiamata SQL_ODBC_CURSORS, SQL_CUR_Uedizione Standard_ODBC.

SQLDriverConnect, SQL_DRIVER_COMPLETE viene usato da CDatabase::Open per stabilire la connessione all'origine dati.

Il driver deve supportare SQLGetInfo SQL_ODBC_API_CONFORMANCE>= SQL_OAC_LEVEL1, SQLGetInfo SQL_ODBC_SQL_CONFORMANCE>= SQL_OSC_MINIMUM.

Affinché le transazioni siano supportate per i CDatabase recordset dipendenti e i relativi recordset SQLGetInfo SQL_CURSOR_COMMIT_BEHAVIOR e SQL_CURSOR_ROLLBACK_BEHAVIOR devono avere SQL_CR_PREedizione Standard RVE. In caso contrario, i tentativi di eseguire il controllo delle transazioni verranno ignorati.

SQLGetInfo SQL_DATA_SOURCE_READ_ONLY deve essere supportato. Se restituisce "Y", non verranno eseguite operazioni di aggiornamento sull'origine dati.

CDatabase Se viene aperto ReadOnly, verrà eseguito un tentativo di impostare l'origine dati di sola lettura con SQLSetConnectOption SQL_ACCESS_MODE, SQL_MODE_READ_ONLY.

Se gli identificatori richiedono virgolette, queste informazioni devono essere restituite dal driver con una SQLGetInfo SQL_IDENTIFIER_QUOTE_CHAR chiamata.

Ai fini SQLGetInfo SQL_DBMS_VER del debug e SQL_DBMS_NAME vengono recuperati dal driver.

SQLSetStmtOption SQL_QUERY_TIMEOUTe SQL_ASYNC_ENABLE possono essere chiamati su un CDatabaseHDBC di .

SQLError può essere chiamato con uno o tutti gli argomenti NULL.

Naturalmente, SQLAllocEnv, SQLAllocConnectSQLDisconnect e SQLFreeConnect deve essere supportato.

Executesql

Oltre a allocare e liberare un HSTMT temporaneo, ExecuteSQL chiama SQLExecDirect, SQLFetchSQLNumResultCol e SQLMoreResults. SQLCancel può essere chiamato su HSTMT.

GetDatabaseName

SQLGetInfo SQL_DATABASE_NAME verrà chiamato .

BeginTrans, CommitTrans, Rollback

SQLSetConnectOption SQL_AUTOCOMMIT e SQLTransact SQL_COMMIT, SQL_ROLLBACK e SQL_AUTOCOMMIT verranno chiamati se vengono effettuate richieste di transazione.

CRecordsets

SQLAllocStmt, SQLPrepare, SQLExecute (per Open e Requery), SQLExecDirect (per le operazioni di aggiornamento), SQLFreeStmt deve essere supportato. SQLNumResultCols e SQLDescribeCol verrà chiamato sul set di risultati in vari momenti.

SQLSetParam viene usato ampiamente per l'associazione dei dati dei parametri e DATA_AT_EXEC funzionalità.

SQLBindCol viene usato ampiamente per registrare i percorsi di archiviazione dei dati delle colonne di output con ODBC.

Vengono usate due SQLGetData chiamate per recuperare SQL_LONG_VARCHAR e SQL_LONG_VARBINARY dati. La prima chiamata tenta di trovare la lunghezza totale del valore della colonna chiamando SQLGetData con cbMaxValue pari a 0, ma con un pcbValue valido. Se pcbValue contiene SQL_NO_TOTAL, viene generata un'eccezione. In caso contrario, viene allocato un oggetto HGLOBAL e viene eseguita un'altra SQLGetData chiamata per recuperare l'intero risultato.

Aggiornamento

Se viene richiesto un blocco pessimistico, SQLGetInfo SQL_LOCK_TYPES verrà eseguita una query. Se SQL_LCK_EXCLUSIVE non è supportato, verrà generata un'eccezione.

I tentativi di aggiornare un CRecordset oggetto (snapshot o dynaset) causeranno l'allocazione di un secondo HSTMT . Per i driver che non supportano il secondo HSTMT, la libreria di cursori simula questa funzionalità. Sfortunatamente, questo può talvolta significare forzare il completamento della query corrente sul primo HSTMT prima di elaborare la seconda richiesta HSTMT.

SQLFreeStmt SQL_CLOSEe SQL_REedizione StandardT_PARAMS e SQLGetCursorName verranno chiamati durante le operazioni di aggiornamento.

Se sono presenti CLongBinarys in outputColumns, è necessario supportare la funzionalità di DATA_AT_EXEC di ODBC. Ciò include la restituzione di SQL_Nedizione EnterpriseD_DATA da SQLExecDirecte SQLParamData SQLPutData.

SQLRowCount viene chiamato dopo l'esecuzione per verificare che solo 1 record sia stato aggiornato da SQLExecDirect.

Cursori ForwardOnly

Per le Move operazioni è necessario solo SQLFetch . Si noti che i cursori forwardOnly non supportano gli aggiornamenti.

Cursori snapshot

La funzionalità snapshot richiede SQLExtendedFetch il supporto. Come indicato in precedenza, la libreria di cursori ODBC rileverà quando un driver non supporta SQLExtendedFetche fornirà il supporto necessario.

SQLGetInfo, SQL_SCROLL_OPTIONS deve supportare SQL_SO_STATIC.

Cursori Dynaset

Di seguito è riportato il supporto minimo necessario per aprire un dynaset:

SQLGetInfo, SQL_ODBC_VER deve restituire > "01".

SQLGetInfo, SQL_SCROLL_OPTIONS deve supportare SQL_SO_KEYedizione StandardT_DRIVEN.

SQLGetInfo, SQL_ROW_UPDATES deve restituire "Y".

SQLGetInfo, SQL_POSITIONED_UPDATES deve supportare SQL_PS_POSITIONED_DELETE e SQL_PS_POSITIONED_UPDATE.

Inoltre, se viene richiesto un blocco pessimistico, verrà effettuata una chiamata a SQLSetPos con irow 1, fRefresh FAL edizione Standard e fLock SQL_LCK_EXCLUSIVE.

Vedi anche

Note tecniche per numero
Note tecniche per categoria