RDBMS-Tools: Verbindungen verwalten

Wer einen SQL-Server (mit Bindestrich als Oberbegriff für Microsoft SQL Server, MySQL et cetera) betreibt, möchte oftmals von einer Access-Datenbank auf die enthaltenen Daten zugreifen. Dazu können Sie die eingebauten Werkzeuge benutzen oder aber selbst programmierte Tools nutzen. In dieser Beitragsreihe stellen wir die Tools vor, die sich in unserem Alltag als nützliche Helferlein erwiesen haben. In diesem Beitrag starten wir mit einem Tool zur Verwaltung von RDBMS-Verbindungen.

Das Ziel der Lösung, die wir in diesem Beitrag erarbeiten, ist eine Verwaltung der für eine Datenbank benötigten RDBMS-Verbindungen.

Für den Benutzer manifestiert sich die Lösung vorrangig in einem Formular, das alle Parameter für die Herstellung einer Verbindung zu einem RDBMS-System wie Microsoft SQL Server oder MySQL zur Auswahl beziehungsweise zur Eingabe bereitstellt.

Dazu gehören die folgenden Informationen:

  • Bezeichnung: Eindeutige Bezeichnung der Verbindung
  • Server: IP oder Name des Servers
  • Port: Port, über den die Datenbankverbindung hergestellt werden soll
  • Datenbank: Name der zu verwendenden Datenbank
  • Authentifizierungsmethode: Für SQL Server-Datenbanken, die neben der Authentifizierung per Benutzername und Kennwort auch die Windows-Authentifizierung anbieten, soll die Methode ausgewählt werden können.
  • Benutzername: Für die SQL Server-Authentifizierung von Microsoft SQL Server und für weitere Systeme benötigt.
  • Kennwort: Siehe Benutzername.
  • Treiber: Angabe einer Zeichenkette, die den ODBC-Treiber für das jeweilige RDBMS in der entsprechenden Version festlegt.
  • Verschlüsselt: Enthält die verschlüsselte Version von Benutzername und Kennwort, sofern diese über das Formular erstellt wird.

Daraus resultierend soll das Formular eine Verbindungszeichenfolge zusammenstellen und diese mit den übrigen Daten in einer Tabelle speichern. Um die Verbindungzeichenfolge zu nutzen, werden wir in einem weiteren Beitrag entsprechende Methoden vorstellen.

Speicherort für die Einstellungen

Die Einstellungen sollen in zwei Tabellen gespeichert werden. Die erste heißt tblVerbindungszeichenfolgen, die zweite tblTreiber.

Für die zweite Tabelle soll keine eigene Benutzeroberfläche in Form eines Formulars erstellt werden – die notwenigen Einträge können im Laufe der Zeit manuell hinzugefügt werden.

Die Tabelle enthält die in Bild 1 dargestellten Felder.

Entwurf der Tabelle tblTreiber

Bild 1: Entwurf der Tabelle tblTreiber

Wichtig ist hier vor allem das Feld Treiber, das die Zeichenfolge enthält, die für die Eigenschaft Driver in die Verbindungszeichenfolge eingefügt wird – also beispielsweise MySQL ODBC 5.2 ANSI Driver oder ODBC Driver 11 for SQL Server. Außerdem ist für manche Funktionen wichtig, um welchen SQL Server-Typ es sich handelt – dazu nimmt das Feld Typ Werte wie zum Beispiel MySQL oder MSSQL auf (s. Bild 2).

Inhalt der Tabelle tblTreiber

Bild 2: Inhalt der Tabelle tblTreiber

Bild 3 zeigt einige Beispieldatensätze für verschiedene Microsoft SQL Server- und MySQL-Treiber.

Entwurf der Tabelle tblVerbindungszeichenfolgen

Bild 3: Entwurf der Tabelle tblVerbindungszeichenfolgen

Diese Treibertabelle referenziert die Tabelle tblVerbindungszeichenfolgen über das Feld TreiberID.

Neben diesem Feld enthält es im Wesentlichen die weiter oben bereits angesprochenen Informationen wie Bezeichnung, Server, Datenbank et cetera. Wichtig ist, dass Sie für das Feld Bezeichnung einen eindeutigen Index definieren, da dieses zur Auswahl des jeweiligen Treibers dient und Einträge mit gleicher Bezeichnung daher nicht hilfreich sind.

Neben den genannten Feldern enthält die Tabelle noch ein Feld namens Aktiv. Dieses legt erstens die Verbindungszeichenfolge fest, die beim öffnen des Formulars zum Bearbeiten der Zeichenfolgen angezeigt werden soll.

Zweitens werden wir diese Eigenschaft in den Prozeduren nutzen, welche die Verbindungsdaten verwenden.

Ein weiteres Feld heißt Verschluesselt. Sie können später im Formular die Eingabe für Benutzername und Kennwort in eine verschlüsselte Version umwandeln, die dann im Feld Verschluesselt landet. Hier nutzen wir dann die Features, die im Beitrag Sicherer SQL Server-Zugriff (www.access-im-unternehmen.de/975) vorgestellt werden.

Das Formular zum Verwalten der Verbindungen

Das Formular frmVerbindungszeichenfolgen verwendet die Tabelle tblVerbindungszeichenfolgen als Datenherkunft

Die meisten der Felder dieser Tabelle finden sich im Entwurf des Formulars wieder (s. Bild 4).

Das Formular frmVerbindungszeichenfolgen in der Entwurfsansicht

Bild 4: Das Formular frmVerbindungszeichenfolgen in der Entwurfsansicht

Das Formular soll nur jeweils einen Datensatz anzeigen, daher blenden wir die Elemente, die sonst etwa zum Blättern durch die Datensätze dienen, aus.

Dazu stellen Sie die Eigenschaften Datensatzmarkierer, Navigationsschaltflächen, Trennlinien und auch Bildlaufleisten auf den Wert Nein ein.

Außerdem soll Automatisch zentrieren den Wert Ja erhalten.

Schnellauswahl einer Verbindungszeichenfolge

Damit Sie schnell alle vorhandenen Einträge auswählen können, finden Sie im Kopf des Formulars ein Kombinationsfeld namens cboSchnellauswahl (s. Bild 5).

Auswahl der verfügbaren Verbindungszeichenfolgen

Bild 5: Auswahl der verfügbaren Verbindungszeichenfolgen

Dieses Kombinationsfeld verwendet die folgende Abfrage als Datensatzherkunft:

SELECT VerbindungszeichenfolgeID, Bezeichnung FROM tblVerbindungszeichenfolgen;

Damit es nur das zweite Feld anzeigt, das erste jedoch als gebundene Spalte verwendet, stellen Sie die Eigenschaften Spaltenanzahl auf 2 und Spaltenbreiten auf 0cm ein.

Damit das Formular nach der Auswahl eines Eintrags des Kombinationsfeldes den entsprechenden Datensatz anzeigt, fügen Sie für das Ereignis Nach Aktualisierung die folgende Prozedur zum Klassenmodul des Formulars hinzu:

Private Sub cboSchnellauswahl_AfterUpdate()
     Me.Recordset.FindFirst "VerbindungszeichenfolgeID = " _
         & Me!cboSchnellauswahl
End Sub

Die Prozedur stellt den Datensatzzeiger mit der FindFirst-Methode auf den Datensatz ein, dessen Feld VerbindungszeichenfolgeID den im Kombinationsfeld cboSchnellauswahl angegebenen Wert enthält.

Verbindungszeichenfolge beim Laden einstellen

Wenn der Benutzer das Formular öffnet, soll es gleich eine bestimmte Verbindungszeichenfolge anzeigen. Welche dies ist, hängt davon ab, ob der Benutzer beim öffnen des Formulars etwa mit DoCmd.OpenForm die ID einer Verbindungszeichenfolge als öffnungsargument übergibt.

Falls ja, soll die folgende Prozedur die entsprechende Vebindungszeichenfolge anzeigen. Anderenfalls soll die als aktiv gekennzeichnete Verbindungszeichenfolge als Erstes erscheinen. Dazu springt die Prozedur mit der FindFirst-Methode auf den Datensatz, dessen Feld Aktiv den Wert True aufweist:

Private Sub Form_Load()
     If Not IsNull(Me.OpenArgs) Then
         Me.Recordset.FindFirst _
             "VerbindungszeichenfolgeID = " & Me.OpenArgs
     Else
         Me.Recordset.FindFirst "Aktiv=True"
     End If
End Sub

Schritte bei Anzeigen einer Verbindungszeichenfolge

Sowohl beim öffnen des Formulars also auch beim Wechseln des Datensatzes über das Kombinationsfeld cboSchnellauswahl muss das Formular ein paar Schritte ausführen. Dies erledigen wir über die Prozedur, die durch das Ereignis Beim Anzeigen ausgelöst wird. Die Prozedur sieht wie folgt aus:

Private Sub Form_Current()
     ogrTrustedConnection_AfterUpdate
     strServer = Nz(Me!txtServer)
     strBenutzername = Nz(Me!txtBenutzername)
     strKennwort = Nz(Me!txtKennwort)
     strPort = Nz(Me!txtPort)
     strDatenbank = Nz(Me!cboDatenbank)
     Me!cmdAlsStandard.Enabled = Nz(Me!Aktiv, 0) = 0
     Me!cboSchnellauswahl = Me!VerbindungszeichenfolgeID
End Sub

Die erste Anweisung ruft eine weitere Ereignisprozedur auf, die sonst durch das Aktualisieren der Optionsgruppe zum Auswählen der Authentifizierungsmethode ausgelöst wird – nämlich ogrTrustedConnection_AfterUpdate.

Diese schauen wir uns weiter unten an. Zunächst liest die Prozedur die Werte einiger Textfelder in String-Variablen ein. Diese werden im Kopf des Klassenmoduls durch die folgenden Anweisungen modulweit deklariert:

Dim strServer As String
Dim strPort As String
Dim strDatenbank As String
Dim strBenutzername As String
Dim strKennwort As String

Außerdem aktiviert beziehungsweise deaktiviert die Prozedur noch die Schaltfläche cmdAlsStandard, die dazu dient, die aktuelle Verbindungszeichenfolge als Standard einzustellen.

Wenn der aktuelle Datensatzbereits die Standardverbindungszeichenfolge enthält, was durch den Wert True im Feld Aktiv angegeben wird, deaktiviert die Anweisung die Schaltfläche. Anderenfalls aktiviert sie diese, damit der Benutzer die aktuelle Verbindungszeichenfolge als Standard festlegen kann.

Schließlich stellt die Prozedur das Kombinationsfeld zur Auswahl der Verbindungszeichenfolge auf die aktuell angezeigte Verbindungszeichenfolge ein. Wenn der Benutzer diese soeben mit eben diesem Kombinationsfeld ausgewählt hat, ist dies eigentlich nicht notwendig – es schadet aber auch nicht.

Erforderlich ist es aber auf jeden Fall beim öffnen des Formulars und wenn das Formular einen neuen Datensatz anzeigt oder zu einem anderen Datensatz wechselt, weil der vorherige gelöscht wurde.

Eingabe des Servers

Die Eingabe einer Zeichenkette in das Feld txtServer soll ebenfalls eine Ereignisprozedur auslösen, und zwar nach jedem eingegebenen Zeichen. Dies erledigen wir mit dem Ereignis Bei änderung des Steuerelements.

Die folgende Prozedur schreibt zunächst den aktuellen Inhalt des Textfeldes aus der Text-Eigenschaft in die Variable strServer. Dann ruft sie die Funktion VerbindungszeichenfolgeErmitteln auf, welche die aus den aktuellen Daten ermittelte Verbindungszeichenfolge in das Textfeld txtVerbindungszeichenfolge schreiben soll:

Private Sub txtServer_Change()
     strServer = Me!txtServer.Text
     Me!txtVerbindungszeichenfolge = _
         VerbindungszeichenfolgeErmitteln
End Sub

Vorbehaltlich des Inhalts der Funktion VerbindungszeichenfolgeErmitteln, die wir uns weiter unten ansehen, erfahren Sie bereits in Bild 6, dass der Servername gleich in ein entsprechendes Element der Verbindungszeichenfolge umgesetzt wird.

Die eingegebenen Daten erscheinen direkt in der Vorschau der Verbindungszeichenfolge.

Bild 6: Die eingegebenen Daten erscheinen direkt in der Vorschau der Verbindungszeichenfolge.

Eingabe des Ports

Beim zu verwendenden Port sieht es ähnlich aus. Das Textfeld txtPort löst die folgende Ereignisprozedur aus, die den Port über die Funktion VerbindungszeichenfolgeErmitteln in das Textfeld txtVerbindungszeichenfolge schreibt:

Private Sub txtPort_Change()
     strPort = Me!txtPort.Text
     Me!txtVerbindungszeichenfolge = _
         VerbindungszeichenfolgeErmitteln
End Sub

Auswahl des Treibers

Darunter befindet sich bereits das Kombinationsfeld zur Auswahl des Treibers. Die Auswahl eines der Einträge löst die Prozedur cboTreiberID_AfterUpdate aus Listing 1 aus.

Private Sub cboTreiberID_AfterUpdate()
     Dim strTyp As String
     strTyp = DLookup("Typ", "tblTreiber", "TreiberID = " & Me!cboTreiberID)
     Select Case strTyp
         Case "MSSQL"
             Me!ogrTrustedConnection.Enabled = True
         Case Else
             Me!ogrTrustedConnection.Enabled = False
             Me!ogrTrustedConnection = 0
             ogrTrustedConnection_AfterUpdate
     End Select
     Me!txtVerbindungszeichenfolge = _
         VerbindungszeichenfolgeErmitteln(Nz(Me!cboDatenbank))
End Sub

Listing 1: Einstellen des Treibers

Die Prozedur liest zunächst den Wert des Feldes Typ für den ausgewählten Eintrag aus der Tabelle tblTreiber aus und speichert diesen in der Variablen strTyp. Abhängig vom Wert führt die Prozedur dann einen der Zweige der folgenden Select Case-Bedingung aus.

Der erste Zweig behandelt den Fall MSSQL. Nur der Microsoft SQL Server unterstützt die Windows-Authentifizierung, daher soll nur in diesem Fall eine Auswahl der Authentifizierungsmethode mit der Optionsgruppe ogrTrustedConnection möglich sein.

Diese stellt aktiviert die Prozedur dann durch Einstellen der Eigenschaft Enabled auf den Wert True. Für die übrigen Servertypen (aktuell also nur My-SQL – aber vielleicht fügen Sie ja selbst weitere Einträge zur Tabelle tblTreiber und auch zu dieser Select Case-Bedingung hinzu) soll die Optionsgruppe ogrTrustedConnection deaktiviert und auf den Wert 0 (für SQL Server-Authentifizierung) eingestellt werden. In diesem Fall soll wiederum das Ereignis ogrTrustedConnection_AfterUpdate ausgelöst werden – siehe gleich im Anschluss.

Schließlich schreibt die letzte Anweisung wieder die aktuelle Version der Verbindungszeichenfolge in das Textfeld txtVerbindungszeichenfolge.

Nach der Auswahl landet der entsprechende Ausdruck in folgender Form in der Verbindungszeichenfolge:

DRIVER={ODBC Driver 11 for SQL Server};

Authentifizierungsart

Damit kommen wir endlich zur Optionsgruppe ogrTrustedConnection. Diese bietet zwei Optionen an:

  • -1: Windows-Authentifizierung
  • 0: SQL Server-Authentifizierung

Wie bereits weiter oben beschrieben, ist die Option -1 nur verfügbar, wenn Sie einen Treiber des Typs MSSQL wählen. Die übrigen RDBMS bieten keine Authentifizierung auf Basis des Windows-Benutzerkontos an.

Je nach dem Wert, den Sie für die Optionsgruppe auswählen, können Sie noch den Benutzernamen und das Kennwort für den Zugriff auf das RDBMS-System angeben. Bei der Windows-Authentifizierung ist dies nicht nötig, daher werden die beiden Textfelder txtBenutzername und txtKennwort in diesem Fall deaktiviert. Gleiches gilt für das Textfeld txtVerschluesselung und für die Schaltfläche cmdVerschluesseln. Schließlich soll auch nach der Auswahl eines Wertes der Optionsgruppe die Verbindungszeichenfolge aktualisiert werden (s. Listing 2).

Private Sub ogrTrustedConnection_AfterUpdate()
     Me!txtBenutzername.Enabled = Not Me!ogrTrustedConnection
     Me!txtKennwort.Enabled = Not Me!ogrTrustedConnection
     Me!txtVerschluesselt.Enabled = Not Me!ogrTrustedConnection
     Me!cmdVerschluesseln.Enabled = Not Me!ogrTrustedConnection
     If Me.Dirty Then
         Me!txtVerbindungszeichenfolge = _
             VerbindungszeichenfolgeErmitteln(Nz(Me!cboDatenbank))
     End If
End Sub

Listing 2: Aktivieren und Deaktivieren von Steuerelementen

Benutzername und Kennwort eingeben

Anschließend folgen die beiden Textfelder zum Eingeben von Benutzername und Kennwort. Jede änderung des Benutzernamens führt zum Aufruf der Ereignisprozedur txtBenutzername_Change. Diese speichert den aktuellen Inhalt des Feldes txtBenutzername in der Variablen strBenutzername und aktualisiert anschließend die Verbindungszeichenfolge.

Außerdem leert die Prozedur das Feld txtVerschluesselt, das die verschlüsselte Version von Benutzername und Kennwort speichert:

Private Sub txtBenutzername_Change()
     strBenutzername = _
         Me!txtBenutzername.Text
     Me!txtVerbindungszeichenfolge = _
         VerbindungszeichenfolgeErmitteln
     Me!txtVerschluesselt = ""
End Sub

Das ändern des Kennworts löst eine Prozedur aus, die prinzipiell genauso funktioniert wie die beim ändern des Benutzernamens:

Private Sub txtKennwort_Change()
     strKennwort = Me!txtKennwort.Text
     Me!txtVerbindungszeichenfolge = _
         VerbindungszeichenfolgeErmitteln
     Me!txtVerschluesselt = ""
End Sub

Kennwort verschlüsseln

Möglicherweise möchten Sie, wie im Beitrag Sicherer RDBMS-Zugriff (www.access-im-unternehmen.de/975) beschrieben, die Benutzerdaten in verschlüsselter Form in der Datenbank speichern und diese in eine .mde– oder .accde-Datenbank umwandeln, um ohne Eingabe der Benutzerdaten auf die Tabellen der RDBMS-Datenbank zugreifen zu können.

In diesem Fall müssen Sie Schaltfläche cmdVerschluesseln betätigen, was die Ereignisprozedur aus Listing 3 auslöst. Diese Prozedur prüft zunächst, ob strBenutzername oder strKennwort ein Pipe-Zeichen (|) enthalten, und gibt gegebenenfalls den Hinweis aus, dass dies nicht zulässig ist.

Private Sub cmdVerschluesseln_Click()
     Dim strVerschluesselt As String
     If InStr(1, strBenutzername & strKennwort, "|") = 0 Then
         strVerschluesselt = DecryptString(strBenutzername & "|" _
             & strKennwort, "aiu2015")
         Me!txtVerschluesselt = strVerschluesselt
         Me!txtKennwort = ""
         Me!txtBenutzername = ""
         strBenutzername = ""
         strKennwort = ""
     Else
         MsgBox "Benutzername und Kennwort dürfen nicht das Zeichen ''|''  enthalten."
     End If
End Sub

Listing 3: Verschlüsseln von Benutzername und Kennwort

Dieses soll nämlich Benutzername und Kennwort voneinander trennen, wenn diese durch die Funktion DecryptString mit dem angegebenen Schlüssel (hier aiu2015) verschlüsselt werden.

Der verschlüsselte Ausdruck landet dann im Textfeld txtVerschluesselt, die beiden Textfelder txtBenutzername und txtKennwort werden geleert (s. Bild 7).

Vorschau der verschlüsselten Daten

Bild 7: Vorschau der verschlüsselten Daten

Datenbank auswählen

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

Schreibe einen Kommentar