TN042 : Recommandations de développeur de pilotes ODBC

[!REMARQUE]

La note technique suivante n'a pas été modifiée depuis si c'était première inclus dans la documentation en ligne.Par conséquent, certaines procédures et rubriques peuvent être obsolètes ou incorrects.Pour obtenir les informations les plus récentes, il est recommandé que vous trouviez la rubrique d'intérêt dans l'index de la documentation en ligne.

Cette remarque fournit des instructions sur les writers de pilote ODBC.Il décrit les conditions générales et des acceptations de fonctionnalité ODBC que les classes de base de données MFC font, et de détails individuels sémantiques attendus.La fonctionnalité requise de pilote pour prendre en charge les trois modes ouverts d' CRecordset (forwardOnly, snapshot et dynaset) sont décrites.

La bibliothèque de curseurs ODBC

Les classes de base de données MFC présentent des fonctionnalités à l'utilisateur qui dépasse dans de nombreux cas la fonctionnalité fournie par la plupart des pilotes ODBC de niveau 1.Heureusement, la bibliothèque de curseurs ODBC se posera entre les classes de base de données et le pilote, et fournit automatiquement la plupart de ces fonctionnalités supplémentaires.

Par exemple, la plupart 1,0 pilotes ne prennent pas en charge le défilement arrière.La bibliothèque de curseurs peut détecter cela, et met en cache des lignes du pilote et les présentera comme demandées sur les appels de FETCH_PREV dans SQLExtendedFetch.

Un autre exemple important de dépendance de bibliothèque de curseurs est des mises à jour positionnées.Le plus 1,0 pilotes n'ont pas positionné des mises à jour, mais la bibliothèque de curseurs génère des instructions UPDATE qui identifient une ligne cible dans la source de données en fonction de ses valeurs de données en mémoire cache en cours, ou une valeur d'horodatage mise en cache.

La bibliothèque de classes n'utilisent jamais plusieurs ensembles de lignes.Par conséquent, les des instructions de SQLSetPos sont toujours appliquées pour valeur la ligne 1 du jeu de lignes.

CDatabases

Chaque CDatabase alloue HDBCunique.(Si la fonction d' ExecuteSQL des CDatabase est utilisée, HSTMT est temporairement alloué.) Donc si plusieurs CDatabase sont nécessaires, plusieurs HDBCs par HENV doit être pris en charge.

Les classes de base de données requièrent la bibliothèque de curseurs.Cela est répercutée dans un appel SQL_ODBC_CURSORS, SQL_CUR_USE_ODBCde SQLSetConnections .

SQLDriverConnect, SQL_DRIVER_COMPLETE est utilisé par CDatabase::Open pour établir la connexion à la source de données.

Le pilote doit prendre en charge le >= SQL_OAC_LEVEL1, >= SQL_OSC_MINIMUMde SQLGetInfoSQL_ODBC_API_CONFORMANCE de SQLGetInfoSQL_ODBC_SQL_CONFORMANCE .

Pour que les transactions soient prises en charge pour CDatabase et ses recordsets dépendants, SQLGetInfoSQL_CURSOR_COMMIT_BEHAVIOR et SQL_CURSOR_ROLLBACK_BEHAVIOR doivent avoir SQL_CR_PRESERVE.Sinon, les tentatives d'exécuter le contrôle de transaction sont ignorées.

SQLGetInfoSQL_DATA_SOURCE_READ_ONLY doit être pris en charge.Si elle retourne « O », aucune opération de mise à jour n'est effectuée sur la source de données.

Si CDatabase est en lecture seule ouvert, la définition de la source de données en lecture seule est effectuée avec SQLSetConnectOptionSQL_ACCESS_MODE, SQL_MODE_READ_ONLY.

Si les identificateurs requièrent une quotation, ces informations doivent être retournées par le pilote avec un appel de SQLGetInfoSQL_IDENTIFIER_QUOTE_CHAR .

à des fins de débogage, SQLGetInfo SQL_DBMS_VER et SQL_DBMS_NAME sont extraits du pilote.

SQLSetStmtOptionSQL_QUERY_TIMEOUT et SQL_ASYNC_ENABLE peuvent être HDBCdes CDatabase invités.

SQLError peut être appelé avec tout ou partie d'arguments NULL.

Naturellement, SQLAllocEnv, SQLAllocConnect, SQLDisconnect et SQLFreeConnect doivent être pris en charge.

ExecuteSQL

En plus de l'allocation et de libérer HSTMTtemporaire, ExecuteSQL appelle SQLExecDirect, SQLFetch, SQLNumResultCol et SQLMoreResults.SQLCancel peut être invité HSTMT.

GetDatabaseName

SQLGetInfoSQL_DATABASE_NAME sera appelé.

BeginTrans, CommitTrans, restauration

SQLSetConnectOptionSQL_AUTOCOMMIT et SQLTransactSQL_COMMIT, SQL_ROLLBACK et SQL_AUTOCOMMIT sont appelés si les demandes de transaction sont appliquées.

CRecordsets

SQLAllocStmt, SQLPrepare, SQLExecute (pour Ouvrir et Requery), SQLExecDirect (pour les opérations de mise à jour), SQLFreeStmt doit être pris en charge.SQLNumResultCols et SQLDescribeCol seront invités le jeu de résultats à différents moments.

SQLSetParam est largement utilisé pour la liaison de données de paramètre et la fonctionnalité de DATA_AT_EXEC .

SQLBindCol est largement utilisé à des emplacements de stockage de données de la colonne sortie de registre avec ODBC.

Deux appels de SQLGetData sont utilisés pour récupérer des données de SQL_LONG_VARCHAR et de SQL_LONG_VARBINARY .Les tentatives de premier appel de rechercher la longueur totale de la valeur de la colonne en appelant SQLGetData avec le cbMaxValue de 0, mais avec un pcbValue valide.Si le pcbValue contient SQL_NO_TOTAL, une exception est levée.Sinon, HGLOBAL est alloué, et un autre appel de SQLGetData permet de récupérer le résultat entier.

Mise à jour

Si le verrouillage pessimiste est demandé, SQLGetInfoSQL_LOCK_TYPES est interrogé.Si SQL_LCK_EXCLUSIVE n'est pas pris en charge, une exception sera levée.

Le essaie de mettre à jour CRecordset (snapshot ou dynaset) provoque une seconde HSTMT à allouer.Pour les pilotes qui ne prennent pas en charge le deuxième HSTMT, la bibliothèque de curseurs simulera cette fonctionnalité.Malheureusement, cela peut signifier parfois forcer la requête actuelle sur le premier HSTMT à l'achèvement avant de traiter la seconde requête du HSTMT.

SQLFreeStmtSQL_CLOSE et SQL_RESET_PARAMS et SQLGetCursorName sont appelés pendant les opérations de mise à jour.

Si de CLongBinarys dans outputColumns, la fonctionnalité de DATA_AT_EXEC ODBC doit être prise en charge.Cela inclut retourner SQL_NEED_DATA de SQLExecDirect, de SQLParamData et de SQLPutData.

SQLRowCount est appelé après avoir exécuté à vérifier que 1 seul enregistrement a été mis à jour par SQLExecDirect.

Curseurs de ForwardOnly

Uniquement SQLFetch est requis pour les opérations de Déplacer .Notez que les curseurs de forwardOnly ne prennent pas en charge les mises à jour.

Curseurs instantanés

La fonctionnalité instantanée requiert la prise en charge de SQLExtendedFetch .Comme mentionné ci-dessus, la bibliothèque de curseurs ODBC détecte lorsqu'un pilote ne prend pas en charge SQLExtendedFetch, et fournit la prise en charge nécessaire elle-même.

SQLGetInfo, SQL_SCROLL_OPTIONS doit prendre en charge SQL_SO_STATIC.

Curseurs feuille de réponse dynamique

Vous trouverez ci-dessous la prise en charge minimale requise pour ouvrir une feuille de réponse dynamique :

SQLGetInfo, SQL_ODBC_VER doit retourner le > « 01 ".

SQLGetInfo, SQL_SCROLL_OPTIONS doit prendre en charge SQL_SO_KEYSET_DRIVEN.

SQLGetInfo, SQL_ROW_UPDATES doit retourner « O ».

SQLGetInfo, SQL_POSITIONED_UPDATES doit prendre en charge SQL_PS_POSITIONED_DELETE et SQL_PS_POSITIONED_UPDATE.

De plus, si le verrouillage pessimiste est demandé, un appel à SQLSetPos avec l'irow 1, le fRefresh FALSE et le troupeau SQL_LCK_EXCLUSIVE sera effectuée.

Voir aussi

Autres ressources

Notes techniques de nombres

Notes techniques de catégorie