Ziel: Access als Frontend, Daten aus MySQL oder PostgreSQL im Hintergrund
Access ist schnell gebaut. Aber wenn die Daten in MySQL oder PostgreSQL liegen, brauchst Du eine saubere Anbindung.
Ich zeig Dir, wie Du das stabil aufsetzt – mit ODBC, VBA und wenig Gefrickel.
Voraussetzung: ODBC-Treiber installieren
FĂŒr MySQL:
MySQL ODBC Connector (MySQL Connector/ODBC)
FĂŒr PostgreSQL:
psqlODBC – PostgreSQL ODBC Driver
Installieren. Richtig. Mit Adminrechten.
Variante 1: DSN-Less ODBC-VerknĂŒpfung per VBA
Public Sub VerknuepfeMySQLTabelle()
Dim db As DAO.Database
Set db = CurrentDb
Dim connStr As String
connStr = "ODBC;DRIVER={MySQL ODBC 8.0 Unicode Driver};" & _
"SERVER=192.168.1.10;" & _
"DATABASE=meinprojekt;" & _
"USER=accessuser;" & _
"PASSWORD=geheim;" & _
"OPTION=3"
DoCmd.TransferDatabase acLink, "ODBC Database", connStr, acTable, "kunden", "mysql_kunden"
End Sub
FĂŒr PostgreSQL Ă€hnlich, aber mit:
DRIVER={PostgreSQL Unicode};SERVER=192.168.1.20;PORT=5432;DATABASE=meinprojekt;
So kannst Du das VerknĂŒpfen automatisieren – ohne DSN im System.
Variante 2: ADODB direkt in VBA verwenden
Ideal, wenn Du nur kurz Daten brauchst – z. B. fĂŒr Lookup, Export oder Abgleich.
Public Sub HoleKundenVonMySQL()
Dim conn As Object, rs As Object
Set conn = CreateObject("ADODB.Connection")
Set rs = CreateObject("ADODB.Recordset")
conn.Open "Driver={MySQL ODBC 8.0 Unicode Driver};Server=192.168.1.10;Database=meinprojekt;Uid=accessuser;Pwd=geheim;"
rs.Open "SELECT id, name FROM kunden", conn
Do Until rs.EOF
Debug.Print rs!name
rs.MoveNext
Loop
rs.Close: conn.Close
End Sub
Das geht auch mit UPDATEs und INSERTs.
Variante 3: Tabelle manuell verknĂŒpfen
- Access â Externe Daten â ODBC-Datenbank
- „VerknĂŒpfen mit Datenquelle“ wĂ€hlen
- System-DSN (vorher angelegt) auswÀhlen
- Tabelle(n) auswÀhlen
Benenn um: statt dbo_kunden â pgsql_kunden
So weiĂt Du, woher die Tabelle kommt.
Tipps zur Performance
- niemals
SELECT * - nur verknĂŒpfen, was Du brauchst
- keine komplexen Formulare auf PostgreSQL-Tabellen
- Abfragen auf Serverseite definieren (z. B. Views)
- Primary Keys mĂŒssen gesetzt sein – sonst ist’s read-only
Was Access gut kann:
- einfache Datenerfassung, Anzeige, Suche
- mit MySQL/PostgreSQL arbeiten ĂŒber ODBC
- Abfragen auf Views ausfĂŒhren
- kleine Mengen schnell darstellen
Was Access nicht gut kann:
- keine Massenverarbeitung ĂŒber ODBC
- keine Transaktionen ĂŒber mehrere Systeme hinweg
- keine Trigger, keine Constraints
- keine native PostgreSQL- oder MySQL-Integration
- kein gutes Caching
Wenn Du ernsthaft mit MySQL/PostgreSQL arbeitest:
Access nur als Frontend. Businesslogik und Massenverarbeitung raus aus Access.
Best Practices
- Verbindungsdaten nie hart im Code – lieber verschlĂŒsselt oder konfigurierbar
- System-DSN nur bei Terminalserver oder mehreren Usern
- Fehlermeldungen abfangen – Verbindungsprobleme sauber protokollieren
- Tabellen mit
_extoder_pgsqlmarkieren zur Trennung - keine dauerhaften Verbindungen offen lassen
MySQL und PostgreSQL verhalten sich an einigen Stellen anders als Access oder SQL Server – mal subtil, mal nervig. Wenn Du Access als Frontend nutzt, solltest Du diese Unterschiede unbedingt kennen.
1. Datentyp-Mapping ist nie 1:1
MySQL:
BOOLEANist internTINYINT(1)–True/Falseist also0/1.DATETIMEkann Sekundenbruchteile speichern – Access nicht.TEXT-Felder können keine Standardwerte haben.AUTO_INCREMENTmuss ĂŒber den PrimĂ€rschlĂŒssel laufen.
PostgreSQL:
BOOLEANist wirklichTRUE/FALSE– aber Access macht oft-1/0.SERIALoderBIGSERIALersetzen Autowert-Felder.TIMESTAMPvs.TIMESTAMP WITH TIME ZONEâ Access kennt nur lokalesDate/Time.NUMERICundDECIMALsind prĂ€ziser als Access-Felder, aber fĂŒhren bei falscher Einstellung zu Rundungsproblemen.
đ Tipp: Nutze beim Migrieren Tools wie SSMA oder ODBC mit klaren Konventionen – und prĂŒfe jede Spalte, besonders Boolean, Memo/Text, AutoValue.
2. Kein direkter Jet/ACE-Support
SQL Server hat Native Access Support (JET/ACE Engine optimiert), MySQL/PostgreSQL nicht.
- Performance ist ĂŒber ODBC deutlich schlechter.
- Schreibzugriffe sind riskanter (z. B. bei
Memo-Feld-Ănderungen). - Viele Features wie
@@IDENTITYoder Trigger-RĂŒckgaben funktionieren nicht wie gewohnt.
đ Tipp: Schreib nicht blind in verknĂŒpfte Tabellen – lieber ĂŒber Formulare mit klarer Validierung oder ADODB.
3. PrimĂ€rschlĂŒssel-Pflicht fĂŒr UpdatefĂ€higkeit
Access will fĂŒr verknĂŒpfte Tabellen immer einen eindeutigen PrimĂ€rschlĂŒssel.
Ohne den kann Access:
- keine Ănderungen speichern
- keine Navigation ermöglichen
- keine Daten löschen
In PostgreSQL und MySQL musst Du daher unbedingt PKs korrekt setzen – vor der VerknĂŒpfung.
4. GroĂ-/Kleinschreibung in Feld- und Tabellennamen
PostgreSQL:
- Ist case-sensitive, wenn Du Namen in doppelten AnfĂŒhrungszeichen definierst (
"Vorname"). - Access ist nicht case-sensitive.
Das kann zu „Tabelle nicht gefunden“ fĂŒhren, wenn Du "Kunde" statt "kunde" schreibst.
đ Tipp: Immer alles klein schreiben – auch bei Feldnamen.
MySQL:
- VerhÀlt sich je nach Betriebssystem unterschiedlich!
- Linux: case-sensitive
- Windows: case-insensitive
Das fĂŒhrt zu schwer auffindbaren Fehlern bei Deployment auf Linux.
5. Null-Verhalten
- PostgreSQL behandelt
NULL=NULLkorrekt nach SQL-Standard (IS NULLstatt= NULL) - Access kann da mit „falschen“ Joins oder Filtern zicken
- MySQL erlaubt manchmal unsaubere Vergleiche (z. B.
NULL = ''liefertFALSE, aber auchNULL <> ''âNULL)
đ Tipp: Immer mit Nz() in Access arbeiten, wenn Felder optional sind.
6. Keine gespeicherten Prozeduren wie in SQL Server
Access kann keine Stored Procedures in MySQL/PostgreSQL direkt aufrufen wie in SQL Server (EXEC dbo.ProcXY).
Nur ĂŒber ADODB:
conn.Execute "CALL mein_prozedurname('param1')"
RĂŒckgaben sind oft tricky – du bekommst kein Recordset wie bei SQL Server.
7. Transaktionen funktionieren nur ĂŒber ADODB – nicht DAO
Dim conn As Object
Set conn = CreateObject("ADODB.Connection")
conn.Open "ODBC...MySQL/PostgreSQL"
conn.BeginTrans
conn.Execute "INSERT INTO ..."
conn.CommitTrans
DAO (Recordset/Edit/Update) kennt das nicht zuverlĂ€ssig fĂŒr MySQL/PostgreSQL ĂŒber ODBC.
8. FremdschlĂŒsselverhalten und Constraints
- Access ignoriert viele Constraints im Frontend
- MySQL/PostgreSQL bestehen auf sauberen Foreign Keys
- Access-Formulare mĂŒssen vorbereitet sein auf Fehler wie „foreign key violation“
đ Tipp: Immer Fehler abfangen, sauber behandeln.
Fazit fĂŒr Entwickler
Access spricht mit MySQL und PostgreSQL.
Nicht nativ, nicht schnell – aber stabil, wenn Du’s richtig machst.
Abfrage im Backend, Formular im Access – so bleibt’s wartbar.
| Bereich | SQL Server | MySQL | PostgreSQL |
|---|---|---|---|
| Performance (ODBC) | sehr gut | okay | okay |
| Case sensitivity | Nein | optional | ja |
| Boolean | -1/0 | 0/1 | TRUE/FALSE |
| Autowert | Identity | Auto_Inc | Serial |
| Stored Procs | native | ĂŒber CALL | ĂŒber CALL |
| Constraints | Access-freundlich | strikt | strikt |
| Trigger-kompatibel | ja | teilweise | gut |