Généralités sur la connectivité ODBC/OLEDB 32-bits et 64-bits sur un OS 64-bits

Aujourd’hui, Je vous propose de partager mon expérience sur les problèmes 32-bits / 64-bits en termes de connectivité SQL/Oracle/ODBC/OLEDB.
Nous allons voir plusieurs cas d’école – et quelles sont les meilleures pratiques à utiliser dans chacune d’entre elles.

On va commencer par quelques conventions de nommage… avec pour postulat de base que nous sommes sur un système d’exploitation 64-bits (XP, Vista, 2003, 2008, 7…).

J’appellerai donc "x86" ou "32-bits" tout process ou DLL 32-bits – et "x64" ou "64-bits" tout process ou DLL 64-bits.
Comment les différencier ?
- Un process x86 est généralement installé dans C:\Program Files (x86) - ou C:\Windows\SysWow64.
- Un process x64 est généralement installé dans C:\Program Files – ou C:\Windows\System32.

Certaines installations peuvent être différentes, ce qui complique la tache – vous pouvez donc utiliser le gestionnaire de taches pour savoir si votre process est 32-bits ou 64-bits.

Concernant les DLLs :
- Les DLLs x86 sont généralement situées dans C:\Windows\SysWow64
- Les DLLs x64 sont généralement situées dans C:\Windows\System32
- On peut également utiliser l’outil Dumpbin pour vérifier si une DLL est 32-bits ou 64-bits.

Le nommage est malheureusement trompeur. A noter que SysWow64 signifie "Windows On Windows" - et permet donc de lancer un process 32-bits dans un OS 64-bits.

OK … donc quelques études de cas:

- J'ai une application 32-bits utilisant un DSN – et je ne trouve pas mon driver ODBC ….

Alors généralement, on crée un DSN avec l'administrateur de sources de données ODBC (communément appelé odbcad32.exe). Quand vous faites Démarrer/Exécuter, vous allez donc lancer la version 64-bits de l'outil (située dans C:\Windows\System32).

Comme il s'agit d'un process 64-bits – il ne sera capable de charger que … des drivers 64-bits – tout à fait !

Exemple :

clip_image001

Ici, on ne voit QUE des drivers 64-bits.

Pour comparaison, si vous lancez ODBCAD32.exe version 32-bits située dans C:\Windows\SysWow64, alors vous pourrez créer un DSN utilisant un driver 32-bits:

clip_image002

On voit ici qu'on retrouve les drivers ODBC pour Excel, pour une base Access, etc …
Ces drivers n'existent en effet qu'en version 32-bits pour l'instant. Office 14 aura une version 64-bits, et ces drivers seront normalement disponibles en 64-bits.

Dans la version 64-bits, on notera la présence du driver ODBC pour Oracle (Oracle in OraClient11g_Home1 dans mon cas – fichier SQORA32.dll) – qui existe en 64-bits.
Celui de Microsoft (Microsoft ODBC for Oracle – fichier msorcl32.dll) n'existe pas en 64-bits – et est à éviter si votre serveur Oracle n'est pas en version 7 ou 8 (cf INFO: Limitations of Microsoft Oracle ODBC Driver and OLEDB Provider sur https://support.microsoft.com/kb/244661) – et la matrice 32-bits / 64-bits.

- J'ai une application 32-bits utilisant OLEDB – et je ne trouve pas mon provider OLEDB …

Ici, même chose que pour ODBC. Il existe des providers OLEDB 32-bits et des versions 64-bits.

L'outil généralement utilisé pour créer une chaine de connexion OLEDB est le fichier .UDL. Pour ceux qui ne connaissent pas, créez un fichier Texte (.TXT) sur votre bureau, et changez l'extension .TXT en .UDL. Double-cliquez sur le fichier et vous verrez apparaitre un assistant. Cet assistant liste les providers OLEDB installés sur la machine – et permet de tester une connexion. Si vous ouvrez le .UDL avec le bloc-notes, vous obtiendrez une chaine de connexion toute prête à être copiée/collée dans votre application.

Exemple sur un 64-bits:

clip_image003

OK – mais comment je fais pour avoir la liste des Providers 32-bits ? vu que le fichier .UDL n'est ni 32-bits, ni 64-bits ?

Là, c'est un peu futé – puisque l'assistant UDL fonctionne sous RUNDLL32.exe (process 32 ou 64-bits).
Il faut donc se créer un autre fichier UDL (disons spécial 32-bits) et utiliser la ligne de commande suivante pour ouvrir un UDL 32-bits:

          C:\WINDOWS\SysWOW64\Rundll32.exe C:\PROGRA~2\COMMON~1\System\OLEDB~1\oledb32.dll,OpenDSLFile c:\users\axelg\desktop\Test_UDL_x86.UDL

Décryptons cette ligne de commande :

C:\WINDOWS\SysWOW64\Rundll32.exeà on lance la version 32-bits de RUNDLL32.exe…

C:\PROGRA~2\COMMON~1\System\OLEDB~1\oledb32.dllà On lui passe comme paramètre la version 32-bits de OLEDB32.dll (située dans C:\Program Files (x86)\Common Files\System\OLE DB\)

,OpenDSLFile c:\users\axelg\desktop\Test_UDL_x86.UDLà On lui demande d'ouvrir le fichier UDL "spécial 32-bits" nommé dans mon cas Test_UDL_x86.udl.

Et voilà ce qu'on obtient :

clip_image004

Vous noterez en particulier le provider Microsoft Jet OLEDB 4.0 – si cher aux utilisateurs d'Access.
Là encore, ce provider n'existe qu'en 32-bits.
Vous remarquerez également la présence de ACE.OLEDB.12.0 (juste en dessous de Jet) qui est le nouveau moteur Jet – à préférer à Jet dorénavant.

Que peut-on voir d'autre comme provider?

Microsoft OLE DB Provider for Oracle (fichier msdaora.dll)… Le provider OLEDB pour Oracle développé par Microsoft. Il faut noter que ce provider est en mode “deprecated” – et n'est supporté que contre des serveurs Oracles 7 et 8 (cf INFO: Limitations of Microsoft Oracle ODBC Driver and OLEDB Provider sur https://support.microsoft.com/kb/244661)

La recommandation Microsoft est d'utiliser le provider OLEDB pour Oracle développé par Oracle (Oracle OLE DB Provider for Oracle – fichier OraOLEDB.dll).
Celui-ci est fourni avec la couche cliente Oracle – et sera donc toujours à jour des dernières nouveautés fournies par Oracle.

SQL Native Client(fichier sqlncli.dll)…

Il s'agit de la nouvelle librairie de connexion à un serveur SQL – livrée avec SNAC (nouveau nom pour MDAC). A noter que sqlncli.dll livre le driver ODBC pour SQL (ODBC SQL Server - sqlsrv32.dll) ainsi que le provider OLEDB pour SQL (Microsoft OLEDB Provider for SQL – sqloledb.dll) – tout ça dans le même fichier. Il existe en 32-bits et en 64-bits – c'est pour cela qu'on voit le voit apparaitre dans ODBCAD32.exe et dans le fichier UDL.

-Axel GUERRIER