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 CDatabase
viene usata la funzione di ExecuteSQL
, viene allocata temporaneamente un HSTMT . Pertanto, se sono necessari più CDatabase
file, è 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_TIMEOUT
e SQL_ASYNC_ENABLE possono essere chiamati su un CDatabase
HDBC di .
SQLError
può essere chiamato con uno o tutti gli argomenti NULL.
Naturalmente, SQLAllocEnv
, SQLAllocConnect
SQLDisconnect
e SQLFreeConnect
deve essere supportato.
Executesql
Oltre a allocare e liberare un HSTMT temporaneo, ExecuteSQL
chiama SQLExecDirect
, SQLFetch
SQLNumResultCol
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_CLOSE
e 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 SQLExecDirect
e 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 SQLExtendedFetch
e 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.