Im Beitrag RDBMS-Tabellen manuell verknüpfen haben Sie erfahren, wie Sie die Tabellen eines relationalen Datenbankmanagementsystems wie Microsoft SQL Server oder MySQL mit den Bordmitteln von Access verknüpfen. Im vorliegenden Beitrag schauen wir uns an, wie Sie dies per VBA erledigen können. Dabei lernen Sie auch die verschiedenen Verbindungszeichenfolgen kennen.
Wenn Sie eine Tabelle etwa vom SQL Server oder MySQL (stellvertretend für die vielen relationalen Datenbankmanagement-Systeme, die eine ODBC-Schnittstelle anbieten) verknüpfen, befinden sich ja nicht die Daten selbst in der Access-Datenbank, sondern nur die Verknüpfungen zu den Daten in den zugrunde liegenden Tabellen.
Wo aber speichert Access die Informationen darüber, wo sich diese Tabellen befinden Ein Teil dieser Informationen landet, wenn Sie die Verknüpfung über eine DSN (Data Source Name) erstellt haben, in der Registry (System-datenquelle oder Benutzerdatenquelle) oder in einer Textdatei (Dateidatenquelle).
Wir schauen uns dies anhand einiger Beispiele für den Zugriff auf eine MySQL-Datenbank an. Dazu legen wir, wie im Beitrag SQL-Server-Tabellen manuell verknüpfen beschrieben, drei Verknüpfungen zu einer Tabelle einer MySQL-Datenbank an – jeweils eine mit einer Dateidatenquelle, einer Benutzerdatenquelle und einer Systemdatenquelle. Wo wir die zugrunde liegenden Informationen dieser DSN finden, wissen wir – entweder in der Registry oder ein einer .dsn-Datei.
Die Systemtabelle MSysObjects
Aber woher weiß Access, woher es die Informationen über die Verknüpfungen nehmen soll Diese Daten finden wir in der Systemtabelle MSysObjects. Um diese Tabelle, die standardmäßig nicht sichtbar ist, zu öffnen, geben Sie im VBA-Editor den folgenden Befehl ein:
DoCmd.OpenTable "MSysObjects"
Den Inhalt dieser Tabelle nach dem Anlegen dreier Verknüpfungen wie oben beschrieben finden Sie wie in Bild 1 vor. Interessant sind hier vier Felder: Das Feld Type enthält den Objekttyp. Der Wert 4 steht für per ODBC eingebundene Tabellen.
Bild 1: Verknüpfungseigenschaften in der Systemtabelle MSysObjects
ForeignName enthält den Namen der Tabelle in der Quelldatenbank, Name den Namen der Tabelle in der aktuellen Access-Datenbank. Connect liefert schließlich die Verbindungszeichenfolge. Und hier wird es interessant: Die per Dateidatenquelle eingebundene Tabelle referenziert im Gegensatz zu den beiden per System- oder Benutzerdatenquelle eingebundenen Tabellen gar keine externen Informationen.
Das bedeutet also, dass eine Dateidatenquelle nur zum Erstellen der Verknüpfung verwendet wird, danach nicht mehr. Die System- oder Benutzerdatenquelle hingegen wird wohl zumindest beim ersten Zugriff auf die verknüpfte Tabelle innerhalb einer Sitzung abgefragt.
Sinn der DSN
An dieser Stelle stellt sich die Frage nach dem Sinn einer DSN. Tatsächlich hängt es vom Anwendungsfall ab. Wenn die DSN nur von einer einzigen Datenbank verwendet wird, spielt es keine Rolle, ob Sie die Verknüpfungseigenschaften in der Datenbank speichern oder in eine DSN auslagern.
Sollten hingegen gleich mehrere Anwendungen auf die DSN zugreifen, hat eine System- oder Benutzerdatenquelle durchaus ihren Nutzen: Sie brauchen dann, wenn sich etwa der Servername der Datenquelle einmal ändert, nur die DSN anzupassen. Wenn Sie hingegen mehrere Datenbanken nutzen, die alle individuell mit der gleichen Datenquelle verknüpft sind, ohne eine System- oder Benutzerdatenquelle zu nutzen, müssen Sie die Verknüpfungsinformationen in allen betroffenen Datenbanken anpassen.
Wenn Sie die Verknüpfungseigenschaften allein in der Frontend-Datenbank speichern, haben Sie sogar den Vorteil, dass Sie diese Datenbank einfach verteilen können, ohne noch eine Benutzer- oder Systemdatenquelle hinzufügen zu müssen.
Verbindungszeichenfolge
Damit kommen wir nun dazu, uns den Umweg über die Assistenten zum Erstellen von Verknüpfungen zu ODBC-Datenquellen zu sparen und die Verknüpfung selbst zu erstellen. Dazu schauen wir uns zunächst an, wie solch eine Verbindungszeichenfolge überhaupt aufgebaut ist.
Kennzeichnung als ODBC-Verknüpfung
Diese beginnen immer mit dem Schlüsselwort ODBC, gefolgt von einem Semikolon (;). Dieses wird jedoch in der Eigenschaft Connect der verknüpften Tabellen in der Tabelle MSysObjects gar nicht aufgeführt. Der Grund ist: In der Spalte Connect landen ausschließlich Verbindungszeichenfolgen für ODBC-Datenquellen, daher wird das ODBC; hier weggelassen. Dass es dennoch nötig ist, zeigt ein Blick in die Eigenschaften des Entwurfs einer der betroffenen Tabellen (s. Bild 2).
Bild 2: Verknüpfungseigenschaften in den Eigenschaften des Tabellenentwurfs
Treiber festlegen
Neben dem einführenden ODBC; erwartet eine Verbindungszeichenfolge die Angabe des Treibers für die zu verwendende ODBC-Schnittstelle. Diese werden unter DRIVER angegeben. Für den SQL Server verwenden Sie beispielsweise die folgenden Werte – zunächst für den allgemeinen Treiber:
DRIVER={SQL Server};
Für eine bestimmte Version des SQL Servers verwenden Sie diesen Treiber:
DRIVER={SQL Server Native Client x.0};
Das x steht dabei für die Version des SQL Servers:
- 9: SQL Server 2005
- 10: SQL Server 2008/2008 R2
- 11: SQL Server 2012
Für die aktuellen Versionen von MySQL verwenden Sie beispielsweise die folgenden Treiber-Ausdrücke – hier für die Version 5.2 (für Version 5.3 einfach 2 durch 3 ersetzen):
DRIVER={MySQL ODBC 5.2 ANSI Driver}; DRIVER={MySQL ODBC 5.2 Unicode Driver};
Diese ersetzen die zuvor verwendeten folgenden Ausdrücke für die Version 5.1 (a für ANSI, w für Unicode):
DRIVER={MySQL ODBC 5.1a Driver}; DRIVER={MySQL ODBC 5.1w Driver};
Festlegen des Servers
Mit dem Parameter SERVER geben Sie die Adresse des Servers an. Bei Verwendung von SQL Server können Sie beim Zugriff auf die Standardinstanz auf dem gleichen Rechner den Wert localhost, den Punkt (.) oder den Rechnernamen angeben – also beispielsweise so:
SERVER=localhost; SERVER=. SERVER=Rechnername
Wenn Sie auf die Standardinstanz von SQL Server auf einem anderen Rechner zugreifen wollen, geben Sie einfach dessen Rechnernamen als Wert an:
SERVER=Rechnername;
Bei SQL Server gibt es benannte Instanzen. Auf diese greifen Sie zu, indem Sie diese per Backslash (\) vom Ausdruck für den Rechner getrennt angeben:
SERVER=localhost\BenannteInstanz SERVER=.\BenannteInstanz SERVER=Rechnername\BenannteInstanz
Bei Verwendung von SQL Server Express Edition geben Sie explizit SQLEXPRESS als Instanzname an, zum Beispiel so:
SERVER=localhost\SQLEXPRESS SERVER=Rechnername\SQLEXPRESS
Bei MySQL geben Sie beispielsweise localhost an, wenn sich MySQL auf dem gleichen Rechner befindet:
SERVER=localhost
Wenn es sich bei dem Rechner mit der MySQL-Installation etwa um einen Internetserver handelt, auf den Sie von außen zugreifen wollen, geben Sie die IP des Servers an:
SERVER=xxx.xxx.xxx.xxx
Angeben der Datenbank
Die Datenbank legen Sie mit dem Parameter DATABASE fest. Diesem übergeben Sie schlicht und einfach den Datenbanknamen:
DATABASE:Datenbankname;
Authentifizierungsmethode und -daten
Die Authentifizierungsmethode geben Sie nur beim SQL Server an. Dieser bietet ja die Möglichkeit, mit Windows-Authentifizierung zu arbeiten, also die Windows-Benutzerdaten zu verwenden. In diesem Fall stellen Sie den Parameter Trusted_Connection auf den Wert True ein:
TRUSTED_CONNECTION=true;
Verwenden Sie unter SQL Server die SQL Server-Authentifizierung, also mit separaten Benutzerkonten für den SQL Server, geben Sie Benutzername und Kennwort mit den Parametern UID und PWD an:
UID=Benutzername;PWD=Kennwort;
Dies gilt in dieser Form auch für MySQL.
Verknüpfung per VBA anlegen
Damit haben wir nun alle Informationen zusammen, um eine Verknüpfung per VBA zu erstellen.
Dies erledigen wir zunächst in einer einfachen VBA-Prozedur unter hartkodierter Eingabe der Parameter (s. Listing 1) – und zwar für eine Verknüpfung zu einer Tabelle einer MySQL-Datenbank.
Public Sub VerknuepfungErstellen() Dim strConnection As String Dim db As DAO.Database Dim tdf As DAO.TableDef strConnection = strConnection & "ODBC;" strConnection = strConnection & "DRIVER={MySQL ODBC 5.2 ANSI Driver};" strConnection = strConnection & "SERVER=xxx.xxx.xxx.xxx;" strConnection = strConnection & "DATABASE=MeineDatenbank;" strConnection = strConnection & "UID=MeinBenutzername;" strConnection = strConnection & "PWD=MeinKennwort;" Set db = CurrentDb On Error Resume Next db.TableDefs.Delete "tblBenutzer" On Error GoTo 0 Set tdf = db.CreateTableDef("tblBenutzer") With tdf .Connect = strConnection .SourceTableName = "s_user" End With db.TableDefs.Append tdf tdf.RefreshLink Application.RefreshDatabaseWindow End Sub
Listing 1: Erstellen einer Verknüpfung per VBA
Die Prozedur Verknuepfung-Er-stel-len stellt zunächst die Verbindungszeichenfolge in der Variablen strConnection zusammen. Diese sieht zusammengefasst so aus:
Ende des frei verfügbaren Teil. Wenn Du mehr lesen möchtest, hole Dir ...
den kompletten Artikel im PDF-Format mit Beispieldatenbank
diesen und alle anderen Artikel mit dem Jahresabo