Condividi tramite


TN042: Requisiti dello sviluppatore del driver ODBC

[!NOTA]

La seguente nota tecnica non è stata aggiornata dalla prima volta che viene inclusa nella documentazione online.Di conseguenza, alcune procedure e argomenti potrebbero non essere aggiornati o errati.Per le informazioni più recenti, è consigliabile cercare l'argomento di interesseindice della documentazione online.

Questa nota sono riportate le linee guida per i writer del driver ODBC.Vengono descritti i requisiti generali e presupposti di funzionalità ODBC che le classi di database MFC fanno e le varie dettagli semantici previsti.La funzionalità dei driver per supportare le tre modalità aperte di CRecordset (forwardOnly, snapshot e dynaset) è 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 automaticamente fornirà più di questa funzionalità aggiuntive.

Ad esempio, la maggior parte 1,0 driver non supportano lo scorrimento indietro.La libreria di cursori possibile rilevare questa e la memorizzazione nella cache le righe dal driver e le visualizzato come richiesto sulle chiamate di FETCH_PREV in SQLExtendedFetch.

Un altro esempio importante di dipendenza della libreria di cursori viene aggiornamenti posizionati.La maggior parte 1,0 driver inoltre non gli aggiornamenti posizionati, ma la libreria di cursori generate le istruzioni di aggiornamento che identificano una riga di destinazione in un'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 viene mai più rowset.Di conseguenza, i pochi istruzioni di SQLSetPos si applicano sempre una riga 1 del rowset.

CDatabases

ogni CDatabase alloca singolo HDBC.(Se la funzione di ExecuteSQL di entity_CODECDatabase viene utilizzata, HSTMT temporaneamente viene allocato.) Se pertanto i entity_CODECDatabase più sono HDBCobbligatorio e più oggetti per HENV deve essere supportato.

le classi di database richiedono la libreria di cursori.Ciò viene aggiornata 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 il >= SQL_OAC_LEVEL1, il >= SQL_OSC_MINIMUMdi SQLGetInfoSQL_ODBC_API_CONFORMANCE di SQLGetInfoSQL_ODBC_SQL_CONFORMANCE .

In modo che le transazioni da essere supportate per CDatabase e i recordset dipendenti, SQLGetInfoSQL_CURSOR_COMMIT_BEHAVIOR e SQL_CURSOR_ROLLBACK_BEHAVIOR devono avere SQL_CR_PRESERVE.In caso contrario, i tentativi di eseguire il controllo di transazione vengono ignorati.

SQLGetInfoSQL_DATA_SOURCE_READ_ONLY deve essere supportato.Se restituisce “Y„, nessuna delle operazioni 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 SQLSetConnectOptionSQL_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.

SQLSetStmtOptionSQL_QUERY_TIMEOUT e SQL_ASYNC_ENABLE possono essere HDBCdi entity_CODECDatabase chiamati su.

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

SQLGetInfoSQL_DATABASE_NAME verrà chiamato.

BeginTrans, CommitTrans, rollback

SQLSetConnectOptionSQL_AUTOCOMMIT e SQLTransactSQL_COMMIT, SQL_ROLLBACK e SQL_AUTOCOMMIT verranno chiamati se le richieste di transazione vengono apportate.

CRecordsets

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

SQLSetParam viene utilizzato ampiamente per i dati dei parametri e funzionalità di associazione di 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, SQLGetInfoSQL_LOCK_TYPES verrà eseguita la query.Se SQL_LCK_EXCLUSIVE non è supportato, verrà generata un'eccezione.

Tentativo di aggiornare CRecordset (snapshot o dynaset) indicate generano un secondo HSTMT a essere allocati.Per i driver che non supportano come HSTMT, la libreria di cursori simulerà questa funzionalità.Sfortunatamente, questo può talvolta essere forzare la query corrente in primo HSTMT al completamento prima che elaborano richiesta la seconda del HSTMT.

SQLFreeStmtSQL_CLOSE e SQL_RESET_PARAMS e SQLGetCursorName verranno chiamati durante le operazioni di aggiornamento.

Se c " è 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 aver eseguito per 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 supporta gli aggiornamenti.

cursori di snapshot

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

SQLGetInfo, SQL_SCROLL_OPTIONS deve supportare SQL_SO_STATIC.

Cursori dei dynaset

Di seguito viene fornito il supporto minimo necessario aprire un dynaset:

SQLGetInfo, SQL_ODBC_VER deve restituire il > “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 del numero

Note tecniche per categoria