Condividi tramite


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 sono riportate le linee guida per i writer driver ODBC. Vengono descritti i requisiti generali e le ipotesi di funzionalità ODBC che le classi di database MFC fanno e le varie dettagli semantici previsti. La funzionalità driver per supportare le tre modalità aperte di CRecordset (forwardOnly, snapshot e dynaset) viene descritta.

La libreria di cursori ODBC

Le classi di database MFC verificano la funzionalità all'utente in molti casi supera la funzionalità fornita dalla maggior parte dei driver ODBC di Livello 1. Fortunatamente, la libreria di cursori ODBC si svilupperà su più livelli tra le classi di database e il driver e viene fornito automaticamente da gran parte di questa funzionalità aggiuntive.

Ad esempio, la maggior parte 1,0 driver non supportano lo scorrimento indietro. La libreria di cursori può rilevare questa e memorizza nella cache le righe dal driver e di verifica necessarie sulle chiamate di FETCH_PREV in SQLExtendedFetch.

Un altro esempio importante di dipendenza della libreria di cursori è aggiornamenti posizionati. La maggior parte 1,0 driver inoltre non dispongono degli aggiornamenti posizionati, ma la libreria di cursori genererà le istruzioni di aggiornamento che identificano una riga di destinazione nell'origine dati basata sui relativi valori dei dati memorizzati nella cache corrente, o un valore memorizzato nella cache di timestamp.

La libreria di classi non vengono mai più rowset. Di conseguenza, le poche istruzioni di SQLSetPos si applicano sempre alle 1 del rowset.

CDatabases

Ogni CDatabase alloca singolo HDBC. Se la funzione di CDatabaseExecuteSQL viene utilizzata, HSTMT temporaneamente è sovrallocato.) Se pertanto più CDatabase necessario, HDBCpiù s per HENV deve essere supportato.

Le classi di database richiedono la libreria di cursori. Ciò viene riportata in una chiamata SQL_ODBC_CURSORS, SQL_CUR_USE_ODBCdi SQLSetConnections.

SQLDriverConnect, SQL_DRIVER_COMPLETE viene utilizzato 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.

In modo che le transazioni da supportare per CDatabase e i relativi dipendenti recordset, SQLGetInfo SQL_CURSOR_COMMIT_BEHAVIOR e SQL_CURSOR_ROLLBACK_BEHAVIOR devono avere SQL_CR_PRESERVE. In caso contrario, i tentativi di eseguire il controllo delle transazioni vengono ignorati.

SQLGetInfo SQL_DATA_SOURCE_READ_ONLY deve essere supportato. Se restituisce "Y", nessuna operazione di aggiornamento verrà eseguita nell'origine dati.

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

Se gli identificatori richiedono le virgolette, queste informazioni devono essere restituite dal driver a una chiamata di SQLGetInfoSQL_IDENTIFIER_QUOTE_CHAR.

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

SQLSetStmtOption SQL_QUERY_TIMEOUT e SQL_ASYNC_ENABLE possono essere chiamati su CDatabaseHDBC.

SQLError può essere chiamato con qualsiasi NULL degli argomenti.

Naturalmente, SQLAllocEnv, SQLAllocConnect, SQLDisconnect e SQLFreeConnect devono essere supportati.

ExecuteSQL

Oltre all'allocare e liberare HSTMTtemporaneo, ExecuteSQL chiama SQLExecDirect, SQLFetch, SQLNumResultCol e SQLMoreResults. SQLCancel può essere chiamato in 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 le richieste di transazione vengono effettuate.

CRecordsets

SQLAllocStmt, SQLPrepare, SQLExecute ad Apri e Riesegui query), SQLExecDirect (per le operazioni di aggiornamento), SQLFreeStmt deve essere supportato. SQLNumResultCols e SQLDescribeCol verranno chiamati i risultati in diversi momenti.

SQLSetParam viene utilizzato ampiamente per i dati dei parametri e le funzionalità necessari per DATA_AT_EXEC.

SQLBindCol viene utilizzato ampiamente per registrare le posizioni di archiviazione dei dati della colonna di output con ODBC.

Due chiamate di SQLGetData vengono utilizzate per recuperare i dati di SQL_LONG_VARBINARY e di SQL_LONG_VARCHAR. Tentativo di chiamare prima di determinare la lunghezza totale del valore della colonna chiamando SQLGetData con un cbMaxValue di 0, ma con un pcbValue valido. Se il pcbValue utilizza SQL_NO_TOTAL, viene generata un'eccezione. In caso contrario, HGLOBAL viene allocato e un'altra chiamata di SQLGetData viene eseguita per recuperare l'intero risultato.

Aggiornamento

Se il blocco pessimistico è necessario, SQLGetInfo SQL_LOCK_TYPES verrà eseguita la query. Se SQL_LCK_EXCLUSIVE non è supportato, verrà generata un'eccezione.

Tentativo di aggiornare CRecordset (snapshot o dynaset) determinerà l'interruzione di un secondo HSTMT a essere allocati. Per i driver che non supportano secondo HSTMT, la libreria di cursori simulerà questa funzionalità. Sfortunatamente, questo può talvolta essere forzare la query corrente in primo HSTMT completata prima di avviare la seconda richiesta di HSTMT.

SQLFreeStmt SQL_CLOSE e SQL_RESET_PARAMS e SQLGetCursorName verranno chiamati durante le operazioni di aggiornamento.

Se è presente CLongBinarys in outputColumns, la funzionalità di DATA_AT_EXEC ODBC deve essere supportata. Ciò include restituire SQL_NEED_DATA da SQLExecDirect, da SQLParamData e da SQLPutData.

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

Cursori di ForwardOnly

Solo SQLFetch è obbligatorio per le operazioni di Sposta. Si noti che i cursori di forwardOnly non supportano gli aggiornamenti.

Cursori di snapshot

La funzionalità di snapshot richiede il supporto di SQLExtendedFetch. Come accennato in precedenza, la libreria di cursori ODBC quando rileva un driver non supporta SQLExtendedFetch e fornisce il supporto necessario stesso.

SQLGetInfo, SQL_SCROLL_OPTIONS deve supportare SQL_SO_STATIC.

Cursori dei dynaset

Di seguito viene fornito il supporto minimo richiesto per aprire un dynaset:

SQLGetInfo, SQL_ODBC_VER deve restituire > "01 ".

SQLGetInfo, SQL_SCROLL_OPTIONS deve supportare SQL_SO_KEYSET_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 il blocco pessimistico è obbligatorio, una chiamata a SQLSetPos con irow 1, FALSE di fRefresh e la moltitudine SQL_LCK_EXCLUSIVE verrà eseguita.

Vedere anche

Altre risorse

Note tecniche per numero

Note tecniche per categoria