TN042 : Recommandations de développeur du pilote ODBC

Cette note décrit les lignes directrices pour les auteurs de pilote ODBC. Il énonce les exigences générales et les hypothèses de la fonctionnalité ODBC qui rendent les classes de base de données MFC et divers détails sémantiques attendues. Fonctionnalité de pilote requis pour soutenir les trois modes Open CRecordset (forwardOnly, instantané et feuille de réponse dynamique) sont décrites.

Bibliothèque de curseurs du ODBC

Les classes de base de données MFC présentent des fonctionnalités à l'utilisateur qui, dans bien des cas, dépasse la fonctionnalité fournie par la plupart pilotes ODBC de niveau 1. Heureusement, la bibliothèque de curseurs du ODBC va se couche entre les classes de base de données et le pilote et fournira automatiquement une grande partie de cette fonctionnalité supplémentaire.

Par exemple, la plupart des pilotes 1.0 ne supportent pas le défilement vers l'arrière. La bibliothèque de curseurs peuvent détecter, cache de lignes à partir du pilote et les présenter sur demande sur FETCH_PREV appels SQLExtendedFetch.

Un autre exemple important de la dépendance de bibliothèque de curseur est mises à jour positionnées. La plupart des pilotes 1.0 n'ont également pas mises à jour positionnées, mais la bibliothèque de curseurs générera des instructions update qui identifient une ligne cible sur la source de données basée sur ses valeurs actuelles des données mises en cache, ou une valeur d'horodatage mis en cache.

La bibliothèque de classes jamais fait usage de plusieurs ensembles de lignes. Par conséquent, les déclarations de SQLSetPos peu sont toujours appliquées à la ligne 1 du jeu de lignes.

CDatabases

Chaque objet CDatabase alloue un seul HDBC. (Si la fonction ExecuteSQL de CDatabaseest utilisée, un HSTMT temporairement attribué.) Donc si plusieurs CDatabaseest nécessaires, plusieurs HDBCs par HENV doivent être appuyés.

Les classes de base de données nécessitent la bibliothèque de curseurs. Cela se traduit en un appel de SQLSetConnections SQL_ODBC_CURSORS, SQL_CUR_USE_ODBC.

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

Le conducteur doit appuyer SQLGetInfo SQL_ODBC_API_CONFORMANCE gt; = SQL_OAC_LEVEL1, SQLGetInfo SQL_ODBC_SQL_CONFORMANCE > = SQL_OSC_MINIMUM.

Pour les transactions à être pris en charge pour l' objet CDatabase et ses jeux d'enregistrements dépendant, SQLGetInfo SQL_CURSOR_COMMIT_BEHAVIOR et SQL_CURSOR_ROLLBACK_BEHAVIOR doivent être SQL_CR_PRESERVE. Sinon, les tentatives pour effectuer le contrôle de la transaction seront ignorés.

SQLGetInfo SQL_DATA_SOURCE_READ_ONLY doit être pris en charge. Si elle retourne « Y », aucune opération de mise à jour ne sera effectuée sur la source de données.

Si l' objet CDatabase est ouvert ReadOnly une tentative d'établir la readonly de source de données sera faite avec SQLSetConnectOption SQL_ACCESS_MODE, SQL_MODE_READ_ONLY.

Si identificateurs besoin de citer, cette information devrait être retournée par le pilote avec un appelSQL_IDENTIFIER_QUOTE_CHAR SQLGetInfo .

À des fins de débogage, SQLGetInfo SQL_DBMS_VER et SQL_DBMS_NAME sont récupérées à partir du pilote.

SQLSetStmtOption SQL_QUERY_TIMEOUT et SQL_ASYNC_ENABLE peuvent être appelée sur un objet CDatabasedu HDBC.

SQLError peut être appelée avec tous les arguments NULL.

Bien sûr, SQLAllocEnv, SQLAllocConnect, SQLDisconnect et SQLFreeConnect doivent être appuyés.

ExecuteSQL

Dans supplémentaire à allouer et libérer un temporaire HSTMT, ExecuteSQL appelle SQLExecDirect, SQLFetch, SQLNumResultCol et SQLMoreResults. SQLCancel peut être appelée sur le HSTMT.

GetDatabaseName

SQLGetInfo SQL_DATABASE_NAME sera appelée.

BeginTrans, CommitTrans, Rollback

SQLSetConnectOption SQL_AUTOCOMMIT et SQLTransact SQL_COMMIT, SQL_ROLLBACK et SQL_AUTOCOMMIT seront appelée si les demandes de transactions sont effectuées.

CRecordsets

SQLAllocStmt, SQLPrepare, SQLExecute (pour Ouvrir et actualiser), SQLExecDirect (pour les opérations de mise à jour), SQLFreeStmt doit être pris en charge. SQLNumResultCols et SQLDescribeCol seront appelée sur les résultats à différents moments.

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

SQLBindCol est largement utilisé pour vous inscrire sortie des emplacements de stockage de données de colonne avec ODBC.

Deux appels de SQLGetData sont utilisés pour récupérer des données SQL_LONG_VARCHAR et SQL_LONG_VARBINARY . Le premier appel tente de trouver de la longueur totale de la valeur de la colonne par appeler SQLGetData avec cbMaxValue de 0, mais avec un pcbValue valide. Si pcbValue est SQL_NO_TOTAL, une exception est levée. Sinon un HGLOBAL est alloué, et un autre appel de SQLGetData fait récupérer l'ensemble de résultats.

Mise à jour

Si le verrouillage pessimiste est demandé, SQLGetInfo SQL_LOCK_TYPES va être interrogé. Si SQL_LCK_EXCLUSIVE n'est pas prise en charge, une exception sera levée.

Tente de mettre à jour un objet CRecordset (instantané ou feuille de réponse dynamique) provoquera une deuxième HSTMT à attribuer. Pour les pilotes qui ne supportent pas le deuxième HSTMT, la bibliothèque de curseurs simulera cette fonctionnalité. Malheureusement, cela peut signifier parfois forcer la requête en cours sur la première HSTMT jusqu'à la fin avant de traiter la demande du deuxième HSTMTdu.

SQLFreeStmt SQL_CLOSE et SQL_RESET_PARAMS et SQLGetCursorName seront appelé au cours des opérations de mise à jour.

S'il y a CLongBinarys dans outputColumns, fonctionnalités DATA_AT_EXEC de ODBC doivent être soutenue. Cela comprend les revenant SQL_NEED_DATA SQLExecDirect, SQLParamData et SQLPutData.

SQLRowCount est appelée après l'exécution pour vérifier que seulement 1 dossier a été mis à jour par la SQLExecDirect.

Curseurs ForwardOnly

Seulement SQLFetch est requis pour les opérations de déplacement . Notez que les curseurs forwardOnly ne supportent pas les mises à jour.

Curseurs de capture instantanée

Fonctionnalité de capture instantanée nécessite le support de SQLExtendedFetch . Comme indiqué ci-dessus, la bibliothèque de curseurs ODBC permet de détecter quand un pilote de ne pas soutenir SQLExtendedFetchet fournir le soutien nécessaire en soi.

SQLGetInfo, SQL_SCROLL_OPTIONS doit prendre en charge SQL_SO_STATIC.

Curseurs de la feuille de réponse dynamique

Voici l'appui minimal requis pour ouvrir une feuille de réponse dynamique:

SQL&GetInfo, SQL_ODBC_VER doit retourner gt ; « 01 ».

SQLGetInfo, SQL_SCROLL_OPTIONS doit prendre en charge SQL_SO_KEYSET_DRIVEN.

SQLGetInfo, SQL_ROW_UPDATES doit retourner « Y ».

SQLGetInfo, SQL_POSITIONED_UPDATES doit prendre en charge SQL_PS_POSITIONED_DELETE et SQL_PS_POSITIONED_UPDATE.

En outre, si la demande de verrouillage pessimiste, un appel à SQLSetPos avec irow 1, fRefresh faux et troupeau SQL_LCK_EXCLUSIVE seront.

&Notes techniques par le numéro |nbsp ; Notes techniques par catégorie

Index