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 Zeichenfolge in das nachfolgende Textfeld ein

Die mit einem * markierten Felder sind Pflichtfelder.

Neues aus unseren Magazinen
Listenfeld: Reihenfolge mehrerer Einträge...

Wir haben bereits in mehreren Beiträgen beschrieben, wie Sie die individuelle Reihenfolge von Elementen einer Tabelle über den Inhalt eines Feldes etwa namens »ReihenfolgeID« einstellen können –... [mehr]

Diagramme mit gefilterten Daten

In Ausgabe 2/2019 haben wir in zwei Artikeln die modernen Diagramme von Access vorgestellt. Im vorliegenen Beitrag zeigen wir Ihnen, wie Sie diese abhängig von den in einem Formular angezeigten... [mehr]

Benutzerverwaltung mit verschlüsselten...

Wenn Sie in einer Access-Anwendung Benutzer verwalten wollen, die sich per Benutzername und Kennwort an die Anwendung anmelden, sollten Sie sehr sensibel mit den in der Anwendung gespeicherten... [mehr]

HTML-Tabellen mit fester Kopfzeile

In den vorherigen Ausgaben von Access im Unternehmen und in der aktuellen Ausgabe arbeiten wir in einigen Beiträgen mit dem Webbrowser-Steuerelement und stellen Daten, die wir mit den Bordmitteln... [mehr]

Flexible HTML-Tabellen mit fester Kopfzeile

Im Beitrag »HTML-Tabellen mit fester Kopfzeile« haben wir gezeigt, wie Sie Daten aus einer bestimmten Abfrage in einem Webbrowser-Steuerelement so anzeigen, dass die Spaltenköpfe oben fixiert... [mehr]

Berechtigungen per HTML verwalten

Im Beitrag »Benutzerverwaltung mit verschlüsselten Kennwörtern« stellen wir eine Lösung vor, in der wir die Berechtigungen von Benutzergruppen an Datenbankobjekten definieren. Dort benötigen wir... [mehr]

Benutzer und Berechtigungen ermitteln

In den Beiträgen »Benutzerverwaltung mit verschlüsselten Kennwörtern« und »Berechtigungen per HTML verwalten« haben wir die Voraussetzungen für eine Benutzerverwaltung geschaffen. Im vorliegenden... [mehr]

Zugriffsrechte mit Datenmakros

Es gibt verschiedene Möglichkeiten, auf Basis des aktuell angemeldeten Benutzers sicherzustellen, dass dieser nur die für ihn vorgesehenen Aktionen mit Daten durchführen darf – beispielsweise durch... [mehr]

Kennwörter generieren

Für den einen oder anderen Zweck möchten Sie vielleicht Kennwörter generieren oder in einer Benutzeroberfläche die Möglichkeit zum Generieren von Kennwörtern anbieten. Wenn Sie etwa Benutzer zu... [mehr]

Neuer Datensatz von Frontend zu Backend

Für manche Themen gibt es keine kurze, prägnante Überschrift. In diesem Fall wollen wir zeigen, wie Sie einen neuen Datensatz anlegen, der in einer temporären Tabelle im Frontend gespeichert wird,... [mehr]