RDBMS-Zugriff per VBA: Verbindungen

Wenn Sie ein Abonnement des Magazins 'Access im Unternehmen' besitzen, können Sie sich anmelden und den kompletten Artikel lesen.
Anderenfalls können Sie das Abonnement hier im Shop erwerben.

RDBMS-Zugriff per VBA: Verbindungen

Wenn Sie von Access aus auf die Daten einer SQL Server-Datenbank (und neuerdings auch auf LocalDB-Datenbanken) zugreifen wollen, müssen Sie mit Bordmitteln arbeiten, die häufig nicht zufriedenstellend sind. Wir haben einen Satz von Tools entwickelt, mit denen Sie eine Reihe von Aufgaben sehr schnell erledigen können: Verbindungen definieren, Tabellen verknüpfen und SQL-Abfragen direkt an den Server schicken. Dieser Beitrag zeigt, wie Sie mithilfe eines Teils dieser Tools per VBA auf SQL Server und Co. zugreifen.

Mal eben eine Auswahlabfrage oder Pass-Through-Abfrage per VBA an den SQL Server absetzen – das wäre doch eine praktische Sache.

Sie werden an verschiedenen Stellen per VBA auf die Tabellen der SQL Server-Datenbank zugreifen müssen – sei es, um eine ODBC-Verknüpfung herzustellen oder zu aktualisieren, das Ergebnis einer gespeicherten Abfrage abzurufen oder eine solche auszuführen oder auch um ein Recordset auf Basis einer gespeicherten Prozedur einem Formular oder einem Steuerelement zuzuweisen. Alles, was Sie wissen müssen, um dies zu erledigen, erfahren Sie in diesem Beitrag.

Beispieldatenbank

Als Beispieldatenbank verwenden wir die Datenbank Suedsturm.mdf, die Sie wie im Beitrag Access und LocalDB (www.access-im-unternehmen.de/1057) beschrieben nutzen können. Alternativ können Sie diese natürlich auch per SQL Server nutzen. Die Tools, mit denen Sie die in diesem Beitrag verwendeten Verbindungszeichenfolgen zusammenstellen können, stellen wir im Beitrag SQL Server-Tools (www.access-im-unternehmen.de/1061) in der nächsten Ausgabe vor.

Verbindungszeichenfolgen

Als Erstes benötigen Sie Zugriff auf die SQL Server-Datenbank. Voraussetzung dafür ist eine geeignete Verbindungszeichenfolge. Bei den Verbindungszeichenfolgen gibt es verschiedene Ansätze.

Sie sind relativ flexibel, wenn Sie die notwendigen Informationen in einer lokalen Tabelle im Access-Frontend speichern und von Access aus per VBA darauf zugreifen, um Verbindungszeichen­fol­gen daraus zu erstellen. Alternativ können Sie Verbindungszeichenfolgen in einer DSN-Datei oder als System-DSN in der Registry speichern – wir gehen an dieser Stelle jedoch auf die Variante der tabellenbasierten Verbindungszeichenfolge ein. Die notwendigen Daten speichern wir in den Beispieldatenbanken in einer Tabelle namens tblVerbindungszeichenfolgen (s. Bild 1). Diese Tabelle haben Sie bereits im Beitrag RDBMS-Tools: Verbindungen verwalten (www.access-im-unternehmen.de/976) kennengelernt.

Entwurf der Tabelle zum Speichern der Verbindungszeichenfolgen

Bild 1: Entwurf der Tabelle zum Speichern der Verbindungszeichenfolgen

Außerdem benötigen wir eine Tabelle namens tblTreiber, welche die Daten der gängigen Treiber enthält (s. Bild 2). Die Tabelle tblVerbindungszeichenfolgen ist über das Fremdschlüsselfeld TreiberID mit der Tabelle tblTreiber verknüpft.

Entwurf der Tabelle zum Speichern der Treiber

Bild 2: Entwurf der Tabelle zum Speichern der Treiber

In der Beispielanwendung verwenden wir die Prozedur aus Listing 1, um eine Verbindungszeichen­folge aus den Daten der Tabelle tblVerbindungszeichenfolgen zu ermitteln.

Public Function VerbindungszeichenfolgeNachID(lngVerbindungszeichenfolgeID As Long, _
         Optional bolZugangsdatenAusVariablen As Boolean) As String
     Dim db As DAO.Database
     Dim rst As DAO.Recordset
     Dim strTemp As String, strTreiber As String, strServer As String, strDatenbank As String
     Set db = CurrentDb
     Set rst = db.OpenRecordset("SELECT * FROM tblVerbindungszeichenfolgen WHERE VerbindungszeichenfolgeID = " _
         & lngVerbindungszeichenfolgeID)
     strTreiber = DLookup("Treiber", "tblTreiber", "TreiberID = " & rst!TreiberID)
     strServer = rst!Server
     strDatenbank = rst!Datenbank
     strTemp = "ODBC;DRIVER={" & strTreiber & "};" & "SERVER=" & strServer & ";" _
         & "DATABASE=" & strDatenbank & ";"
     If rst!TrustedConnection = True Then
         strTemp = strTemp & "Trusted_Connection=Yes"
     Else
         If Len(Nz(rst!Benutzername, "")) > 0 And bolZugangsdatenAusVariablen = False Then
             strBenutzername = rst!Benutzername
         End If
         If Len(Nz(rst!Kennwort, "")) > 0 And bolZugangsdatenAusVariablen = False Then
             strKennwort = rst!Kennwort
         End If
         strTemp = strTemp & "UID=" & strBenutzername & ";"
         strTemp = strTemp & "PWD=" & strKennwort
     End If
     VerbindungszeichenfolgeNachID = strTemp
End Function

Listing 1: Ermitteln einer Verbindungszeichenfolge aus der Tabelle tblVerbindungszeichenfolgen

Die Funktion arbeitet direkt mit der Tabelle tblVerbindungszeichenfolgen, in der die Verbindungsprarameter gespeichert sind. Dabei liest sie den Datensatz der Tabelle tblVerbindungszeichenfolgen ein, dessen Primär­schlüs­selwert dem mit dem Parameter lngVerbindungszeichenfolgeID übergebenen Wert entspricht. Der zweite Parameter der Funktion heißt bolZugangsdatenAusVariablen und legt fest, ob auf jeden Fall die Zugangsdaten aus den beiden Variablen strBenutzername und strKennwort verwendet werden sollen. Dies benötigen wir für einen Aufruf aus der später erläuterten Funktion VerbindungTesten, die gegebenenfalls die Zugangsdaten vorher per Dialog abfragt und diese aus Sicherheitsgründen nur in den beiden Variablen strBenutzername und strKennwort speichert, aber nicht in der Tabelle.

Es gibt zwei Variablen namens strBenutzername und strKennwort, die speziell für den Einsatz mit der SQL Server-Authentifizierung vorgesehen sind (oder auch für die Anmeldung an einem anderen SQL-Server-System wie MySQL mit der Anforderung von Benutzerdaten). In diesem Fall muss die Access-Anwendung die Benutzerdaten bereitstellen, um eine Verbindung herzustellen. Diese sollen aber nicht in der Datenbank gespeichert werden, da die Daten sonst für jedermann zugänglich wären. Die Variablen sollen zuvor per Formular vom Benutzer einmalig pro Sitzung abgefragt und in entsprechenden Variablen gespeichert werden, die wie folgt deklariert werden:

Public strBenutzername As String
Public strKennwort As String

Die Funktion VerbindungszeichenfolgeNachID prüft dann, ob die Tabelle eigene Werte für Benutzername und Kennwort enthält, und trägt diese gegebenenfalls in die Variablen strBenutzername und strKennwort ein. Danach setzt die Funktion die einzelnen Elemente dann zu einer Verbindungszeichen­folge zu­sammen. Abhängig davon, ob die Windows-Authentifizierung oder SQL Server-Authentifizie­rung gewählt wurde, erhält die Verbindungszeichenfolge das Name-Wert-Paar Trusted_Con­nec­tion=Yes, anderenfalls die Benutzerdaten in der Form UID=;PWD=. Woher die Werte der beiden Variablen strBenutzername beziehungsweise strKennwort kommen, haben wir ja weiter oben bereits erläutert.

Aus dem obersten Eintrag der Tabelle tblVerbindungszeichenfolgen aus Bild 3 würde die Funktion mit dem Wert 9 als Parameter etwa folgendes Ergebnis liefern:

Tabelle mit den Daten einer Verbindungszeichenfolge

Bild 3: Tabelle mit den Daten einer Verbindungszeichenfolge

  VerbindungszeichenfolgeNachID(9)
ODBC;DRIVER={ODBC Driver 11 for SQL Server};SERVER=(localdb)MSSQLLocalDB;DATABASE=Suedsturm;Trusted_Connection=Yes

Standardverbindungszeichenfolge

In der Tabelle tblVerbindungszeichenfolgen finden Sie auch ein Boolean-Feld namens Aktiv. Dieses legt fest, welche Verbindungszeichenfolge für die aktuelle Datenbank standardmäßig verwendet werden soll.

Der generelle Vorteil des Speicherns der Daten für die Verbindungszeichenfolge in einer Tabelle ist, dass Sie diese bei Bedarf einfach ändern können. Der zweite Vorteil ist: Sie können auch mehrere Verbindungszeichenfolgen angeben und zwischen diesen Zeichenfolgen wechseln. Genau dies ermöglicht das Feld Aktiv.

Während Sie nun mit der Funktion VerbindungszeichenfolgeNachID immer die ID der aktuell benötigten Verbindungszeichenfolge angeben müssen, ermöglicht die Funktion Standardverbindungszeichenfolge, direkt die als Aktiv markierte Verbindungszeichenfolge zu ermitteln (s. Listing 2).

Public Function Standardverbindungszeichenfolge() As String
     Dim lngAktivID As Long
     If Not lngAktivID = 0 Then
         Standardverbindungszeichenfolge = VerbindungszeichenfolgeNachID(lngAktivID)
     Else
         MsgBox "Achtung: Es ist keine Verbindungszeichenfolge als aktiv gekennzeichnet."
     End If
End Function

Listing 2: Ermitteln der Standardverbindungszeichenfolge aus der Tabelle tblVerbindungszeichenfolgen

Die Funktion ermittelt per DLookup-Funktion den ersten Eintrag der Tabelle tblVerbindungszei­chen­folgen, dessen Feld Aktiv den Wert True aufweist. Dieser wird dann der Funktion Ver­bin­dungs­zeichenfolgeNachID übergeben, um die entsprechende Verbindungszeichenfolge zu ermitteln. Sollte keine Verbindungszeichenfolge als aktiv markiert sein, erscheint eine entsprechende Mel­dung.

Dies war die Leseprobe dieses Artikels.
Melden Sie sich an, um auf den vollständigen Artikel zuzugreifen.

Bitte geben Sie die Zahlenfolge in das nachfolgende Textfeld ein

Die mit einem * markierten Felder sind Pflichtfelder.

Aktuell im Blog
Onlinebanking mit Access

Es ist geschafft: Endlich ist das Buch Onlinebanking mit Access fertiggeschrieben. Das war... [mehr]

Direktzugriff auf Tabellen und Felder

Die IntelliSense-Erweiterung für Tabellen und Felder hat mir soviel Spaß gemacht, dass ich gleich... [mehr]

IntelliSense für Tabellen und Felder

Wenn Sie mit dem VBA-Editor arbeiten und dort gelegentlich SQL-Anweisungen eingeben, müssen Sie... [mehr]

Download Access und SQL Server

Erfahren Sie, welche Schritte zum Download des aktuellen Stands des Buchs "Access und SQL Server"... [mehr]

Bilder in Access 2013

Wer die Bibliothek mdlOGL0710 von Sascha Trowitzsch oder ein ähnliches Modul aus meinen... [mehr]

Dynamische Ribbons

Immer wieder fragen Leser, wie man Ribbon-Elemente wie etwa Schaltflächen in Abhängigkeit... [mehr]

Die Blogmaschine

Einen kleinen Blog zusätzlich zum Shop zu betreiben ist eine tolle Sache. Hier lassen sich... [mehr]

Wegwerfadressen für die Newsletteranmeldung

Die Verwendung von Wegwerf-Adressen für die Nutzung aller möglichen Online-Dienste nimmt... [mehr]

Access und Facebook

Facebook und Access - das ist eine der wenigen Kombinationen, die ich noch nicht in die Mangel... [mehr]

Access und SQL Server - das Projekt

Mein neues Buch Access und SQL Server (gemeinsam mit Bernd Jungbluth) geht in die Endphase. Wer... [mehr]