Gestern bin ich auf ein Problem mit ODBC-Treibern unter 64Bit Systemen wie z.B. Windows 2003 Server oder Windows Vista gestoßen. Dabei sollte eine .NET Anwendung die bisher auf allen 32Bit Systemen problemlos lief auf einem 64Bit Windows 2003 Server installiert und betrieben werden. Das Starten der Anwendung war auch problemlos möglich nur beim Verbinden mit der Datenbank konnte meine Anwendung den ODBC-Treiber bzw. den zugehörigen DSN nicht finden.
Nach aufwendiger Suche hat sich als erstes gezeigt das unter 64 Bit Systemen ODBC nicht gleich ODBC ist. Dies liegt daran das es zwei Arten von ODBC Treibern gibt, 32Bit und 64Bit ODBC Treiber. Viele Systeme liefern bisher aber noch ausschließlich die 32Bit Treiber aus und installieren diese auch. Wenn man nun unter dem Menüpunkt Systemsteuerung->Verwaltung->Datenquellen die Einträge für den System-DSN, User-DSN oder den zugehörigen ODBC Treiber sucht wird man nichts finden. Hier werden lediglich die DSN’s und Treiber angezeigt die 64Bit tauglich sind.
Um sich nun auch die 32Bit Treiber und DSN’s anzeigen zu lassen gibt es aber einen Trick. Mit dem Programm odbcad32.exe, das unter C:WindowsSysWOW64odbcad32.exe zu finden ist, wird vom Aussehen her genau die gleiche Datenquellenanzeige gestartet wie unter Systemsteuerung->Verwaltung->Datenquellen, jedoch dieses mal mit den 32Bit Treibern und DSN’s. Wie kann aber nun meine Anwendung festlegen das sie einen 32Bit oder 64Bit ODBC-Treiber verwenden will? Im Sourcecode ist das meines Wissens nach gar nicht möglich. Generell ist es so das 32Bit Anwendungen automatisch auf 32Bit ODBC-Treiber zugreifen und 64Bit Anwendungen auf die 64Bit ODBC-Treiber.
Deshalb muss man seiner Anwendung sagen das Sie explizit als 32Bit Anwendung ausgeführt werden soll. Dazu muss man im VisualStudio in den Projekteinstellungen seiner Windows-Anwendung (.exe Datei) unter dem Reiter „Erstellen“ die Zielplattform von „Any CPU“ auf „x86“ umstellen. Dadurch wird die Anwendung explizit als 32Bit Anwendung gestartet und auch die zugehörigen ODBC-Treiber benutzt. Dies ist nur im Projekt der Startanwendung (.exe) nötig, nicht bei evt. eingebundenen DLLs. Die Angabe „x86“ ist hier gleichzusetzen mit 32Bit Anwendung und „x64“ mit 64Bit Systemen. Bei „Any CPU“ wird die Anwendung als 64Bit Anwendung gestartet falls es sich um ein 64Bit System handelt.