Warum bricht die Verbindung zur MySQL-Datenbank nur bei manchen Kollegen ab? (32-Bit- vs. 64-Bit-Access)
Eine DSN-lose ODBC-Verbindung von Access zu einem MySQL-Server läuft bei der Hälfte der Kollegen einwandfrei – bei der anderen Hälfte kommt beim Start nur eine trockene Fehlermeldung: Treiber nicht gefunden. Beide Gruppen nutzen dieselbe Access-Datenbank, denselben Server, dieselbe Verbindungszeichenkette. Der Unterschied liegt nicht im Code, sondern in der Bitness der installierten Office-Version.
Das Problem: zwei Bitnesses, zwei Treiberwelten
Wer Access-Datenbanken über Abteilungsgrenzen hinweg bereitstellt, landet fast zwangsläufig in einer gemischten Umgebung. Ältere Arbeitsplätze laufen oft noch mit 32-Bit-Access, weil ein Add-in oder eine COM-Referenz das erzwingt. Kollegen mit frischem Microsoft 365 bekommen dagegen standardmäßig die 64-Bit-Version installiert. Beide Access-Varianten laufen auf demselben 64-Bit-Windows – aber sie sehen unterschiedliche ODBC-Treiber.
ODBC-Treiber sind bitspezifisch: Ein 32-Bit-Prozess sieht nur 32-Bit-Treiber, ein 64-Bit-Prozess nur 64-Bit-Treiber. Das gilt unabhängig vom Betriebssystem, das in beiden Fällen 64-Bit sein kann. Deshalb erscheinen auf einem 64-Bit-Windows zwei getrennte ODBC-Administratoren: C:\Windows\System32\odbcad32.exe verwaltet die 64-Bit-Treiber, C:\Windows\SysWOW64\odbcad32.exe die 32-Bit-Treiber. Wer im falschen Administrator nach einem Treiber sucht, findet ihn schlicht nicht – er ist nicht fehlerhaft installiert, sondern im anderen Zweig registriert.
Wo die passenden Treiber tatsächlich liegen
Die offizielle MySQL-Downloadseite (dev.mysql.com/downloads/connector/odbc/) zeigt für Windows aktuell nur noch die 64-Bit-Variante an – derzeit Version 26.7.1. Wer einen 32-Bit-Treiber braucht, findet ihn dort nicht mehr im Hauptformular, sondern nur noch im Archiv unter downloads.mysql.com/archives/c-odbc/.
Der Grund dafür ist eine bewusste technische Entscheidung von MySQL: Ab Connector/ODBC 8.1.0 gibt es für Windows keine 32-Bit-Builds mehr. Die 32-Bit-Unterstützung wurde bewusst in der 8.0.x-Reihe eingefroren und läuft dort als reine Bugfix-Linie weiter, ohne neue Funktionen. Aktuell ist 8.0.46 die letzte in der 8.0.x-Reihe verfügbare 32-Bit-Version für Windows – zu finden im Archiv, nicht auf der Hauptseite.
Ein zweiter Stolperstein bei der Installation: Ab Connector/ODBC 8.0.40 wird die Visual C++ Runtime 2022 (Version 14.40 oder neuer) vorausgesetzt, ältere 8.0.x-Versionen kommen noch mit der Runtime 2015/2017 aus. Fehlt die passende Runtime, bricht die Installation mit einer wenig aussagekräftigen Fehlermeldung ab.
Der Versionssprung von 9.7.0 auf 26.7.1: kein Grund zur Sorge
Wer die Archiv-Liste durchgeht, stolpert über einen scheinbaren Bruch: nach 9.7.0 kommt direkt 26.7.1. Das ist kein Ausreißer und kein übersprungenes Major-Release. MySQL synchronisiert seit Connector/ODBC 8.0.11 die erste Versionsziffer seiner Client-Tools mit der aktuellen MySQL-Server-Version, damit auf einen Blick klar ist, welcher Treiber zu welchem Server passt. Version 26.7.0 wurde ausschließlich veröffentlicht, um die Versionsnummer an den MySQL-Server-Release 26.7.0 anzugleichen – ohne funktionale Änderungen gegenüber 9.7.0.
Kurz gesagt: Die Versionsnummer beim Connector/ODBC sagt nichts über den Funktionsumfang aus, sondern nur, mit welcher Server-Generation er offiziell abgestimmt ist.
VBA-Code: Bitness und Treiber beim Access-Start automatisch prüfen
In einer gemischten Umgebung lohnt es sich, die Prüfung nicht dem Anwender zu überlassen. Der folgende Code ermittelt beim Start der Datenbank, ob Access als 32-Bit- oder 64-Bit-Prozess läuft, und durchsucht anschließend die passende Registry-Verzweigung nach installierten MySQL-ODBC-Treibern.
Der Trick dabei: Ein 32-Bit-Access-Prozess liest unter Windows automatisch aus dem umgeleiteten Registry-Zweig (WOW6432Node), ein 64-Bit-Prozess aus dem regulären Zweig – ganz ohne dass der Code das selbst unterscheiden muss. Windows erledigt die Umleitung transparent.
Public Function MySQLODBCTreiberPruefen() As String
' Ermittelt die Bitness von Access und listet installierte MySQL-ODBC-Treiber auf.
' Nutzt reg.exe, weil Windows die Registry-Abfrage automatisch auf den
' zur Prozess-Bitness passenden Zweig (WOW6432Node bei 32-Bit) umleitet.
Dim oShell As Object
Dim sTempDatei As String
Dim sBefehl As String
Dim iFile As Integer
Dim sZeile As String
Dim sGefunden As String
Dim bIst64Bit As Boolean
#If Win64 Then
bIst64Bit = True
#Else
bIst64Bit = False
#End If
sTempDatei = Environ$("TEMP") & "\odbc_treiber_check.txt"
sBefehl = "cmd /c reg query ""HKLM\SOFTWARE\ODBC\ODBCINST.INI\ODBC Drivers"" > """ & sTempDatei & """ 2>nul"
Set oShell = CreateObject("WScript.Shell")
oShell.Run sBefehl, 0, True ' 0 = unsichtbar, True = warten bis reg.exe fertig ist
If Len(Dir(sTempDatei)) = 0 Then
MySQLODBCTreiberPruefen = "Registry-Abfrage fehlgeschlagen."
Exit Function
End If
iFile = FreeFile
Open sTempDatei For Input As #iFile
Do Until EOF(iFile)
Line Input #iFile, sZeile
If InStr(1, sZeile, "MySQL", vbTextCompare) > 0 Then
sGefunden = sGefunden & Trim$(sZeile) & vbCrLf
End If
Loop
Close #iFile
Kill sTempDatei
If Len(sGefunden) = 0 Then
MySQLODBCTreiberPruefen = IIf(bIst64Bit, "64-Bit", "32-Bit") & _
"-Access: kein MySQL-ODBC-Treiber registriert."
Else
MySQLODBCTreiberPruefen = IIf(bIst64Bit, "64-Bit", "32-Bit") & _
"-Access, gefundene Treiber:" & vbCrLf & sGefunden
End If
End Function
Vor dem Verbindungsaufbau eingesetzt, warnt die Funktion frühzeitig statt erst beim kryptischen ODBC-Fehler. In der Praxis reicht ein Aufruf in der AutoExec-Makrologik oder im Form_Load-Ereignis des Startformulars:
Private Sub Form_Load()
Dim sStatus As String
sStatus = MySQLODBCTreiberPruefen()
If InStr(1, sStatus, "kein MySQL-ODBC-Treiber", vbTextCompare) > 0 Then
MsgBox "Für diese Access-Version ist kein passender MySQL-ODBC-Treiber " & _
"installiert. Bitte IT-Support kontaktieren." & vbCrLf & vbCrLf & sStatus, _
vbExclamation, "Treiber fehlt"
End If
End Sub
Für die eigentliche DSN-lose Verbindung lässt sich der ermittelte Treibername direkt in die Connection-String-Erstellung übernehmen, statt ihn hart zu codieren – dann funktioniert dieselbe Codebasis auf 32-Bit- und 64-Bit-Arbeitsplätzen, ohne dass zwei Versionen der Datenbank gepflegt werden müssen.
Einschränkung
Der Registry-Umweg über reg.exe und eine temporäre Textdatei ist pragmatisch, aber kein sauberes API-Design – wer lieber direkt gegen die Windows-Registry-API deklariert (RegOpenKeyEx, RegEnumValue), kommt ohne Shell-Aufruf und Zwischendatei aus. Für die meisten Access-Umgebungen ist der hier gezeigte Weg aber ausreichend robust, und er funktioniert auch dann noch, wenn die Registry-API-Deklarationen wegen einer 32→64-Bit-Migration gerade selbst in Arbeit sind.
Wer produktiv mit MySQL 8.0 oder neuer arbeitet und 32-Bit-Access dauerhaft vermeiden kann, sollte das tun: Die 32-Bit-Linie bei den Connector/ODBC-Treibern bekommt nur noch Bugfixes, keine neuen Funktionen mehr.
Wenn dich nicht der Treiber-Code selbst interessiert, sondern die grundsätzliche Frage, ob sich eure gewachsene Access-Landschaft überhaupt noch wirtschaftlich betreiben lässt, statt sie durch ein neues ERP zu ersetzen: Ein unverbindliches Erstgespräch gibt es über sesoft.de/kostenloses-erstgespraech-sichern.
Quellen
- MySQL :: Download Connector/ODBC (Archived Versions): downloads.mysql.com/archives/c-odbc
- MySQL Connector/ODBC Developer Guide, Kapitel „Connector/ODBC Version History“: dev.mysql.com/doc/connector-odbc/en/connector-odbc-support-version-history.html
- MySQL Connector/ODBC Developer Guide, Kapitel „Installing Connector/ODBC on Windows“: dev.mysql.com/doc/connector-odbc/en/connector-odbc-installation-binary-windows.html
- MySQL Connector/ODBC Release Notes, Version 26.7.0: dev.mysql.com/doc/relnotes/connector-odbc/en/news-26-7-0.html
Sönke Schäfer
Sönke Schäfer berät seit über 25 Jahren norddeutsche KMU bei der Modernisierung und dem Betrieb von Microsoft-Access-Anwendungen. Sein Schwerpunkt liegt auf der 32-auf-64-Bit-Migration gewachsener Access-Datenbanken sowie der Anbindung an SQL Server und externe Datenquellen über ODBC und REST.


