Datenbankintegration: Wie kann ich Access mit anderen Datenbanken wie MySQL oder PostgreSQL verbinden?

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

  1. Access → Externe Daten → ODBC-Datenbank
  2. „VerknĂŒpfen mit Datenquelle“ wĂ€hlen
  3. System-DSN (vorher angelegt) auswÀhlen
  4. 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 _ext oder _pgsql markieren 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:

  • BOOLEAN ist intern TINYINT(1)True/False ist also 0/1.
  • DATETIME kann Sekundenbruchteile speichern – Access nicht.
  • TEXT-Felder können keine Standardwerte haben.
  • AUTO_INCREMENT muss ĂŒber den PrimĂ€rschlĂŒssel laufen.

PostgreSQL:

  • BOOLEAN ist wirklich TRUE/FALSE – aber Access macht oft -1/0.
  • SERIAL oder BIGSERIAL ersetzen Autowert-Felder.
  • TIMESTAMP vs. TIMESTAMP WITH TIME ZONE → Access kennt nur lokales Date/Time.
  • NUMERIC und DECIMAL sind 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 @@IDENTITY oder 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 = NULL korrekt nach SQL-Standard (IS NULL statt = NULL)
  • Access kann da mit „falschen“ Joins oder Filtern zicken
  • MySQL erlaubt manchmal unsaubere Vergleiche (z. B. NULL = '' liefert FALSE, aber auch NULL <> '' → 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.

BereichSQL ServerMySQLPostgreSQL
Performance (ODBC)sehr gutokayokay
Case sensitivityNeinoptionalja
Boolean-1/00/1TRUE/FALSE
AutowertIdentityAuto_IncSerial
Stored ProcsnativeĂŒber CALLĂŒber CALL
ConstraintsAccess-freundlichstriktstrikt
Trigger-kompatibeljateilweisegut

Kategorien:

Schlagwörter: