Le gestionnaire de pilotes
Le gestionnaire de pilotes est une bibliothèque qui gère la communication entre les applications et les pilotes. Par exemple, sur les plateformes Microsoft Windows, le gestionnaire de pilotes est une bibliothèque de liaisons dynamiques (DLL) écrite par Microsoft. Elle peut être redistribuée par les utilisateurs du Kit de développement logiciel (SDK) CAMD 2.8 SP1 redistribuable.
Le gestionnaire de pilotes existe principalement pour faciliter la tâche des développeurs d'applications. Aussi, il résout un certain nombre de problèmes communs à toutes les applications. Il s'agit notamment de déterminer le pilote à charger en fonction d'un nom de source de données, du chargement et du déchargement de pilotes et d'appels de fonctions dans les pilotes.
Pour comprendre pourquoi ce dernier point pose problème, examinons ce qui se passerait si l'application appelait directement les fonctions du pilote. À moins que l'application ne soit liée directement à un pilote particulier, elle devrait créer une table de pointeurs vers les fonctions de ce pilote et appeler ces fonctions par pointeur. L'utilisation du même code pour plusieurs pilotes à la fois ajouterait un autre niveau de complexité. L'application doit d'abord définir un pointeur de fonction qui va pointer vers la bonne fonction dans le bon pilote, puis appeler la fonction via ce pointeur.
Le gestionnaire de pilotes résout ce problème en fournissant un emplacement unique pour appeler chaque fonction. L'application est liée au gestionnaire de pilotes et appelle les fonctions ODBC dans le gestionnaire de pilotes, et non dans le pilote. L'application identifie le pilote cible et la source de données avec un descripteur de connexion. Lorsqu'il charge un pilote, le gestionnaire de pilotes crée une table de pointeurs vers les fonctions de ce pilote. Il utilise le descripteur de connexion transmis par l'application pour rechercher l'adresse de la fonction dans le pilote cible et appelle cette fonction par l'adresse.
Dans la plupart des cas, le gestionnaire de pilotes ne fait que transmettre les appels de fonction de l'application au bon pilote. Cependant, il met également en œuvre certaines fonctions (SQLDataSources, SQLDrivers et SQLGetFunctions) et effectue une vérification des erreurs de base. Par exemple, le gestionnaire de pilotes vérifie que les descripteurs ne sont pas des pointeurs nuls. De plus, il s'assure que les fonctions sont appelées dans le bon ordre et que certains arguments des fonctions sont valides. Pour une description complète des vérifications des erreurs contrôlées par le gestionnaire de pilotes, consultez la section de référence de chaque fonction et l'Annexe B : Tables de transition d'état ODBC.
Le dernier rôle majeur du gestionnaire du pilote est le chargement et le déchargement des pilotes. L'application charge et décharge uniquement le gestionnaire de pilote. Lorsqu'il veut utiliser un pilote particulier, il appelle une fonction de connexion (SQLConnect, SQLDriverConnect ou SQLBrowseConnect) dans le gestionnaire de pilotes et spécifie le nom d'une source de données ou d'un pilote particulier, tel que la « gestion des comptes » ou « SQL Server ». À partir de ce nom, le gestionnaire de pilotes recherche dans les informations sur la source de données le nom de fichier du pilote, par exemple Sqlsrvr.dll. Ensuite, il charge le pilote (s'il n'est pas déjà chargé), enregistre l'adresse de chaque fonction dans le pilote et appelle la fonction de connexion dans le pilote, qui s'initialise et se connecte à la source de données.
Lorsque l'application est effectuée à l'aide du pilote, elle appelle SQLDisconnect dans le gestionnaire de pilotes. Le gestionnaire de pilote appelle cette fonction dans le pilote, qui se déconnecte de la source de données. Toutefois, le gestionnaire de pilotes conserve le pilote en mémoire en prévision d'une éventuelle reconnexion de l'application. Il ne décharge le pilote que lorsque l'application libère la connexion utilisée par le pilote ou utilise la connexion pour un autre pilote, et lorsqu'aucune autre connexion n'utilise le pilote. Pour une description complète du rôle du gestionnaire de pilotes dans le chargement et le déchargement des pilotes, consultez Rôle du gestionnaire de pilotes dans le processus de connexion.