TN042: ODBC Driver Developer raccomandazioni

Questa nota descrive le linee guida per gli scrittori di driver ODBC. Essa delinea i requisiti generali e le ipotesi di ODBC funzionalità che rendono le classi Database MFC e vari dettagli semantici previsti. Funzionalità del driver necessari per supportare le tre CRecordset modalità Open (forwardOnly, snapshot e dynaset) sono descritti.

Libreria di cursori di ODBC

Le classi MFC Database presentano funzionalità per l'utente che in molti casi supera la funzionalità fornita dalla maggior parte dei driver ODBC di livello 1. Fortunatamente, la libreria di cursori di ODBC sarà stesso strato tra le classi di database e il driver e automaticamente fornirà gran parte di questa funzionalità aggiuntive.

Per esempio, la maggior parte dei driver 1.0 non supportano lo scorrimento all'indietro. La libreria di cursori può rilevare questo e saranno memorizzare nella cache le righe dall'autista e presentarli come richiesto sulle chiamate FETCH_PREV in SQLExtendedFetch.

Un altro importante esempio di dipendenza dalla libreria di cursore è gli aggiornamenti posizionati. La maggior parte dei driver 1.0 anche non avere gli aggiornamenti posizionati, ma la libreria di cursori genererà istruzioni update che identificano una fila di destinazione sull'origine dei dati in base ai suoi valori correnti di dati memorizzati nella cache o un valore timestamp nella cache.

La libreria di classi mai fa uso di più set di righe. Pertanto, le dichiarazioni di SQLSetPos pochi vengono sempre applicate a riga 1 del set di righe.

CDatabases

Ogni CDatabase alloca un singolo HDBC. (Se viene utilizzata la funzione ExecuteSQL di CDatabase, un HSTMT viene temporaneamente allocato.) Così se multiple CDatabaseè necessarie, devono essere supportate più s HDBCal HENV.

Le classi di database richiedono la libreria di cursori. Ciò si riflette in una chiamata di SQLSetConnections SQL_ODBC_CURSORS, SQL_CUR_USE_ODBC.

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

Il conducente deve supportare SQLGetInfo SQL_ODBC_API_CONFORMANCE gt; = SQL_OAC_LEVEL1, SQLGetInfo SQL_ODBC_SQL_CONFORMANCE > = SQL_OSC_MINIMUM.

Al fine di transazioni a essere supportata per il CDatabase e suoi dipendenti recordset, SQLGetInfo SQL_CURSOR_COMMIT_BEHAVIOR e SQL_CURSOR_ROLLBACK_BEHAVIOR devono avere SQL_CR_PRESERVE. In caso contrario, verranno ignorati i tentativi di eseguire il controllo delle transazioni.

SQLGetInfo SQL_DATA_SOURCE_READ_ONLY deve essere supportata. Se restituisce "Y", non verranno eseguite alcuna operazione di aggiornamento nell'origine dati.

Se viene aperto il CDatabase ReadOnly un tentativo di impostare il readonly di fonte di dati sarà fatto con SQLSetConnectOption SQL_ACCESS_MODE, SQL_MODE_READ_ONLY.

Se gli identificatori richiedono citando, questa informazione deve essere restituita dall'abitacolo con una chiamataSQL_IDENTIFIER_QUOTE_CHAR SQLGetInfo .

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

SQLSetStmtOption SQL_QUERY_TIMEOUT e SQL_ASYNC_ENABLE può essere chiamato su un CDatabasedi HDBC.

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

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

ExecuteSQL

Nell'ulteriore per allocare e liberare un temporaneo HSTMT, ExecuteSQL chiama SQLExecDirect, SQLFetch, SQLNumResultCol e SQLMoreResults. SQLCancel può essere chiamato su HSTMT.

GetDatabaseName

SQLGetInfoSi chiamerà SQL_DATABASE_NAME .

BeginTrans, CommitTrans, Rollback

SQLSetConnectOption SQL_AUTOCOMMIT e SQLTransact SQL_COMMIT, SQL_ROLLBACK e SQL_AUTOCOMMIT verrà chiamato se vengono effettuate delle transazioni richieste.

CRecordsets

SQLAllocStmt, SQLPrepare, SQLExecute (per Open e ripetere la query), SQLExecDirect (per le operazioni di aggiornamento), SQLFreeStmt devono essere sostenuti. SQLNumResultCols e SQLDescribeCol verrà chiamato sui risultati impostare varie volte.

SQLSetParam è ampiamente utilizzato per l'associazione di dati del parametro e funzionalità DATA_AT_EXEC.

SQLBindCol è ampiamente utilizzato per registrare posizioni di archiviazione dei dati di colonna con ODBC di output.

Due chiamate SQLGetData vengono utilizzate per recuperare dati SQL_LONG_VARCHAR e SQL_LONG_VARBINARY . La prima chiamata tenta di trovare la lunghezza totale del valore della colonna chiamando SQLGetData cbMaxValue 0, ma con un valido pcbValue. Se pcbValue tiene SQL_NO_TOTAL, viene generata un'eccezione. In caso contrario viene allocato un HGLOBAL , e un'altra chiamata SQLGetData fatto per recuperare l'intero risultati.

L'aggiornamento

Se è richiesto il blocco pessimistico, SQLGetInfo SQL_LOCK_TYPES sarà possibile eseguire query. Se SQL_LCK_EXCLUSIVE non è supportato, verrà generata un'eccezione.

Tenta di aggiornare un CRecordset (istantanea o dynaset) causerà un secondo HSTMT da destinare. Per i conducenti che non supportano la seconda HSTMT, la libreria di cursori simulerà questa funzionalità. Purtroppo, ciò può significare a volte costringendo la query corrente sul primo HSTMT a compimento prima dell'elaborazione del secondo HSTMTrichiesta.

SQLFreeStmt SQL_CLOSE e SQL_RESET_PARAMS e SQLGetCursorName verrà chiamato durante le operazioni di aggiornamento.

Se ci sono CLongBinarys alla outputColumns, funzionalità DATA_AT_EXEC di ODBC devono essere sostenuti. Questo include restituendo SQL_NEED_DATA da SQLExecDirect, SQLParamData e SQLPutData.

Dopo l'esecuzione per verificare che solo 1 record è stato aggiornato dalla SQLExecDirect viene chiamato SQLRowCount.

Cursori ForwardOnly

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

Cursori istantanea

Funzionalità dello snapshot richiede il supporto di SQLExtendedFetch . Come notato sopra, la libreria di cursori ODBC rileverà quando un driver supportano SQLExtendedFetche fornire il necessario supporto stesso.

SQLGetInfo, SQL_SCROLL_OPTIONS deve supportare SQL_SO_STATIC.

Cursori dynaset

Qui sotto c'è il supporto minimo richiesto di aprire un dynaset:

SQL&GetInfo, SQL_ODBC_VER deve restituire gt; "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 è richiesto il blocco pessimistico, una chiamata a SQLSetPos con irow 1, fRefresh FALSE e gregge SQL_LCK_EXCLUSIVE sarà fatto.

&Note tecniche per numero |nbsp; Note tecniche per la categoria

Index