{"id":55000976,"date":"2015-04-01T00:00:00","date_gmt":"2020-05-22T21:07:38","guid":{"rendered":"http:\/\/access-im-unternehmen.aix-dev.de\/aiu\/?p=976"},"modified":"-0001-11-30T00:00:00","modified_gmt":"-0001-11-30T00:00:00","slug":"RDBMSTools_Verbindungen_verwalten","status":"publish","type":"post","link":"https:\/\/access-im-unternehmen.de\/RDBMSTools_Verbindungen_verwalten\/","title":{"rendered":"RDBMS-Tools: Verbindungen verwalten"},"content":{"rendered":"<p><img loading=\"lazy\" decoding=\"async\" src=\"http:\/\/vg07.met.vgwort.de\/na\/8347083b6ad14a11a8b59ecae3c0f924\" width=\"1\" height=\"1\" alt=\"\"><\/p>\n<p><b>Wer einen SQL-Server (mit Bindestrich als Oberbegriff f&uuml;r Microsoft SQL Server, MySQL et cetera) betreibt, m&ouml;chte oftmals von einer Access-Datenbank auf die enthaltenen Daten zugreifen. Dazu k&ouml;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&uuml;tzliche Helferlein erwiesen haben. In diesem Beitrag starten wir mit einem Tool zur Verwaltung von RDBMS-Verbindungen.<\/b><\/p>\n<p>Das Ziel der L&ouml;sung, die wir in diesem Beitrag erarbeiten, ist eine Verwaltung der f&uuml;r eine Datenbank ben&ouml;tigten RDBMS-Verbindungen.<\/p>\n<p>F&uuml;r den Benutzer manifestiert sich die L&ouml;sung vorrangig in einem Formular, das alle Parameter f&uuml;r die Herstellung einer Verbindung zu einem RDBMS-System wie Microsoft SQL Server oder MySQL zur Auswahl beziehungsweise zur Eingabe bereitstellt.<\/p>\n<p>Dazu geh&ouml;ren die folgenden Informationen:<\/p>\n<ul>\n<li><b>Bezeichnung<\/b>: Eindeutige Bezeichnung der Verbindung<\/li>\n<li><b>Server<\/b>: IP oder Name des Servers<\/li>\n<li><b>Port<\/b>: Port, &uuml;ber den die Datenbankverbindung hergestellt werden soll<\/li>\n<li><b>Datenbank<\/b>: Name der zu verwendenden Datenbank<\/li>\n<li><b>Authentifizierungsmethode<\/b>: F&uuml;r SQL Server-Datenbanken, die neben der Authentifizierung per Benutzername und Kennwort auch die Windows-Authentifizierung anbieten, soll die Methode ausgew&auml;hlt werden k&ouml;nnen.<\/li>\n<li><b>Benutzername<\/b>: F&uuml;r die SQL Server-Authentifizierung von Microsoft SQL Server und f&uuml;r weitere Systeme ben&ouml;tigt.<\/li>\n<li><b>Kennwort<\/b>: Siehe Benutzername.<\/li>\n<li><b>Treiber<\/b>: Angabe einer Zeichenkette, die den ODBC-Treiber f&uuml;r das jeweilige RDBMS in der entsprechenden Version festlegt.<\/li>\n<li><b>Verschl&uuml;sselt<\/b>: Enth&auml;lt die verschl&uuml;sselte Version von Benutzername und Kennwort, sofern diese &uuml;ber das Formular erstellt wird.<\/li>\n<\/ul>\n<p>Daraus resultierend soll das Formular eine Verbindungszeichenfolge zusammenstellen und diese mit den &uuml;brigen Daten in einer Tabelle speichern. Um die Verbindungzeichenfolge zu nutzen, werden wir in einem weiteren Beitrag entsprechende Methoden vorstellen.<\/p>\n<p><b>Speicherort f&uuml;r die Einstellungen<\/b><\/p>\n<p>Die Einstellungen sollen in zwei Tabellen gespeichert werden. Die erste hei&szlig;t <b>tblVerbindungszeichenfolgen<\/b>, die zweite <b>tblTreiber<\/b>.<\/p>\n<p>F&uuml;r die zweite Tabelle soll keine eigene Benutzeroberfl&auml;che in Form eines Formulars erstellt werden &#8211; die notwenigen Eintr&auml;ge k&ouml;nnen im Laufe der Zeit manuell hinzugef&uuml;gt werden.<\/p>\n<p>Die Tabelle enth&auml;lt die in Bild 1 dargestellten Felder.<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2015_02\/pic_976_001.png\" alt=\"Entwurf der Tabelle tblTreiber\" width=\"500\" height=\"163,6513\" \/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 1: Entwurf der Tabelle tblTreiber<\/span><\/b><\/p>\n<p>Wichtig ist hier vor allem das Feld <b>Treiber<\/b>, das die Zeichenfolge enth&auml;lt, die f&uuml;r die Eigenschaft <b>Driver <\/b>in die Verbindungszeichenfolge eingef&uuml;gt wird &#8211; also beispielsweise <b>MySQL ODBC 5.2 ANSI Driver <\/b>oder <b>ODBC Driver 11 for SQL Server<\/b>. Au&szlig;erdem ist f&uuml;r manche Funktionen wichtig, um welchen SQL Server-Typ es sich handelt &#8211; dazu nimmt das Feld <b>Typ <\/b>Werte wie zum Beispiel <b>MySQL <\/b>oder <b>MSSQL <\/b>auf (s. Bild 2).<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2015_02\/pic_976_003.png\" alt=\"Inhalt der Tabelle tblTreiber\" width=\"700\" height=\"209,828\" \/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 2: Inhalt der Tabelle tblTreiber<\/span><\/b><\/p>\n<p>Bild 3 zeigt einige Beispieldatens&auml;tze f&uuml;r verschiedene Microsoft SQL Server- und MySQL-Treiber.<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2015_02\/pic_976_002.png\" alt=\"Entwurf der Tabelle tblVerbindungszeichenfolgen\" width=\"600\" height=\"475,6685\" \/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 3: Entwurf der Tabelle tblVerbindungszeichenfolgen<\/span><\/b><\/p>\n<p>Diese Treibertabelle referenziert die Tabelle <b>tblVerbindungszeichenfolgen <\/b>&uuml;ber das Feld <b>TreiberID<\/b>.<\/p>\n<p>Neben diesem Feld enth&auml;lt es im Wesentlichen die weiter oben bereits angesprochenen Informationen wie Bezeichnung, Server, Datenbank et cetera. Wichtig ist, dass Sie f&uuml;r das Feld <b>Bezeichnung <\/b>einen eindeutigen Index definieren, da dieses zur Auswahl des jeweiligen Treibers dient und Eintr&auml;ge mit gleicher Bezeichnung daher nicht hilfreich sind.<\/p>\n<p>Neben den genannten Feldern enth&auml;lt die Tabelle noch ein Feld namens <b>Aktiv<\/b>. Dieses legt erstens die Verbindungszeichenfolge fest, die beim &ouml;ffnen des Formulars zum Bearbeiten der Zeichenfolgen angezeigt werden soll.<\/p>\n<p>Zweitens werden wir diese Eigenschaft in den Prozeduren nutzen, welche die Verbindungsdaten verwenden.<\/p>\n<p>Ein weiteres Feld hei&szlig;t <b>Verschluesselt<\/b>. Sie k&ouml;nnen sp&auml;ter im Formular die Eingabe f&uuml;r Benutzername und Kennwort in eine verschl&uuml;sselte Version umwandeln, die dann im Feld <b>Verschluesselt <\/b>landet. Hier nutzen wir dann die Features, die im Beitrag <b>Sicherer SQL Server-Zugriff <\/b>(<b>www.access-im-unternehmen.de\/975<\/b>) vorgestellt werden.<\/p>\n<p><b>Das Formular zum Verwalten der Verbindungen<\/b><\/p>\n<p>Das Formular <b>frmVerbindungszeichenfolgen <\/b>verwendet die Tabelle <b>tblVerbindungszeichenfolgen <\/b>als Datenherkunft<\/p>\n<p>Die meisten der Felder dieser Tabelle finden sich im Entwurf des Formulars wieder (s. Bild 4).<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2015_02\/pic_976_004.png\" alt=\"Das Formular frmVerbindungszeichenfolgen in der Entwurfsansicht\" width=\"600\" height=\"497,6077\" \/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 4: Das Formular frmVerbindungszeichenfolgen in der Entwurfsansicht<\/span><\/b><\/p>\n<p>Das Formular soll nur jeweils einen Datensatz anzeigen, daher blenden wir die Elemente, die sonst etwa zum Bl&auml;ttern durch die Datens&auml;tze dienen, aus.<\/p>\n<p>Dazu stellen Sie die Eigenschaften <b>Datensatzmarkierer<\/b>, <b>Navigationsschaltfl&auml;chen<\/b>, <b>Trennlinien <\/b>und auch <b>Bildlaufleisten <\/b>auf den Wert <b>Nein <\/b>ein.<\/p>\n<p>Au&szlig;erdem soll <b>Automatisch zentrieren <\/b>den Wert <b>Ja <\/b>erhalten.<\/p>\n<p><b>Schnellauswahl einer Verbindungszeichenfolge<\/b><\/p>\n<p>Damit Sie schnell alle vorhandenen Eintr&auml;ge ausw&auml;hlen k&ouml;nnen, finden Sie im Kopf des Formulars ein Kombinationsfeld namens <b>cboSchnellauswahl<\/b> (s. Bild 5).<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2015_02\/pic_976_005.png\" alt=\"Auswahl der verf&uuml;gbaren Verbindungszeichenfolgen\" width=\"600\" height=\"204,6729\" \/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 5: Auswahl der verf&uuml;gbaren Verbindungszeichenfolgen<\/span><\/b><\/p>\n<p>Dieses Kombinationsfeld verwendet die folgende Abfrage als Datensatzherkunft:<\/p>\n<pre>SELECT VerbindungszeichenfolgeID, Bezeichnung FROM tblVerbindungszeichenfolgen;<\/pre>\n<p>Damit es nur das zweite Feld anzeigt, das erste jedoch als gebundene Spalte verwendet, stellen Sie die Eigenschaften <b>Spaltenanzahl <\/b>auf <b>2 <\/b>und <b>Spaltenbreiten <\/b>auf <b>0cm <\/b>ein.<\/p>\n<p>Damit das Formular nach der Auswahl eines Eintrags des Kombinationsfeldes den entsprechenden Datensatz anzeigt, f&uuml;gen Sie f&uuml;r das Ereignis <b>Nach Aktualisierung <\/b>die folgende Prozedur zum Klassenmodul des Formulars hinzu:<\/p>\n<pre><span style=\"color:blue;\">Private Sub <\/span>cboSchnellauswahl_AfterUpdate()\r\n     Me.Recordset.FindFirst \"VerbindungszeichenfolgeID = \" _\r\n         & Me!cboSchnellauswahl\r\n<span style=\"color:blue;\">End Sub<\/span><\/pre>\n<p>Die Prozedur stellt den Datensatzzeiger mit der <b>FindFirst<\/b>-Methode auf den Datensatz ein, dessen Feld <b>VerbindungszeichenfolgeID <\/b>den im Kombinationsfeld <b>cboSchnellauswahl <\/b>angegebenen Wert enth&auml;lt.<\/p>\n<p><b>Verbindungszeichenfolge beim Laden einstellen<\/b><\/p>\n<p>Wenn der Benutzer das Formular &ouml;ffnet, soll es gleich eine bestimmte Verbindungszeichenfolge anzeigen. Welche dies ist, h&auml;ngt davon ab, ob der Benutzer beim &ouml;ffnen des Formulars etwa mit <b>DoCmd.OpenForm <\/b>die ID einer Verbindungszeichenfolge als &ouml;ffnungsargument &uuml;bergibt.<\/p>\n<p>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 <b>FindFirst<\/b>-Methode auf den Datensatz, dessen Feld <b>Aktiv <\/b>den Wert <b>True <\/b>aufweist:<\/p>\n<pre><span style=\"color:blue;\">Private Sub <\/span>Form_Load()\r\n     <span style=\"color:blue;\">If <\/span><span style=\"color:blue;\">Not<\/span> IsNull(Me.OpenArgs)<span style=\"color:blue;\"> Then<\/span>\r\n         Me.Recordset.FindFirst _\r\n             \"VerbindungszeichenfolgeID = \" & Me.OpenArgs\r\n     <span style=\"color:blue;\">Else<\/span>\r\n         Me.Recordset.FindFirst \"Aktiv=True\"\r\n     <span style=\"color:blue;\">End If<\/span>\r\n<span style=\"color:blue;\">End Sub<\/span><\/pre>\n<p><b>Schritte bei Anzeigen einer Verbindungszeichenfolge<\/b><\/p>\n<p>Sowohl beim &ouml;ffnen des Formulars also auch beim Wechseln des Datensatzes &uuml;ber das Kombinationsfeld <b>cboSchnellauswahl <\/b>muss das Formular ein paar Schritte ausf&uuml;hren. Dies erledigen wir &uuml;ber die Prozedur, die durch das Ereignis <b>Beim Anzeigen <\/b>ausgel&ouml;st wird. Die Prozedur sieht wie folgt aus:<\/p>\n<pre><span style=\"color:blue;\">Private Sub <\/span>Form_Current()\r\n     ogrTrustedConnection_AfterUpdate\r\n     strServer = Nz(Me!txtServer)\r\n     strBenutzername = Nz(Me!txtBenutzername)\r\n     strKennwort = Nz(Me!txtKennwort)\r\n     strPort = Nz(Me!txtPort)\r\n     strDatenbank = Nz(Me!cboDatenbank)\r\n     Me!cmdAlsStandard.Enabled = Nz(Me!Aktiv, 0) = 0\r\n     Me!cboSchnellauswahl = Me!VerbindungszeichenfolgeID\r\n<span style=\"color:blue;\">End Sub<\/span><\/pre>\n<p>Die erste Anweisung ruft eine weitere Ereignisprozedur auf, die sonst durch das Aktualisieren der Optionsgruppe zum Ausw&auml;hlen der Authentifizierungsmethode ausgel&ouml;st wird &#8211; n&auml;mlich <b>ogrTrustedConnection_AfterUpdate<\/b>.<\/p>\n<p>Diese schauen wir uns weiter unten an. Zun&auml;chst liest die Prozedur die Werte einiger Textfelder in <b>String<\/b>-Variablen ein. Diese werden im Kopf des Klassenmoduls durch die folgenden Anweisungen modulweit deklariert:<\/p>\n<pre><span style=\"color:blue;\">Dim <\/span>strServer<span style=\"color:blue;\"> As String<\/span>\r\n<span style=\"color:blue;\">Dim <\/span>strPort<span style=\"color:blue;\"> As String<\/span>\r\n<span style=\"color:blue;\">Dim <\/span>strDatenbank<span style=\"color:blue;\"> As String<\/span>\r\n<span style=\"color:blue;\">Dim <\/span>strBenutzername<span style=\"color:blue;\"> As String<\/span>\r\n<span style=\"color:blue;\">Dim <\/span>strKennwort<span style=\"color:blue;\"> As String<\/span><\/pre>\n<p>Au&szlig;erdem aktiviert beziehungsweise deaktiviert die Prozedur noch die Schaltfl&auml;che <b>cmdAlsStandard<\/b>, die dazu dient, die aktuelle Verbindungszeichenfolge als Standard einzustellen.<\/p>\n<p>Wenn der aktuelle Datensatzbereits die Standardverbindungszeichenfolge enth&auml;lt, was durch den Wert <b>True <\/b>im Feld <b>Aktiv <\/b>angegeben wird, deaktiviert die Anweisung die Schaltfl&auml;che. Anderenfalls aktiviert sie diese, damit der Benutzer die aktuelle Verbindungszeichenfolge als Standard festlegen kann.<\/p>\n<p>Schlie&szlig;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&auml;hlt hat, ist dies eigentlich nicht notwendig &#8211; es schadet aber auch nicht.<\/p>\n<p>Erforderlich ist es aber auf jeden Fall beim &ouml;ffnen des Formulars und wenn das Formular einen neuen Datensatz anzeigt oder zu einem anderen Datensatz wechselt, weil der vorherige gel&ouml;scht wurde.<\/p>\n<p><b>Eingabe des Servers<\/b><\/p>\n<p>Die Eingabe einer Zeichenkette in das Feld <b>txtServer <\/b>soll ebenfalls eine Ereignisprozedur ausl&ouml;sen, und zwar nach jedem eingegebenen Zeichen. Dies erledigen wir mit dem Ereignis <b>Bei &auml;nderung <\/b>des Steuerelements.<\/p>\n<p>Die folgende Prozedur schreibt zun&auml;chst den aktuellen Inhalt des Textfeldes aus der <b>Text<\/b>-Eigenschaft in die Variable <b>strServer<\/b>. Dann ruft sie die Funktion <b>VerbindungszeichenfolgeErmitteln <\/b>auf, welche die aus den aktuellen Daten ermittelte Verbindungszeichenfolge in das Textfeld <b>txtVerbindungszeichenfolge <\/b>schreiben soll:<\/p>\n<pre><span style=\"color:blue;\">Private Sub <\/span>txtServer_Change()\r\n     strServer = Me!txtServer.Text\r\n     Me!txtVerbindungszeichenfolge = _\r\n         VerbindungszeichenfolgeErmitteln\r\n<span style=\"color:blue;\">End Sub<\/span><\/pre>\n<p>Vorbehaltlich des Inhalts der Funktion <b>VerbindungszeichenfolgeErmitteln<\/b>, die wir uns weiter unten ansehen, erfahren Sie bereits in Bild 6, dass der Servername gleich in ein entsprechendes Element der Verbindungszeichenfolge umgesetzt wird.<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2015_02\/pic_976_006.png\" alt=\"Die eingegebenen Daten erscheinen direkt in der Vorschau der Verbindungszeichenfolge.\" width=\"420\" height=\"341,8182\" \/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 6: Die eingegebenen Daten erscheinen direkt in der Vorschau der Verbindungszeichenfolge.<\/span><\/b><\/p>\n<p><b>Eingabe des Ports<\/b><\/p>\n<p>Beim zu verwendenden Port sieht es &auml;hnlich aus. Das Textfeld <b>txtPort <\/b>l&ouml;st die folgende Ereignisprozedur aus, die den Port &uuml;ber die Funktion <b>VerbindungszeichenfolgeErmitteln <\/b>in das Textfeld <b>txtVerbindungszeichenfolge <\/b>schreibt:<\/p>\n<pre><span style=\"color:blue;\">Private Sub <\/span>txtPort_Change()\r\n     strPort = Me!txtPort.Text\r\n     Me!txtVerbindungszeichenfolge = _\r\n         VerbindungszeichenfolgeErmitteln\r\n<span style=\"color:blue;\">End Sub<\/span><\/pre>\n<p><b>Auswahl des Treibers<\/b><\/p>\n<p>Darunter befindet sich bereits das Kombinationsfeld zur Auswahl des Treibers. Die Auswahl eines der Eintr&auml;ge l&ouml;st die Prozedur <b>cboTreiberID_AfterUpdate<\/b> aus Listing 1 aus.<\/p>\n<pre><span style=\"color:blue;\">Private Sub <\/span>cboTreiberID_AfterUpdate()\r\n     <span style=\"color:blue;\">Dim <\/span>strTyp<span style=\"color:blue;\"> As String<\/span>\r\n     strTyp = DLookup(\"Typ\", \"tblTreiber\", \"TreiberID = \" & Me!cboTreiberID)\r\n     Select Case strTyp\r\n         <span style=\"color:blue;\">Case <\/span>\"MSSQL\"\r\n             Me!ogrTrustedConnection.Enabled = <span style=\"color:blue;\">True<\/span>\r\n         <span style=\"color:blue;\">Case Else<\/span>\r\n             Me!ogrTrustedConnection.Enabled = <span style=\"color:blue;\">False<\/span>\r\n             Me!ogrTrustedConnection = 0\r\n             ogrTrustedConnection_AfterUpdate\r\n     <span style=\"color:blue;\">End Select<\/span>\r\n     Me!txtVerbindungszeichenfolge = _\r\n         VerbindungszeichenfolgeErmitteln(Nz(Me!cboDatenbank))\r\n<span style=\"color:blue;\">End Sub<\/span><\/pre>\n<p><b><span style=\"color:darkgrey;\">Listing 1: Einstellen des Treibers<\/span><\/b><\/p>\n<p>Die Prozedur liest zun&auml;chst den Wert des Feldes <b>Typ <\/b>f&uuml;r den ausgew&auml;hlten Eintrag aus der Tabelle <b>tblTreiber <\/b>aus und speichert diesen in der Variablen <b>strTyp<\/b>. Abh&auml;ngig vom Wert f&uuml;hrt die Prozedur dann einen der Zweige der folgenden <b>Select Case<\/b>-Bedingung aus.<\/p>\n<p>Der erste Zweig behandelt den Fall <b>MSSQL<\/b>. Nur der Microsoft SQL Server unterst&uuml;tzt die Windows-Authentifizierung, daher soll nur in diesem Fall eine Auswahl der Authentifizierungsmethode mit der Optionsgruppe <b>ogrTrustedConnection <\/b>m&ouml;glich sein.<\/p>\n<p>Diese stellt aktiviert die Prozedur dann durch Einstellen der Eigenschaft <b>Enabled <\/b>auf den Wert <b>True<\/b>. F&uuml;r die &uuml;brigen Servertypen (aktuell also nur My-SQL &#8211; aber vielleicht f&uuml;gen Sie ja selbst weitere Eintr&auml;ge zur Tabelle <b>tblTreiber <\/b>und auch zu dieser <b>Select Case<\/b>-Bedingung hinzu) soll die Optionsgruppe <b>ogrTrustedConnection <\/b>deaktiviert und auf den Wert <b>0 <\/b>(f&uuml;r <b>SQL Server-Authentifizierung<\/b>) eingestellt werden. In diesem Fall soll wiederum das Ereignis <b>ogrTrustedConnection_AfterUpdate <\/b>ausgel&ouml;st werden &#8211; siehe gleich im Anschluss.<\/p>\n<p>Schlie&szlig;lich schreibt die letzte Anweisung wieder die aktuelle Version der Verbindungszeichenfolge in das Textfeld <b>txtVerbindungszeichenfolge<\/b>.<\/p>\n<p>Nach der Auswahl landet der entsprechende Ausdruck in folgender Form in der Verbindungszeichenfolge:<\/p>\n<pre>DRIVER={ODBC Driver 11 for SQL Server};<\/pre>\n<p><b>Authentifizierungsart<\/b><\/p>\n<p>Damit kommen wir endlich zur Optionsgruppe <b>ogrTrustedConnection<\/b>. Diese bietet zwei Optionen an:<\/p>\n<ul>\n<li><b>-1<\/b>: Windows-Authentifizierung<\/li>\n<li><b>0<\/b>: SQL Server-Authentifizierung<\/li>\n<\/ul>\n<p>Wie bereits weiter oben beschrieben, ist die Option <b>-1 <\/b>nur verf&uuml;gbar, wenn Sie einen Treiber des Typs <b>MSSQL <\/b>w&auml;hlen. Die &uuml;brigen RDBMS bieten keine Authentifizierung auf Basis des Windows-Benutzerkontos an.<\/p>\n<p>Je nach dem Wert, den Sie f&uuml;r die Optionsgruppe ausw&auml;hlen, k&ouml;nnen Sie noch den Benutzernamen und das Kennwort f&uuml;r den Zugriff auf das RDBMS-System angeben. Bei der Windows-Authentifizierung ist dies nicht n&ouml;tig, daher werden die beiden Textfelder <b>txtBenutzername <\/b>und <b>txtKennwort <\/b>in diesem Fall deaktiviert. Gleiches gilt f&uuml;r das Textfeld <b>txtVerschluesselung <\/b>und f&uuml;r die Schaltfl&auml;che <b>cmdVerschluesseln<\/b>. Schlie&szlig;lich soll auch nach der Auswahl eines Wertes der Optionsgruppe die Verbindungszeichenfolge aktualisiert werden (s. Listing 2).<\/p>\n<pre><span style=\"color:blue;\">Private Sub <\/span>ogrTrustedConnection_AfterUpdate()\r\n     Me!txtBenutzername.Enabled = <span style=\"color:blue;\">Not<\/span> Me!ogrTrustedConnection\r\n     Me!txtKennwort.Enabled = <span style=\"color:blue;\">Not<\/span> Me!ogrTrustedConnection\r\n     Me!txtVerschluesselt.Enabled = <span style=\"color:blue;\">Not<\/span> Me!ogrTrustedConnection\r\n     Me!cmdVerschluesseln.Enabled = <span style=\"color:blue;\">Not<\/span> Me!ogrTrustedConnection\r\n     <span style=\"color:blue;\">If <\/span>Me.Dirty<span style=\"color:blue;\"> Then<\/span>\r\n         Me!txtVerbindungszeichenfolge = _\r\n             VerbindungszeichenfolgeErmitteln(Nz(Me!cboDatenbank))\r\n     <span style=\"color:blue;\">End If<\/span>\r\n<span style=\"color:blue;\">End Sub<\/span><\/pre>\n<p><b><span style=\"color:darkgrey;\">Listing 2: Aktivieren und Deaktivieren von Steuerelementen <\/span><\/b><\/p>\n<p><b>Benutzername und Kennwort eingeben<\/b><\/p>\n<p>Anschlie&szlig;end folgen die beiden Textfelder zum Eingeben von Benutzername und Kennwort. Jede &auml;nderung des Benutzernamens f&uuml;hrt zum Aufruf der Ereignisprozedur <b>txtBenutzername_Change<\/b>. Diese speichert den aktuellen Inhalt des Feldes <b>txtBenutzername <\/b>in der Variablen <b>strBenutzername <\/b>und aktualisiert anschlie&szlig;end die Verbindungszeichenfolge.<\/p>\n<p>Au&szlig;erdem leert die Prozedur das Feld <b>txtVerschluesselt<\/b>, das die verschl&uuml;sselte Version von Benutzername und Kennwort speichert:<\/p>\n<pre><span style=\"color:blue;\">Private Sub <\/span>txtBenutzername_Change()\r\n     strBenutzername = _\r\n         Me!txtBenutzername.Text\r\n     Me!txtVerbindungszeichenfolge = _\r\n         VerbindungszeichenfolgeErmitteln\r\n     Me!txtVerschluesselt = \"\"\r\n<span style=\"color:blue;\">End Sub<\/span><\/pre>\n<p>Das &auml;ndern des Kennworts l&ouml;st eine Prozedur aus, die prinzipiell genauso funktioniert wie die beim &auml;ndern des Benutzernamens:<\/p>\n<pre><span style=\"color:blue;\">Private Sub <\/span>txtKennwort_Change()\r\n     strKennwort = Me!txtKennwort.Text\r\n     Me!txtVerbindungszeichenfolge = _\r\n         VerbindungszeichenfolgeErmitteln\r\n     Me!txtVerschluesselt = \"\"\r\n<span style=\"color:blue;\">End Sub<\/span><\/pre>\n<p><b>Kennwort verschl&uuml;sseln<\/b><\/p>\n<p>M&ouml;glicherweise m&ouml;chten Sie, wie im Beitrag <b>Sicherer RDBMS-Zugriff <\/b>(<b>www.access-im-unternehmen.de\/975<\/b>) beschrieben, die Benutzerdaten in verschl&uuml;sselter Form in der Datenbank speichern und diese in eine <b>.mde<\/b>&#8211; oder <b>.accde<\/b>-Datenbank umwandeln, um ohne Eingabe der Benutzerdaten auf die Tabellen der RDBMS-Datenbank zugreifen zu k&ouml;nnen.<\/p>\n<p>In diesem Fall m&uuml;ssen Sie Schaltfl&auml;che <b>cmdVerschluesseln<\/b> bet&auml;tigen, was die Ereignisprozedur aus Listing 3 ausl&ouml;st. Diese Prozedur pr&uuml;ft zun&auml;chst, ob <b>strBenutzername <\/b>oder <b>strKennwort <\/b>ein Pipe-Zeichen (<b>|<\/b>) enthalten, und gibt gegebenenfalls den Hinweis aus, dass dies nicht zul&auml;ssig ist.<\/p>\n<pre><span style=\"color:blue;\">Private Sub <\/span>cmdVerschluesseln_Click()\r\n     <span style=\"color:blue;\">Dim <\/span>strVerschluesselt<span style=\"color:blue;\"> As String<\/span>\r\n     <span style=\"color:blue;\">If <\/span><span style=\"color:blue;\">InStr<\/span>(1, strBenutzername & strKennwort, \"|\") = 0<span style=\"color:blue;\"> Then<\/span>\r\n         strVerschluesselt = DecryptString(strBenutzername & \"|\" _\r\n             & strKennwort, \"aiu2015\")\r\n         Me!txtVerschluesselt = strVerschluesselt\r\n         Me!txtKennwort = \"\"\r\n         Me!txtBenutzername = \"\"\r\n         strBenutzername = \"\"\r\n         strKennwort = \"\"\r\n     <span style=\"color:blue;\">Else<\/span>\r\n         <span style=\"color:blue;\">MsgBox<\/span> \"Benutzername und Kennwort d&uuml;rfen nicht das Zeichen ''|''  enthalten.\"\r\n     <span style=\"color:blue;\">End If<\/span>\r\n<span style=\"color:blue;\">End Sub<\/span><\/pre>\n<p><!--30percent--><\/p>\n<p><b><span style=\"color:darkgrey;\">Listing 3: Verschl&uuml;sseln von Benutzername und Kennwort<\/span><\/b><\/p>\n<p>Dieses soll n&auml;mlich Benutzername und Kennwort voneinander trennen, wenn diese durch die Funktion <b>DecryptString <\/b>mit dem angegebenen Schl&uuml;ssel (hier <b>aiu2015<\/b>) verschl&uuml;sselt werden.<\/p>\n<p>Der verschl&uuml;sselte Ausdruck landet dann im Textfeld <b>txtVerschluesselt<\/b>, die beiden Textfelder <b>txtBenutzername <\/b>und <b>txtKennwort <\/b>werden geleert (s. Bild 7).<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2015_02\/pic_976_007.png\" alt=\"Vorschau der verschl&uuml;sselten Daten\" width=\"500\" height=\"260,4166\" \/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 7: Vorschau der verschl&uuml;sselten Daten<\/span><\/b><\/p>\n<p><b>Datenbank ausw&auml;hlen<\/b><\/p>\n<p>Damit sind wir zu dem Punkt gelangt, an dem wir den Namen der zu verwendenden Datenbank nicht nur in das Kombinationsfeld <b>cboDatenbanken <\/b>eingeben k&ouml;nnen, sondern auch aufgrund der eingegebenen Benutzerdaten die Datenbanken des aktuellen RDBMS-Systems auflisten k&ouml;nnen (sofern der aktuell angegebene Benutzer dazu berechtigt ist).<\/p>\n<p>Das Kombinationsfeld <b>cboDatenbank <\/b>soll durch einen Mausklick auf die Schaltfl&auml;che <b>cmdDatenbankEinlesen <\/b>mit den verf&uuml;gbaren Datenbanken gef&uuml;llt werden.<\/p>\n<p>Dazu l&ouml;st die Schaltfl&auml;che die Prozedur aus Listing 4 aus. Die Prozedur pr&uuml;ft zun&auml;chst, ob der Benutzer bereits einen Server in das Textfeld <b>txtServer <\/b>eingetragen hat.<\/p>\n<pre><span style=\"color:blue;\">Private Sub <\/span>cmdDatenbankenEinlesen_Click()\r\n     <span style=\"color:blue;\">If <\/span><span style=\"color:blue;\">Len<\/span>(Nz(Me!txtServer)) = 0<span style=\"color:blue;\"> Then<\/span>\r\n         <span style=\"color:blue;\">MsgBox<\/span> \"Bitte geben Sie den Namen der SQL Server-Instanz ein.\"\r\n         Me!txtServer.SetFocus\r\n         <span style=\"color:blue;\">Exit Sub<\/span>\r\n     <span style=\"color:blue;\">End If<\/span>\r\n     <span style=\"color:blue;\">If <\/span><span style=\"color:blue;\">Len<\/span>(Nz(Me!cboTreiberID)) = 0<span style=\"color:blue;\"> Then<\/span>\r\n         <span style=\"color:blue;\">MsgBox<\/span> \"Bitte w&auml;hlen Sie einen Treiber aus.\"\r\n         Me!cboTreiberID.SetFocus\r\n         <span style=\"color:blue;\">Exit Sub<\/span>\r\n     <span style=\"color:blue;\">End If<\/span>\r\n     <span style=\"color:blue;\">If <\/span>Me!ogrTrustedConnection = <span style=\"color:blue;\">False<\/span><span style=\"color:blue;\"> Then<\/span>\r\n         <span style=\"color:blue;\">If <\/span><span style=\"color:blue;\">Len<\/span>(Nz(Me!txtVerschluesselt)) = 0<span style=\"color:blue;\"> Then<\/span>\r\n             <span style=\"color:blue;\">If <\/span><span style=\"color:blue;\">Len<\/span>(Nz(Me!txtBenutzername)) = 0<span style=\"color:blue;\"> Then<\/span>\r\n                 <span style=\"color:blue;\">MsgBox<\/span> \"Bitte geben Sie einen Benutzernamen ein.\"\r\n                 Me!txtBenutzername.SetFocus\r\n                 <span style=\"color:blue;\">Exit Sub<\/span>\r\n             <span style=\"color:blue;\">End If<\/span>\r\n             <span style=\"color:blue;\">If <\/span><span style=\"color:blue;\">Len<\/span>(Nz(Me!txtKennwort)) = 0<span style=\"color:blue;\"> Then<\/span>\r\n                 <span style=\"color:blue;\">MsgBox<\/span> \"Bitte geben Sie ein Kennwort ein.\"\r\n                 Me!txtKennwort.SetFocus\r\n                 <span style=\"color:blue;\">Exit Sub<\/span>\r\n             <span style=\"color:blue;\">End If<\/span>\r\n         <span style=\"color:blue;\">End If<\/span>\r\n     <span style=\"color:blue;\">End If<\/span>\r\n     <span style=\"color:blue;\">Set<\/span> Me!cboDatenbank.Recordset = DatenbankenEinlesen\r\n     Me!cboDatenbank.SetFocus\r\n     Me!cboDatenbank.Dropdown\r\n<span style=\"color:blue;\">End Sub<\/span><\/pre>\n<p><b><span style=\"color:darkgrey;\">Listing 4: Einlesen der verf&uuml;gbaren Datenbanken<\/span><\/b><\/p>\n<p>Ist dies nicht der Fall, zeigt sie eine entsprechende Meldung an und setzt den Fokus auf dieses Textfeld, bevor die Prozedur beendet wird.<\/p>\n<p>Das gleiche Spiel geschieht mit dem Kombinationsfeld <b>cboTreiberID<\/b>. Enth&auml;lt dieses ein leere Zeichenkette, fordert die Prozedur den Benutzer zur Auswahl eines Treibers auf und beendet sich selbst.<\/p>\n<p>Danach folgt die Unterscheidung, ob es sich um einen Zugriff mit Windows-Authentifizierung oder ohne handelt. Die folgende <b>If&#8230;Then<\/b>-Bedingung f&uuml;hrt erst einige Anweisungen f&uuml;r den Fall aus, dass die SQL Server-Authentifizierung verwendet wird (<b>Me.ogrTrustedConnection = False<\/b>).<\/p>\n<p>Sind die Benutzerdaten nicht verschl&uuml;sselt (<b>Len(Me!txtVerschluesselt) = 0<\/b>), pr&uuml;ft die Prozedur, ob die beiden Textfelder <b>txtBenutzername <\/b>und <b>txtKennwort <\/b>gef&uuml;llt sind. Falls nicht, erscheinen entsprechende Meldungen mit der Aufforderung, diese zu f&uuml;llen.<\/p>\n<p>Hat die Prozedur all diese Pr&uuml;fungen durchgef&uuml;hrt, ruft sie die Funktion <b>DatenbankenEinlesen <\/b>auf und weist das Ergebnis &#8211; ein <b>Recordset<\/b>-Objekt mit den Datenbanken &#8211; der Eigenschaft <b>Recordset <\/b>des Kombinationsfeldes <b>cboDatenbank <\/b>zu (s. Listing 5).<\/p>\n<pre><span style=\"color:blue;\">Private Function <\/span>DatenbankenEinlesen()<span style=\"color:blue;\"> As <\/span>Recordset\r\n     <span style=\"color:blue;\">Dim <\/span>strSQL<span style=\"color:blue;\"> As String<\/span>\r\n     <span style=\"color:blue;\">Dim <\/span>qdf<span style=\"color:blue;\"> As <\/span>DAO.QueryDef\r\n     <span style=\"color:blue;\">Dim <\/span>strTyp<span style=\"color:blue;\"> As String<\/span>\r\n     <span style=\"color:blue;\">Dim <\/span>strVerbindungszeichenfolge<span style=\"color:blue;\"> As String<\/span>\r\n     strTyp = Me!cboTreiberID.Column(3)\r\n     Select Case strTyp\r\n         <span style=\"color:blue;\">Case <\/span>\"MSSQL\"\r\n             strVerbindungszeichenfolge = _\r\n                 VerbindungszeichenfolgeErmitteln(\"Master\")\r\n             strSQL = \"select name from sys.databases;\"\r\n         <span style=\"color:blue;\">Case <\/span>\"MySQL\"\r\n             strVerbindungszeichenfolge = _\r\n                 VerbindungszeichenfolgeErmitteln(\"mysql\")\r\n             strSQL = \"show databases;\"\r\n     <span style=\"color:blue;\">End Select<\/span>\r\n     <span style=\"color:blue;\">Set<\/span> qdf = QueryDefErstellen(strSQL, strVerbindungszeichenfolge)\r\n     On Error Resume <span style=\"color:blue;\">Next<\/span>\r\n     DoCmd.Hourglass <span style=\"color:blue;\">True<\/span>\r\n     <span style=\"color:blue;\">Set<\/span> DatenbankenEinlesen = qdf.OpenRecordset\r\n     DoCmd.Hourglass <span style=\"color:blue;\">False<\/span>\r\n     <span style=\"color:blue;\">If <\/span><span style=\"color:blue;\">Not<\/span> Err.Number = 0<span style=\"color:blue;\"> Then<\/span>\r\n         <span style=\"color:blue;\">MsgBox<\/span> \"Die Verbindung konnte nicht hergestellt werden:\" & <span style=\"color:blue;\">vbCrLf<\/span> _\r\n             & Err.Number & \" \" & Err.Description\r\n     <span style=\"color:blue;\">End If<\/span>\r\n<span style=\"color:blue;\">End Function<\/span><\/pre>\n<p><b><span style=\"color:darkgrey;\">Listing 5: Einlesen der verf&uuml;gbaren Datenbanken als Recordset<\/span><\/b><\/p>\n<p>Anschlie&szlig;end verschiebt sie den Fokus auf das Kombinationsfeld <b>cboDatenbank <\/b>und klappt die Liste mit der Methode <b>DropDown <\/b>auf (s. Bild 8).<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2015_02\/pic_976_008.png\" alt=\"Auswahl der Datenbanken des RDBMS-Systems\" width=\"600\" height=\"384,4749\" \/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 8: Auswahl der Datenbanken des RDBMS-Systems<\/span><\/b><\/p>\n<p><b>Funktion zum Einlesen der Datenbanken<\/b><\/p>\n<p>Je nach RDBMS unterscheidet sich das Vorgehen zum Einlesen der vorhandenen Datenbanken. Dies ber&uuml;cksichtigt die Funktion <b>DatenbankenEinlesen<\/b>, indem sie zun&auml;chst den Typ des Datenbanksystems aus der vierten Spalte (Index <b>3<\/b>) des Kombinationsfeldes <b>cboTreiber <\/b>in die Variable <b>strSQL <\/b>einliest.<\/p>\n<p>Diese enth&auml;lt dann entweder den Wert <b>MSSQL <\/b>oder <b>MySQL<\/b>. Je nach Wert f&uuml;hrt die Prozedur in der folgenden <b>Select Case<\/b>-Bedingung unterschiedliche Anweisungen aus. Im Falle von <b>MSSQL <\/b>ruft sie die Funktion <b>VerbindungszeichenfolgeErmitteln <\/b>mit dem Wert <b>Master <\/b>als Parameter auf. Dies liefert eine Verbindungszeichenfolge, welche die Datenbank <b>master <\/b>referenziert. Dann formuliert sie in der Variablen <b>strSQL <\/b>eine Abfrage, die alle Werte des Feldes <b>name <\/b>der Datenbank <b>sys_databases <\/b>liefert.<\/p>\n<p>Im Falle des Typs <b>MySQL <\/b>bezieht sich die Verbindungszeichenfolge auf die Systemdatenbank <b>mysql<\/b>. Die Namen der enthaltenen Tabellen liefert dann keine herk&ouml;mmliche <b>Select<\/b>-Abfrage, sondern die Anweisung <b>show databases<\/b>.<\/p>\n<p>Die nun aufgerufene Funktion <b>QueryDefErstellen <\/b>erwartet die auszuf&uuml;hrende Abfrage aus <b>strSQL <\/b>sowie die Verbindungszeichenfolge aus <b>strVerbindungszeichenfolge <\/b>als Parameter und liefert ein entsprechend ausgestattetes <b>QueryDef<\/b>-Objekt zur&uuml;ck.<\/p>\n<p>F&uuml;r dieses f&uuml;hrt die Funktion die <b>OpenRecordset<\/b>-Methode aus und speichert das Ergebnis als R&uuml;ckgabewert der Funktion in der Variablen <b>DatenbankenEinlesen<\/b>. W&auml;hrend der Ausf&uuml;hrung der <b>OpenRecordset<\/b>-Methode deaktiviert die Funktion tempor&auml;r die Fehlerbehandlung, weshalb eventuell auftretende Fehler nicht zu einer Fehlermeldung f&uuml;hren.<\/p>\n<p>Solche Fehler f&auml;ngt die Funktion vielmehr sp&auml;ter in einer Pr&uuml;fung von <b>Err.Number <\/b>ab. Sollte diese Eigenschaft einen Wert ungleich <b>0 <\/b>liefern, gibt die Funktion eine entsprechende Meldung aus.<\/p>\n<p><b>Verbindungszeichenfolge zusammenstellen<\/b><\/p>\n<p>Die schon mehrfach erw&auml;hnte Funktion <b>VerbindungszeichenfolgeErmitteln<\/b> sieht wie in Listing 6 aus und verwendet zwei optionale Parameter. Der erste hei&szlig;t <b>strDatenbank <\/b>und erwartet den Namen der zu verwendenden Datenbank.<\/p>\n<pre><span style=\"color:blue;\">Private Function <\/span>VerbindungszeichenfolgeErmitteln(<span style=\"color:blue;\">Optional<\/span> strDatenbank _\r\n        <span style=\"color:blue;\"> As String<\/span>, <span style=\"color:blue;\">Optional<\/span> bolAnzeige<span style=\"color:blue;\"> As Boolean<\/span>)<span style=\"color:blue;\"> As String<\/span>\r\n     <span style=\"color:blue;\">Dim <\/span>strTemp<span style=\"color:blue;\"> As String<\/span>\r\n     <span style=\"color:blue;\">Dim <\/span>strEntschluesselt<span style=\"color:blue;\"> As String<\/span>\r\n     strTemp = \"ODBC;\"\r\n     <span style=\"color:blue;\">If <\/span><span style=\"color:blue;\">Not<\/span> IsNull(Me!cboTreiberID)<span style=\"color:blue;\"> Then<\/span>\r\n         strTemp = strTemp & \"DRIVER={\" & Me!cboTreiberID.Column(1) & \"};\"\r\n     <span style=\"color:blue;\">End If<\/span>\r\n     <span style=\"color:blue;\">If <\/span><span style=\"color:blue;\">Len<\/span>(strServer) &gt; 0<span style=\"color:blue;\"> Then<\/span>\r\n         strTemp = strTemp & \"SERVER=\" & strServer & \";\"\r\n     <span style=\"color:blue;\">End If<\/span>\r\n     <span style=\"color:blue;\">If <\/span><span style=\"color:blue;\">Len<\/span>(strPort) &gt; 0<span style=\"color:blue;\"> Then<\/span>\r\n         strTemp = strTemp & \"PORT=\" & strPort & \";\"\r\n     <span style=\"color:blue;\">End If<\/span>\r\n     <span style=\"color:blue;\">If <\/span><span style=\"color:blue;\">Len<\/span>(strDatenbank) &gt; 0<span style=\"color:blue;\"> Then<\/span>\r\n         strTemp = strTemp & \"DATABASE=\" & strDatenbank & \";\"\r\n     <span style=\"color:blue;\">End If<\/span>\r\n     <span style=\"color:blue;\">If <\/span>Me!ogrTrustedConnection = <span style=\"color:blue;\">True<\/span><span style=\"color:blue;\"> Then<\/span>\r\n         strTemp = strTemp & \"Trusted_Connection=Yes\"\r\n     <span style=\"color:blue;\">Else<\/span>\r\n         <span style=\"color:blue;\">If <\/span>bolAnzeige<span style=\"color:blue;\"> Then<\/span>\r\n             <span style=\"color:blue;\">If <\/span><span style=\"color:blue;\">Len<\/span>(strBenutzername) &gt; 0<span style=\"color:blue;\"> Then<\/span>\r\n                 strTemp = strTemp & \"UID=\" & strBenutzername & \";\"\r\n             <span style=\"color:blue;\">Else<\/span>\r\n                 strTemp = strTemp & \"UID=&lt;Benutzername&gt;;\"\r\n             <span style=\"color:blue;\">End If<\/span>\r\n             <span style=\"color:blue;\">If <\/span><span style=\"color:blue;\">Len<\/span>(strKennwort) &gt; 0<span style=\"color:blue;\"> Then<\/span>\r\n                 strTemp = strTemp & \"PWD=\" & strKennwort & \";\"\r\n             <span style=\"color:blue;\">Else<\/span>\r\n                 strTemp = strTemp & \"PWD=&lt;Kennwort&gt;;\"\r\n             <span style=\"color:blue;\">End If<\/span>\r\n         <span style=\"color:blue;\">Else<\/span>\r\n             <span style=\"color:blue;\">If <\/span><span style=\"color:blue;\">Len<\/span>(Nz(Me!txtVerschluesselt)) = 0<span style=\"color:blue;\"> Then<\/span>\r\n                 <span style=\"color:blue;\">If <\/span><span style=\"color:blue;\">Len<\/span>(strBenutzername) &gt; 0<span style=\"color:blue;\"> Then<\/span>\r\n                     strTemp = strTemp & \"UID=\" & strBenutzername & \";\"\r\n                 <span style=\"color:blue;\">End If<\/span>\r\n                 <span style=\"color:blue;\">If <\/span><span style=\"color:blue;\">Len<\/span>(strKennwort) &gt; 0<span style=\"color:blue;\"> Then<\/span>\r\n                     strTemp = strTemp & \"PWD=\" & strKennwort & \";\"\r\n                 <span style=\"color:blue;\">End If<\/span>\r\n             <span style=\"color:blue;\">Else<\/span>\r\n                 strEntschluesselt = DecryptString(Me!txtVerschluesselt, _\r\n                     \"aiu2015\")\r\n                 strTemp = strTemp & \"UID=\" & <span style=\"color:blue;\">Split<\/span>(strEntschluesselt, _\r\n                     \"|\")(0) & \";\"\r\n                 strTemp = strTemp & \"PWD=\" & <span style=\"color:blue;\">Split<\/span>(strEntschluesselt, _\r\n                     \"|\")(1) & \";\"\r\n             <span style=\"color:blue;\">End If<\/span>\r\n         <span style=\"color:blue;\">End If<\/span>\r\n     <span style=\"color:blue;\">End If<\/span>\r\n     VerbindungszeichenfolgeErmitteln = strTemp\r\n<span style=\"color:blue;\">End Function<\/span><\/pre>\n<p><b><span style=\"color:darkgrey;\">Listing 6: Zusammenstellen der Verbindungszeichenfolge<\/span><\/b><\/p>\n<p>Damit kann der im Kombinationsfeld <b>cboDatenbank<\/b> befindliche Datenbankname ersetzt werden. Dieser Parameter wird von der Funktion zum Einlesen der Datenbanken genutzt.<\/p>\n<p>Der zweite Parameter hei&szlig;t <b>bolAnzeige<\/b> und soll den Wert <b>True <\/b>erhalten, wenn die Verbindungszeichenfolge nur zur Anzeige zusammengestellt wird &#8211; dies ist immer dann der Fall, wenn Sie die Steuerelemente des Formulars aktualisieren und die aktuelle Version der Verbindungszeichenfolge im Textfeld <b>txtVerbindungszeichenfolge <\/b>ausgegeben wird.<\/p>\n<p>Die Funktion soll dann, wenn Benutzername und Kennwort &uuml;ber die Schaltfl&auml;che <b>cmdVerschluesseln <\/b>verschl&uuml;sselt wurden, nicht mehr die entschl&uuml;sselten Benutzerdaten im Textfeld <b>txtVerbindungszeichenfolge <\/b>ausgeben, sondern die beiden Platzhalter <b><Benutzername> <\/b>und <b><Kennwort><\/b>.<\/p>\n<p>Die Funktion f&uuml;llt die Variable <b>strTemp<\/b>, die in den folgenden Anweisungen entsprechend der Eingaben des Benutzers erg&auml;nzt wird, zun&auml;chst mit dem Wert <b>ODBC;<\/b>.<\/p>\n<p>Dann pr&uuml;ft sie den Wert des Kombinationsfeldes <b>cboTreiber <\/b>und f&uuml;gt, wenn dieses nicht den Wert <b>Null <\/b>hat, den Ausdruck <b>DRIVER={<Treiber>}<\/b>; zur Variablen <b>strTemp <\/b>hinzu, wobei <b><Treiber> <\/b>dem Wert der zweiten Spalte des Kombinationsfeldes entspricht. Danach f&uuml;gt die Funktion auf &auml;hnliche Weise die Werte f&uuml;r den Server, den Port und die Datenbank hinzu.<\/p>\n<p>Sollte die Optionsgruppe <b>ogrTrustedConnection<\/b> den Wert <b>True <\/b>enthalten, erg&auml;nzt die Funktion <b>strTemp <\/b>um den Ausdruck <b>Trusted_Connection=Yes;<\/b>. Dies war der einfachste Fall f&uuml;r die Benutzerdaten, der allerdings auch nur mit dem <b>Microsoft SQL Server <\/b>funktioniert.<\/p>\n<p>Hat <b>ogrTrustedConnection <\/b>den Wert <b>False<\/b>, pr&uuml;ft die Prozedur den Wert des Parameters <b>bolAnzeige<\/b>. Im Falle des Wertes <b>True <\/b>d&uuml;rfen eventuell verschl&uuml;sselte Benutzerdaten nicht zur&uuml;ckgegeben werden, sondern m&uuml;ssen durch die Platzhalter <b><Benutzername> <\/b>und <b><Kennwort> <\/b>ersetzt werden.<\/p>\n<p>Zun&auml;chst pr&uuml;ft die Funktion hier, ob <b>strBenutzername <\/b>und <b>strKennwort <\/b>die Benutzerdaten noch im Klartext enthalten. Ist dies der Fall, k&ouml;nnen die Daten nat&uuml;rlich auch in der Verbindungszeichenfolge ausgegeben werden &#8211; der Benutzer sieht diese ja ohnehin in den beiden Textfeldern <b>txtBenutzername <\/b>und <b>txtKennwort<\/b>. Anderenfalls f&uuml;llt die Prozedur die Parameter <b>UID <\/b>und <b>PWD <\/b>mit den daf&uuml;r vorgesehenen Platzhaltern, sodass dieser Teil den Ausdruck <b>UID=<Benutzername>;PWD=<Kennwort>; <\/b>hervorbringt.<\/p>\n<p>Hat <b>bolAnzeigen <\/b>den Wert <b>False<\/b>, soll die Funktion die Werte f&uuml;r den Zugriff auf die entsprechenden Tabellen nutzen. Ist <b>txtVerschluesselt <\/b>leer, bezieht die Funktion die Benutzerdaten aus <b>strBenutzername <\/b>und <b>strKennwort<\/b>. Anderenfalls entschl&uuml;sselt die Funktion den Inhalt von <b>txtVerschluesselt <\/b>mit der Funktion <b>DecryptString<\/b>.<\/p>\n<p>Das Ergebnis ist wieder der durch das Pipe-Zeichen getrennte Ausdruck mit dem Benutzernamen und dem Kennwort, die mit der <b>Split<\/b>-Anweisung in ein Array mit zwei Elementen geschrieben wird. Diese lesen wir &uuml;ber die Indizes <b>(0) <\/b>und <b>(1) <\/b>aus und speichern sie in den Variablen <b>strBenutzername <\/b>und <b>strKennwort<\/b>, bevor sie in die Verbindungszeichenfolge einflie&szlig;en.<\/p>\n<p>Der Inhalt von <b>strTemp <\/b>wird schlie&szlig;lich als Funktionswert von <b>VerbindungszeichenfolgeErmitteln <\/b>zur&uuml;ckgegeben.<\/p>\n<p><b>Die Funktion QueryDefErstellen<\/b><\/p>\n<p>Die weiter oben verwendete Funktion <b>QueryDef-Erstellen<\/b> verwenden wir, um die Datenbanken eines RDBMS auszulesen. Die Funktion aus Listing 7 erwartet den SQL-Ausdruck der Abfrage und die Verbindungzeichenfolge als Parameter.<\/p>\n<pre><span style=\"color:blue;\">Private Function <\/span>QueryDefErstellen(strSQL<span style=\"color:blue;\"> As String<\/span>, _\r\n         strVerbindungszeichenfolge<span style=\"color:blue;\"> As String<\/span>)<span style=\"color:blue;\"> As <\/span>DAO.QueryDef\r\n     <span style=\"color:blue;\">Dim <\/span>db<span style=\"color:blue;\"> As <\/span>DAO.Database\r\n     <span style=\"color:blue;\">Dim <\/span>qdf<span style=\"color:blue;\"> As <\/span>DAO.QueryDef\r\n     <span style=\"color:blue;\">Set<\/span> db = CurrentDb\r\n     <span style=\"color:blue;\">Set<\/span> qdf = db.CreateQueryDef(\"\")\r\n     <span style=\"color:blue;\">With<\/span> qdf\r\n         .connect = strVerbindungszeichenfolge\r\n         .SQL = strSQL\r\n         .ReturnsRecords = <span style=\"color:blue;\">True<\/span>\r\n     End <span style=\"color:blue;\">With<\/span>\r\n     <span style=\"color:blue;\">Set<\/span> QueryDefErstellen = qdf\r\n<span style=\"color:blue;\">End Function<\/span><\/pre>\n<p><b><span style=\"color:darkgrey;\">Listing 7: Erstellen eines QueryDef-Objekts<\/span><\/b><\/p>\n<p>Sie erstellt ein neues, leeres <b>QueryDef<\/b>-Objekt. Da sie als Namen eine leere Zeichenkette &uuml;bergibt, wird dieses Objekt nur tempor&auml;r angelegt.<\/p>\n<p>Sie weist dem Objekt die Verbindungszeichenfolge und die Abfrage zu und legt fest, dass das Ergebnis zur&uuml;ckgeliefert werden soll (<b>ReturnRecords = True<\/b>). Das Objekt wird dann als Funktionswert zur&uuml;ckgeliefert.<\/p>\n<p><b>Verbindungszeichenfolge testen<\/b><\/p>\n<p>Die Schaltfl&auml;che <b>cmdTesten <\/b>erlaubt den Test der auf Basis der Benutzerangaben zusammengestellten Verbindungszeichenfolge.<\/p>\n<p>Sie l&ouml;st die Prozedur aus Listing 8 aus, die zun&auml;chst pr&uuml;ft, ob eine Datenbank f&uuml;r den Test ausgew&auml;hlt wurde. Dann ruft sie die Funktion <b>VerbindungTesten <\/b>auf, welche die eigentliche Arbeit &uuml;bernimmt.<\/p>\n<pre><span style=\"color:blue;\">Private Sub <\/span>cmdTesten_Click()\r\n     <span style=\"color:blue;\">Dim <\/span>strVerbindungszeichenfolge<span style=\"color:blue;\"> As String<\/span>\r\n     <span style=\"color:blue;\">If <\/span><span style=\"color:blue;\">Len<\/span>(Me!cboDatenbank) = 0<span style=\"color:blue;\"> Then<\/span>\r\n         <span style=\"color:blue;\">MsgBox<\/span> \"Keine Datenbank ausgew&auml;hlt.\"\r\n         Me!cboDatenbank.SetFocus\r\n         <span style=\"color:blue;\">Exit Sub<\/span>\r\n     <span style=\"color:blue;\">End If<\/span>\r\n     Me.Dirty = <span style=\"color:blue;\">False<\/span>\r\n     strVerbindungszeichenfolge = VerbindungszeichenfolgeErmitteln\r\n     <span style=\"color:blue;\">If <\/span>VerbindungTesten(strVerbindungszeichenfolge) = <span style=\"color:blue;\">True<\/span><span style=\"color:blue;\"> Then<\/span>\r\n         <span style=\"color:blue;\">MsgBox<\/span> \"Die Verbindung wurde erfolgreich hergestellt.\"\r\n     <span style=\"color:blue;\">Else<\/span>\r\n         <span style=\"color:blue;\">MsgBox<\/span> \"Die Verbindung konnte nicht hergestellt werden.\"\r\n     <span style=\"color:blue;\">End If<\/span>\r\n<span style=\"color:blue;\">End Sub<\/span><\/pre>\n<p><b><span style=\"color:darkgrey;\">Listing 8: Testen der Verbindungszeichenfolge<\/span><\/b><\/p>\n<p>Diese Funktion <b>VerbindungTesten <\/b>erwartet die Verbindungszeichenfolge als Parameter (s. Listing 9) sowie zwei optionale Parameter, um eventuelle Fehlerinformationen zur&uuml;ckliefern zu k&ouml;nnen. Sie erstellt ein <b>Database<\/b>-Objekt auf Basis der Verbindungszeichenfolge.<\/p>\n<pre><span style=\"color:blue;\">Public Function <\/span>VerbindungTesten(strConnection<span style=\"color:blue;\"> As String<\/span>, <span style=\"color:blue;\">Optional<\/span> lngError _\r\n        <span style=\"color:blue;\"> As Long<\/span>, <span style=\"color:blue;\">Optional<\/span> strError<span style=\"color:blue;\"> As String<\/span>)<span style=\"color:blue;\"> As Boolean<\/span>\r\n     <span style=\"color:blue;\">Dim <\/span>db<span style=\"color:blue;\"> As <\/span>DAO.Database\r\n     On Error Resume <span style=\"color:blue;\">Next<\/span>\r\n     <span style=\"color:blue;\">Set<\/span> db = DBEngine.OpenDatabase(\"Test\", dbDriverNoPrompt, False, _\r\n         strConnection)\r\n     <span style=\"color:blue;\">If <\/span><span style=\"color:blue;\">Not<\/span> Err.Number = 0<span style=\"color:blue;\"> Then<\/span>\r\n         lngError = Err.Number\r\n         strError = Err.Description\r\n         <span style=\"color:blue;\">Exit Function<\/span>\r\n     <span style=\"color:blue;\">End If<\/span>\r\n     <span style=\"color:blue;\">On Error GoTo<\/span> 0\r\n     VerbindungTesten = <span style=\"color:blue;\">True<\/span>\r\n<span style=\"color:blue;\">End Function<\/span><\/pre>\n<p><b><span style=\"color:darkgrey;\">Listing 9: Funktion zum Testen der Verbindungszeichenfolge<\/span><\/b><\/p>\n<p><b>Verbindungszeichenfolge als Standard setzen<\/b><\/p>\n<p>Eine Verbindungszeichenfolge als Standardverbindungszeichenfolge festzulegen, hat zwei Gr&uuml;nde: Erstens k&ouml;nnen Sie so daf&uuml;r sorgen, dass bei Eingabe mehrerer Verbindungszeichenfolgen immer die gew&uuml;nschte direkt im Formular <b>frmVerbindungszeichenfolgen <\/b>angezeigt wird.<\/p>\n<p>Au&szlig;erdem k&ouml;nnen Sie, wie wir gleich zeigen werden, Funktionen schreiben, die immer die als aktiv gekennzeichnete Verbindungszeichenfolge liefern. Auf diese Weise k&ouml;nnen Sie eine Menge Code schreiben, der sich auf die aktive Verbindungszeichenfolge bezieht, und brauchen bei &auml;nderung der Verbindungzeichenfolge nur den Wert des Feldes <b>Aktiv<\/b> in der Tabelle <b>tblVerbindungszeichenfolgen<\/b> zu &auml;ndern.<\/p>\n<p>Die Schaltfl&auml;che <b>cmdAlsStandard<\/b> l&ouml;st die Prozedur aus Listing 10 aus. Diese setzt den Wert des Feldes <b>Aktiv <\/b>f&uuml;r alle Eintr&auml;ge der Tabelle <b>tblVerbindungszeichenfolgen <\/b>auf den Wert <b>0 <\/b>(<b>False<\/b>) ein und markiert dann die aktuell im Formular angezeigte Verbindungszeichenfolge mit dem Wert <b>-1 <\/b>(<b>True<\/b>) f&uuml;r das Feld <b>Aktiv <\/b>als aktive Zeichenfolge.<\/p>\n<pre><span style=\"color:blue;\">Private Sub <\/span>cmdAlsStandard_Click()\r\n     <span style=\"color:blue;\">Dim <\/span>db<span style=\"color:blue;\"> As <\/span>DAO.Database\r\n     <span style=\"color:blue;\">Set<\/span> db = CurrentDb\r\n     db.Execute \"UPDATE tblVerbindungszeichenfolgen SET Aktiv = 0\", _\r\n         dbFailOnError\r\n     db.Execute \"UPDATE tblVerbindungszeichenfolgen SET Aktiv = -1 \" _\r\n         & \"WHERE VerbindungszeichenfolgeID = \" _\r\n         & Me!VerbindungszeichenfolgeID, dbFailOnError\r\n     Me!cmdAlsStandard.Enabled = <span style=\"color:blue;\">False<\/span>\r\n<span style=\"color:blue;\">End Sub<\/span><\/pre>\n<p><b><span style=\"color:darkgrey;\">Listing 10: Markieren der aktiven Verbindungszeichenfolge<\/span><\/b><\/p>\n<p><b>Anlegen einer neuen Verbindungszeichenfolge<\/b><\/p>\n<p>Das Anlegen eines neuen Eintrags mit dem Formular <b>frmVerbindungszeichenfolgen <\/b>ist eine der einfachsten Aktionen. Die dazu vorgesehene Ereignisprozedur l&ouml;sen Sie mit einem Klick auf die Schaltfl&auml;che <b>cmdNeu <\/b>aus. Sie verschiebt den Datensatzzeiger lediglich auf einen neuen, leeren Datensatz:<\/p>\n<pre><span style=\"color:blue;\">Private Sub <\/span>cmdNeu_Click()\r\n     DoCmd.GoToRecord Record:=acNewRec\r\n<span style=\"color:blue;\">End Sub<\/span><\/pre>\n<p><b>L&ouml;schen einer Verbindungszeichenfolge<\/b><\/p>\n<p>Auch das L&ouml;schen ist nicht allzu kompliziert. Die Methode <b>RunCommand <\/b>mit dem Parameter <b>acCmdDeleteRecord <\/b>entfernt den aktuell angezeigten Datensatz aus der Datenherkunft. Mit der <b>Requery<\/b>-Methode des Formulars wirs dessen Datenherkunft aktualisiert, die gleiche Methode des Kombinationsfeldes zur Auswahl der Verbindungszeichenfolgen sorgt hier f&uuml;r das erneute Einlesen der Eintr&auml;ge.<\/p>\n<p>Das L&ouml;schen l&ouml;st wiederum die Ereignisprozedur <b>Form_Current <\/b>aus, was zum F&uuml;llen der Variablen wie <b>strBenutzername <\/b>oder <b>strKennwort <\/b>und zum Einstellen der Schnellauswahl auf den aktuellen Datensatz f&uuml;hrt:<\/p>\n<pre><span style=\"color:blue;\">Private Sub <\/span>cmdLoeschen_Click()\r\n     RunCommand acCmdDeleteRecord\r\n     Me.Requery\r\n     Me!cboSchnellauswahl.Requery\r\n<span style=\"color:blue;\">End Sub<\/span><\/pre>\n<p><b>Kopieren einer Verbindungszeichenfolge<\/b><\/p>\n<p>Gelegentlich werden Sie vielleicht etwas mit den Daten der Verbindungszeichenfolge experimentieren m&uuml;ssen, bevor diese funktioniert &#8211; manchmal hakt es mit dem Servernamen, dann funktioniert vielleicht ein Benutzername mit Kennwort nicht richtig. Normalerweise bastelt man dann so lange an den Daten, bis es funktioniert.<\/p>\n<p>Dabei k&ouml;nnte es helfen, die nicht funktionierenden Kombinationen im Blick zu behalten. Dies unterst&uuml;tzt das Formular mit der Schaltfl&auml;che <b>cmdKopierenAls<\/b>, welche den aktuellen Datensatz komplett kopiert, allerdings unter Angabe einer neuen, vom Benutzer festzulegenden Bezeichnung.<\/p>\n<p>Diese Funktion ist auch hilfreich, wenn Sie beispielsweise regelm&auml;&szlig;ig den Zugriff unter verschiedenen Benutzerdaten testen wollen &#8211; Sie k&ouml;nnen dann einfach den kompletten Datensatz kopieren und brauchen nur die entscheidenden Informationen zu kopieren.<\/p>\n<p>Die durch die Schaltfl&auml;che ausgel&ouml;ste Prozedur finden Sie in Listing 11. Sie fragt zun&auml;chst per <b>InputBox <\/b>den Namen der neuen Verbindungszeichenfolge ab. Dann pr&uuml;ft sie, ob diese Bezeichnung schon vergeben ist, und bricht die Prozedur in diesem Fall mit einer Meldung ab.<\/p>\n<pre><span style=\"color:blue;\">Private Sub <\/span>cmdKopierenAls_Click()\r\n     <span style=\"color:blue;\">Dim <\/span>db<span style=\"color:blue;\"> As <\/span>DAO.Database\r\n     <span style=\"color:blue;\">Dim <\/span>strBezeichnung<span style=\"color:blue;\"> As String<\/span>\r\n     <span style=\"color:blue;\">Dim <\/span>lngVerbindungszeichenfolgeID<span style=\"color:blue;\"> As Long<\/span>\r\n     <span style=\"color:blue;\">Set<\/span> db = CurrentDb\r\n     strBezeichnung = InputBox(\"Geben Sie die Bezeichnung der Verbindungszeichenfolge ein.\", _\r\n         \"Verbindungszeichenfolge kopieren\", \"Kopie von \" & Me!Bezeichnung)\r\n     <span style=\"color:blue;\">If <\/span><span style=\"color:blue;\">Not<\/span> <span style=\"color:blue;\">Len<\/span>(strBezeichnung) = 0<span style=\"color:blue;\"> Then<\/span>\r\n         <span style=\"color:blue;\">If <\/span>IsNull(DLookup(\"Bezeichnung\", \"tblVerbindungszeichenfolgen\", \"Bezeichnung = ''''\"))<span style=\"color:blue;\"> Then<\/span>\r\n             db.Execute \"INSERT INTO tblVerbindungszeichenfolgen SELECT ''\" & strBezeichnung _\r\n                 & \"'' AS Bezeichnung, SQLServer, Datenbank, TrustedConnection, Benutzername, Kennwort, \" _\r\n                 & \"TreiberID, Verbindungszeichenfolge, Port, Verschluesselt FROM tblVerbindungszeichenfolgen \" _\r\n                 & \"WHERE VerbindungszeichenfolgeID = \" & Me!VerbindungszeichenfolgeID, dbFailOnError\r\n             lngVerbindungszeichenfolgeID = db.OpenRecordset(\"SELECT @@IDENTITY\").Fields(0)\r\n             Me.Requery\r\n             Me.Recordset.FindFirst \"VerbindungszeichenfolgeID = \" & lngVerbindungszeichenfolgeID\r\n             Me!cboSchnellauswahl.Requery\r\n             Me!cboSchnellauswahl = lngVerbindungszeichenfolgeID\r\n         <span style=\"color:blue;\">Else<\/span>\r\n             <span style=\"color:blue;\">MsgBox<\/span> \"Es ist bereits eine Verbindungszeichenfolge namens ''\" & strBezeichnung & \"'' vorhanden.\"\r\n         <span style=\"color:blue;\">End If<\/span>\r\n     <span style=\"color:blue;\">End If<\/span>\r\n<span style=\"color:blue;\">End Sub<\/span><\/pre>\n<p><b><span style=\"color:darkgrey;\">Listing 11: Kopieren einer Verbindungszeichenfolge in einen neuen Datensatz<\/span><\/b><\/p>\n<p>Anderenfalls legt sie mit einer <b>INSERT INTO<\/b>-Aktionsabfrage einen neuen Datensatz in der Tabelle <b>tblVerbindungszeichenfolge <\/b>an, wobei alle Daten au&szlig;er der Bezeichnung aus dem aktuellen Datensatz &uuml;bernommen werden. Als Bezeichnung verwendet die Anweisung nat&uuml;rlich den soeben vom Benutzer abgefragten Ausdruck.<\/p>\n<p>Danach fragt die Prozedur den Prim&auml;rschl&uuml;sselwert des neu angelegten Datensatzes ab, aktualisiert die Datenherkunft und stellt den Datensatzzeiger auf den neuen Datensatz ein. Gleiches erledigt sie f&uuml;r das Kombinationsfeld <b>cboSchnellauswahl<\/b>.<\/p>\n<p><b>Verbindungszeichenfolgen verf&uuml;gbar machen<\/b><\/p>\n<p>Nun haben wir alle &uuml;blicherweise verwendeten Parameter f&uuml;r eine Verbindungszeichenfolge im Formular untergebracht &#8211; und es gibt eine Reihe von Funktionen, mit denen Sie neue Verbindungen anlegen und vorhandene kopieren, bearbeiten oder l&ouml;schen k&ouml;nnen. Was noch fehlt, ist jedoch eine Funktion, mit der wir die Verbindungszeichenfolgen von au&szlig;en auslesen und einsetzen k&ouml;nnen &#8211; beispielsweise, um eine Verbindungszeichenfolge zum Verkn&uuml;pfen von Tabellen zu erstellen.<\/p>\n<p>Diese Funktion namens <b>Verbindungszeichenfolge<\/b> finden Sie in Listing 12. Sie kann v&ouml;llig unabh&auml;ngig vom Formular <b>frmVerbindungszeichenfolgen<\/b> verwendet werden und ben&ouml;tigt nur die beiden Tabellen <b>tblVerbindungszeichenfolgen <\/b>und <b>tblTreiber <\/b>&#8211; ausgestattet mit entsprechenden Datens&auml;tzen.<\/p>\n<pre><span style=\"color:blue;\">Public Function <\/span>Verbindungszeichenfolge(<span style=\"color:blue;\">Optional<\/span> bolAktiv<span style=\"color:blue;\"> As Boolean<\/span>, <span style=\"color:blue;\">Optional<\/span> lngVerbindungszeichenfolgeID<span style=\"color:blue;\"> As Long<\/span>) _\r\n        <span style=\"color:blue;\"> As String<\/span>\r\n     <span style=\"color:blue;\">Dim <\/span>db<span style=\"color:blue;\"> As <\/span>DAO.Database\r\n     <span style=\"color:blue;\">Dim <\/span>rst<span style=\"color:blue;\"> As <\/span>DAO.Recordset\r\n     <span style=\"color:blue;\">Dim <\/span>strTemp<span style=\"color:blue;\"> As String<\/span>\r\n     <span style=\"color:blue;\">Dim <\/span>strEntschluesselt<span style=\"color:blue;\"> As String<\/span>\r\n     <span style=\"color:blue;\">Dim <\/span>strSQL<span style=\"color:blue;\"> As String<\/span>\r\n     <span style=\"color:blue;\">Dim <\/span>strTreiber<span style=\"color:blue;\"> As String<\/span>\r\n     <span style=\"color:blue;\">Set<\/span> db = CurrentDb\r\n     strSQL = \"SELECT TOP 1 * FROM tblVerbindungszeichenfolgen\"\r\n     <span style=\"color:blue;\">If <\/span>bolAktiv<span style=\"color:blue;\"> Then<\/span>\r\n         strSQL = strSQL & \" WHERE Aktiv = -1\"\r\n     <span style=\"color:blue;\">Else<\/span>\r\n         <span style=\"color:blue;\">If <\/span><span style=\"color:blue;\">Not<\/span> lngVerbindungszeichenfolgeID = 0<span style=\"color:blue;\"> Then<\/span>\r\n             strSQL = strSQL & \" WHERE VerbindungszeichenfolgeID = \" & lngVerbindungszeichenfolgeID\r\n         <span style=\"color:blue;\">End If<\/span>\r\n     <span style=\"color:blue;\">End If<\/span>\r\n     <span style=\"color:blue;\">Set<\/span> rst = db.OpenRecordset(strSQL, dbOpenDynaset)\r\n     <span style=\"color:blue;\">If <\/span>rst.EOF<span style=\"color:blue;\"> Then<\/span>\r\n         <span style=\"color:blue;\">MsgBox<\/span> \"Verbindungszeichenfolge nicht vorhanden.\"\r\n         <span style=\"color:blue;\">Exit Function<\/span>\r\n     <span style=\"color:blue;\">End If<\/span>\r\n     strTreiber = DLookup(\"Treiber\", \"tblTreiber\", \"TreiberID = \" & rst!TreiberID)\r\n     strTemp = \"ODBC;\"\r\n     strTemp = strTemp & \"DRIVER={\" & strTreiber & \"};\"\r\n     strTemp = strTemp & \"SERVER=\" & rst!Server & \";\"\r\n     <span style=\"color:blue;\">If <\/span><span style=\"color:blue;\">Len<\/span>(Nz(rst!Port)) &gt; 0<span style=\"color:blue;\"> Then<\/span>\r\n         strTemp = strTemp & \"PORT=\" & rst!Port & \";\"\r\n     <span style=\"color:blue;\">End If<\/span>\r\n     strTemp = strTemp & \"DATABASE=\" & rst!Datenbank & \";\"\r\n     <span style=\"color:blue;\">If <\/span>rst!TrustedConnection = <span style=\"color:blue;\">True<\/span><span style=\"color:blue;\"> Then<\/span>\r\n         strTemp = strTemp & \"Trusted_Connection=Yes;\"\r\n     <span style=\"color:blue;\">Else<\/span>\r\n         <span style=\"color:blue;\">If <\/span><span style=\"color:blue;\">Len<\/span>(Nz(rst!Verschluesselt)) = 0<span style=\"color:blue;\"> Then<\/span>\r\n             <span style=\"color:blue;\">If <\/span><span style=\"color:blue;\">Len<\/span>(rst!Benutzername) &gt; 0<span style=\"color:blue;\"> Then<\/span>\r\n                 strTemp = strTemp & \"UID=\" & rst!Benutzername & \";\"\r\n             <span style=\"color:blue;\">End If<\/span>\r\n             <span style=\"color:blue;\">If <\/span><span style=\"color:blue;\">Len<\/span>(rst!Kennwort) &gt; 0<span style=\"color:blue;\"> Then<\/span>\r\n                 strTemp = strTemp & \"PWD=\" & rst!Kennwort & \";\"\r\n             <span style=\"color:blue;\">End If<\/span>\r\n         <span style=\"color:blue;\">Else<\/span>\r\n             strEntschluesselt = DecryptString(rst!Verschluesselt, \"aiu2015\")\r\n             strTemp = strTemp & \"UID=\" & <span style=\"color:blue;\">Split<\/span>(strEntschluesselt, \"|\")(0) & \";\"\r\n             strTemp = strTemp & \"PWD=\" & <span style=\"color:blue;\">Split<\/span>(strEntschluesselt, \"|\")(1) & \";\"\r\n         <span style=\"color:blue;\">End If<\/span>\r\n     <span style=\"color:blue;\">End If<\/span>\r\n     Verbindungszeichenfolge = strTemp\r\n<span style=\"color:blue;\">End Function<\/span><\/pre>\n<p><b><span style=\"color:darkgrey;\">Listing 12: Zusammenstellen einer Verbindungszeichenfolge f&uuml;r weitere Zwecke<\/span><\/b><\/p>\n<p>Die Funktion erwartet zwei optionale Parameter:<\/p>\n<ul>\n<li><b>bolAktiv<\/b>: Gibt an, ob die als aktiv gekennzeichnete Verbindungszeichenfolge verwendet werden soll.<\/li>\n<li><b>lngVerbindungszeichenfolgeID<\/b>: Falls der erste Parameter den Wert <b>False<\/b> erh&auml;lt, liefert die Funktion die Verbindungszeichenfolge mit der mit diesem Parameter &uuml;bergebenen ID.<\/li>\n<\/ul>\n<p>Wenn der Benutzer keinen der beiden Parameter f&uuml;llt, liefert die Funktion einfach die Verbindungszeichenfolge zum ersten Datensatz der Tabelle <b>tblVerbindungszeichenfolgen <\/b>zur&uuml;ck.<\/p>\n<p>Die Funktion stellt zun&auml;chst eine SQL-Abfrage zusammen, die grunds&auml;tzlich aus einer <b>SELECT<\/b>-Abfrage &uuml;ber alle Felder der Tabelle <b>tblVerbindungszeichenfolgen <\/b>besteht, die aber nur den ersten Datensatz liefern soll (<b>TOP 1<\/b>).<\/p>\n<p>Hat der Parameter <b>bolAktiv <\/b>den Wert <b>-1<\/b>, f&uuml;gt sie der Abfrage das Kriterium <b>WHERE Aktiv = -1 <\/b>hinzu. In diesem Fall &ouml;ffnet die folgende <b>OpenRecordset<\/b>-Methode den Datensatz, der aktuell als aktiv markiert ist.<\/p>\n<p>Ist <b>bolAktiv <\/b>leer, entspricht dies automatisch dem Wert <b>False<\/b>. Dann pr&uuml;ft die Funktion den Wert des zweiten Parameters <b>lngVerbindungszeichenfolgeID<\/b>.<\/p>\n<p>Ist dieser ungleich <b>0 <\/b>(was ebenfalls dem Wert f&uuml;r einen nicht &uuml;bergebenen Parameter entspricht), h&auml;ngt die Funktion das Kriterium <b>WHERE Verbindungszeichenfolge = x <\/b>an die Abfrage an (<b>x <\/b>steht f&uuml;r den Wert aus <b>lngVerbindungszeichenfolge<\/b>).<\/p>\n<p>Sind beide Parameter leer, erh&auml;lt die SQL-Abfrage also kein Kriterium und liefert schlicht und einfach den ersten Datensatz der Tabelle <b>tblVerbindungszeichenfolgen<\/b>.<\/p>\n<p>Die Funktion pr&uuml;ft dann, ob das Recordset &uuml;berhaupt einen Datensatz enth&auml;lt (dies ist nicht der Fall, wenn beispielsweise kein Datensatz als aktiv markiert ist oder kein Datensatz mit der angegebenen ID vorhanden ist), und liefert gegebenenfalls eine entsprechende Meldung &#8211; die Funktion w&auml;re dann zu Ende.<\/p>\n<p>Anderenfalls stellt die Funktion die Verbindungszeichen auf Basis der in den Tabellen <b>tblVerbindungszeichenfolgen <\/b>und <b>tblTreiber <\/b>hinterlegten Feldinhalte zusammen. Dies geschieht prinzipiell genauso wie in der weiter oben vorgestellten Funktion <b>VerbindungszeichenfolgeEinlesen<\/b>, allerdings greift die hier beschriebene Funktion direkt auf die Daten der Tabellen zu.<\/p>\n<p>Im Direktfenster k&ouml;nnen Sie so ganz einfach die gew&uuml;nschte Verbindungszeichenfolge ausgeben:<\/p>\n<pre>  Verbindungszeichenfolge(<span style=\"color:blue;\">True<\/span>)\r\nODBC;DRIVER={SQL Server Native Client 11.0};SERVER=ASQL;DATABASE=AEMA_SQL;Trusted_Connection=Yes;<\/pre>\n<p><b>Zusammenfassung und Ausblick<\/b><\/p>\n<p>Die Verwaltung von Verbindungszeichenfolgen ist mit diesem Formular sehr einfach m&ouml;glich. Gleichzeitig k&ouml;nnen Sie diese damit leicht ausprobieren.<\/p>\n<p>Die damit erstellten Verbindungszeichenfolgen lassen sich mit der Funktion Verbindungszeichenfolge leicht f&uuml;r verschiedene Einsatzzwecke auslesen und einsetzen.<\/p>\n<p>Auch die Nutzung verschiedener Verbindungen in der gleichen Anwendung ist hiermit unkompliziert m&ouml;glich.<\/p>\n<h3>Downloads zu diesem Beitrag<\/h3>\n<p>Enthaltene Beispieldateien:<\/p>\n<p>SQLVerbindungenVerwalten.mdb<\/p>\n<p><a href=\"..\/fileadmin\/beispiele\/{43124739-6237-44C0-BED7-CD9F43A057BD}\/aiu_976.zip\">Download<\/a><\/p>\n","protected":false},"excerpt":{"rendered":"<p>Wer einen SQL-Server (mit Bindestrich als Oberbegriff f&uuml;r Microsoft SQL Server, MySQL et cetera) betreibt, m&ouml;chte oftmals von einer Access-Datenbank auf die enthaltenen Daten zugreifen. Dazu k&ouml;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&uuml;tzliche Helferlein erwiesen haben. In diesem Beitrag starten wir mit einem Tool zur Verwaltung von RDBMS-Verbindungen.<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"om_disable_all_campaigns":false,"_monsterinsights_skip_tracking":false,"_monsterinsights_sitenote_active":false,"_monsterinsights_sitenote_note":"","_monsterinsights_sitenote_category":0,"_uf_show_specific_survey":0,"_uf_disable_surveys":false,"footnotes":""},"categories":[66022015,662015,44000022],"tags":[],"class_list":["post-55000976","post","type-post","status-publish","format-standard","hentry","category-66022015","category-662015","category-SQL_Server_und_Co"],"yoast_head":"<!-- This site is optimized with the Yoast SEO Premium plugin v20.9 (Yoast SEO v27.3) - https:\/\/yoast.com\/product\/yoast-seo-premium-wordpress\/ -->\n<title>RDBMS-Tools: Verbindungen verwalten - Access im Unternehmen<\/title>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/access-im-unternehmen.de\/RDBMSTools_Verbindungen_verwalten\/\" \/>\n<meta property=\"og:locale\" content=\"de_DE\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"RDBMS-Tools: Verbindungen verwalten\" \/>\n<meta property=\"og:description\" content=\"Wer einen SQL-Server (mit Bindestrich als Oberbegriff f&uuml;r Microsoft SQL Server, MySQL et cetera) betreibt, m&ouml;chte oftmals von einer Access-Datenbank auf die enthaltenen Daten zugreifen. Dazu k&ouml;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&uuml;tzliche Helferlein erwiesen haben. In diesem Beitrag starten wir mit einem Tool zur Verwaltung von RDBMS-Verbindungen.\" \/>\n<meta property=\"og:url\" content=\"https:\/\/access-im-unternehmen.de\/RDBMSTools_Verbindungen_verwalten\/\" \/>\n<meta property=\"og:site_name\" content=\"Access im Unternehmen\" \/>\n<meta property=\"article:published_time\" content=\"2020-05-22T21:07:38+00:00\" \/>\n<meta property=\"og:image\" content=\"http:\/\/vg07.met.vgwort.de\/na\/8347083b6ad14a11a8b59ecae3c0f924\" \/>\n<meta name=\"author\" content=\"Andr\u00e9 Minhorst\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:label1\" content=\"Verfasst von\" \/>\n\t<meta name=\"twitter:data1\" content=\"Andr\u00e9 Minhorst\" \/>\n\t<meta name=\"twitter:label2\" content=\"Gesch\u00e4tzte Lesezeit\" \/>\n\t<meta name=\"twitter:data2\" content=\"28\u00a0Minuten\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\\\/\\\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/RDBMSTools_Verbindungen_verwalten\\\/#article\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/RDBMSTools_Verbindungen_verwalten\\\/\"},\"author\":{\"name\":\"Andr\u00e9 Minhorst\",\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/#\\\/schema\\\/person\\\/13395c4bcd7d7963efe33be9c584d93f\"},\"headline\":\"RDBMS-Tools: Verbindungen verwalten\",\"datePublished\":\"2020-05-22T21:07:38+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/RDBMSTools_Verbindungen_verwalten\\\/\"},\"wordCount\":4360,\"commentCount\":0,\"publisher\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/#organization\"},\"image\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/RDBMSTools_Verbindungen_verwalten\\\/#primaryimage\"},\"thumbnailUrl\":\"http:\\\/\\\/vg07.met.vgwort.de\\\/na\\\/8347083b6ad14a11a8b59ecae3c0f924\",\"articleSection\":[\"2\\\/2015\",\"2015\",\"SQL Server und Co.\"],\"inLanguage\":\"de\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\\\/\\\/access-im-unternehmen.de\\\/RDBMSTools_Verbindungen_verwalten\\\/#respond\"]}]},{\"@type\":\"WebPage\",\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/RDBMSTools_Verbindungen_verwalten\\\/\",\"url\":\"https:\\\/\\\/access-im-unternehmen.de\\\/RDBMSTools_Verbindungen_verwalten\\\/\",\"name\":\"RDBMS-Tools: Verbindungen verwalten - Access im Unternehmen\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/RDBMSTools_Verbindungen_verwalten\\\/#primaryimage\"},\"image\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/RDBMSTools_Verbindungen_verwalten\\\/#primaryimage\"},\"thumbnailUrl\":\"http:\\\/\\\/vg07.met.vgwort.de\\\/na\\\/8347083b6ad14a11a8b59ecae3c0f924\",\"datePublished\":\"2020-05-22T21:07:38+00:00\",\"breadcrumb\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/RDBMSTools_Verbindungen_verwalten\\\/#breadcrumb\"},\"inLanguage\":\"de\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\\\/\\\/access-im-unternehmen.de\\\/RDBMSTools_Verbindungen_verwalten\\\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"de\",\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/RDBMSTools_Verbindungen_verwalten\\\/#primaryimage\",\"url\":\"http:\\\/\\\/vg07.met.vgwort.de\\\/na\\\/8347083b6ad14a11a8b59ecae3c0f924\",\"contentUrl\":\"http:\\\/\\\/vg07.met.vgwort.de\\\/na\\\/8347083b6ad14a11a8b59ecae3c0f924\"},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/RDBMSTools_Verbindungen_verwalten\\\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\\\/\\\/access-im-unternehmen.de\\\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"RDBMS-Tools: Verbindungen verwalten\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/#website\",\"url\":\"https:\\\/\\\/access-im-unternehmen.de\\\/\",\"name\":\"Access im Unternehmen\",\"description\":\"Das Magazin f\u00fcr Datenbankentwickler auf Basis von Microsoft Access\",\"publisher\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/#organization\"},\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\\\/\\\/access-im-unternehmen.de\\\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"de\"},{\"@type\":\"Organization\",\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/#organization\",\"name\":\"Andr\u00e9 Minhorst Verlag\",\"url\":\"https:\\\/\\\/access-im-unternehmen.de\\\/\",\"logo\":{\"@type\":\"ImageObject\",\"inLanguage\":\"de\",\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/#\\\/schema\\\/logo\\\/image\\\/\",\"url\":\"https:\\\/\\\/access-im-unternehmen.de\\\/wp-content\\\/uploads\\\/2019\\\/09\\\/aiu_wp.png\",\"contentUrl\":\"https:\\\/\\\/access-im-unternehmen.de\\\/wp-content\\\/uploads\\\/2019\\\/09\\\/aiu_wp.png\",\"width\":370,\"height\":111,\"caption\":\"Andr\u00e9 Minhorst Verlag\"},\"image\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/#\\\/schema\\\/logo\\\/image\\\/\"}},{\"@type\":\"Person\",\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/#\\\/schema\\\/person\\\/13395c4bcd7d7963efe33be9c584d93f\",\"name\":\"Andr\u00e9 Minhorst\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"de\",\"@id\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/1b9d010cf1716692cb9c34f21554e07d17d461acaea5b61b8cb21cbec678d48a?s=96&d=mm&r=g\",\"url\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/1b9d010cf1716692cb9c34f21554e07d17d461acaea5b61b8cb21cbec678d48a?s=96&d=mm&r=g\",\"contentUrl\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/1b9d010cf1716692cb9c34f21554e07d17d461acaea5b61b8cb21cbec678d48a?s=96&d=mm&r=g\",\"caption\":\"Andr\u00e9 Minhorst\"}}]}<\/script>\n<!-- \/ Yoast SEO Premium plugin. -->","yoast_head_json":{"title":"RDBMS-Tools: Verbindungen verwalten - Access im Unternehmen","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/access-im-unternehmen.de\/RDBMSTools_Verbindungen_verwalten\/","og_locale":"de_DE","og_type":"article","og_title":"RDBMS-Tools: Verbindungen verwalten","og_description":"Wer einen SQL-Server (mit Bindestrich als Oberbegriff f&uuml;r Microsoft SQL Server, MySQL et cetera) betreibt, m&ouml;chte oftmals von einer Access-Datenbank auf die enthaltenen Daten zugreifen. Dazu k&ouml;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&uuml;tzliche Helferlein erwiesen haben. In diesem Beitrag starten wir mit einem Tool zur Verwaltung von RDBMS-Verbindungen.","og_url":"https:\/\/access-im-unternehmen.de\/RDBMSTools_Verbindungen_verwalten\/","og_site_name":"Access im Unternehmen","article_published_time":"2020-05-22T21:07:38+00:00","og_image":[{"url":"http:\/\/vg07.met.vgwort.de\/na\/8347083b6ad14a11a8b59ecae3c0f924","type":"","width":"","height":""}],"author":"Andr\u00e9 Minhorst","twitter_card":"summary_large_image","twitter_misc":{"Verfasst von":"Andr\u00e9 Minhorst","Gesch\u00e4tzte Lesezeit":"28\u00a0Minuten"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/access-im-unternehmen.de\/RDBMSTools_Verbindungen_verwalten\/#article","isPartOf":{"@id":"https:\/\/access-im-unternehmen.de\/RDBMSTools_Verbindungen_verwalten\/"},"author":{"name":"Andr\u00e9 Minhorst","@id":"https:\/\/access-im-unternehmen.de\/#\/schema\/person\/13395c4bcd7d7963efe33be9c584d93f"},"headline":"RDBMS-Tools: Verbindungen verwalten","datePublished":"2020-05-22T21:07:38+00:00","mainEntityOfPage":{"@id":"https:\/\/access-im-unternehmen.de\/RDBMSTools_Verbindungen_verwalten\/"},"wordCount":4360,"commentCount":0,"publisher":{"@id":"https:\/\/access-im-unternehmen.de\/#organization"},"image":{"@id":"https:\/\/access-im-unternehmen.de\/RDBMSTools_Verbindungen_verwalten\/#primaryimage"},"thumbnailUrl":"http:\/\/vg07.met.vgwort.de\/na\/8347083b6ad14a11a8b59ecae3c0f924","articleSection":["2\/2015","2015","SQL Server und Co."],"inLanguage":"de","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/access-im-unternehmen.de\/RDBMSTools_Verbindungen_verwalten\/#respond"]}]},{"@type":"WebPage","@id":"https:\/\/access-im-unternehmen.de\/RDBMSTools_Verbindungen_verwalten\/","url":"https:\/\/access-im-unternehmen.de\/RDBMSTools_Verbindungen_verwalten\/","name":"RDBMS-Tools: Verbindungen verwalten - Access im Unternehmen","isPartOf":{"@id":"https:\/\/access-im-unternehmen.de\/#website"},"primaryImageOfPage":{"@id":"https:\/\/access-im-unternehmen.de\/RDBMSTools_Verbindungen_verwalten\/#primaryimage"},"image":{"@id":"https:\/\/access-im-unternehmen.de\/RDBMSTools_Verbindungen_verwalten\/#primaryimage"},"thumbnailUrl":"http:\/\/vg07.met.vgwort.de\/na\/8347083b6ad14a11a8b59ecae3c0f924","datePublished":"2020-05-22T21:07:38+00:00","breadcrumb":{"@id":"https:\/\/access-im-unternehmen.de\/RDBMSTools_Verbindungen_verwalten\/#breadcrumb"},"inLanguage":"de","potentialAction":[{"@type":"ReadAction","target":["https:\/\/access-im-unternehmen.de\/RDBMSTools_Verbindungen_verwalten\/"]}]},{"@type":"ImageObject","inLanguage":"de","@id":"https:\/\/access-im-unternehmen.de\/RDBMSTools_Verbindungen_verwalten\/#primaryimage","url":"http:\/\/vg07.met.vgwort.de\/na\/8347083b6ad14a11a8b59ecae3c0f924","contentUrl":"http:\/\/vg07.met.vgwort.de\/na\/8347083b6ad14a11a8b59ecae3c0f924"},{"@type":"BreadcrumbList","@id":"https:\/\/access-im-unternehmen.de\/RDBMSTools_Verbindungen_verwalten\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/access-im-unternehmen.de\/"},{"@type":"ListItem","position":2,"name":"RDBMS-Tools: Verbindungen verwalten"}]},{"@type":"WebSite","@id":"https:\/\/access-im-unternehmen.de\/#website","url":"https:\/\/access-im-unternehmen.de\/","name":"Access im Unternehmen","description":"Das Magazin f\u00fcr Datenbankentwickler auf Basis von Microsoft Access","publisher":{"@id":"https:\/\/access-im-unternehmen.de\/#organization"},"potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/access-im-unternehmen.de\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"de"},{"@type":"Organization","@id":"https:\/\/access-im-unternehmen.de\/#organization","name":"Andr\u00e9 Minhorst Verlag","url":"https:\/\/access-im-unternehmen.de\/","logo":{"@type":"ImageObject","inLanguage":"de","@id":"https:\/\/access-im-unternehmen.de\/#\/schema\/logo\/image\/","url":"https:\/\/access-im-unternehmen.de\/wp-content\/uploads\/2019\/09\/aiu_wp.png","contentUrl":"https:\/\/access-im-unternehmen.de\/wp-content\/uploads\/2019\/09\/aiu_wp.png","width":370,"height":111,"caption":"Andr\u00e9 Minhorst Verlag"},"image":{"@id":"https:\/\/access-im-unternehmen.de\/#\/schema\/logo\/image\/"}},{"@type":"Person","@id":"https:\/\/access-im-unternehmen.de\/#\/schema\/person\/13395c4bcd7d7963efe33be9c584d93f","name":"Andr\u00e9 Minhorst","image":{"@type":"ImageObject","inLanguage":"de","@id":"https:\/\/secure.gravatar.com\/avatar\/1b9d010cf1716692cb9c34f21554e07d17d461acaea5b61b8cb21cbec678d48a?s=96&d=mm&r=g","url":"https:\/\/secure.gravatar.com\/avatar\/1b9d010cf1716692cb9c34f21554e07d17d461acaea5b61b8cb21cbec678d48a?s=96&d=mm&r=g","contentUrl":"https:\/\/secure.gravatar.com\/avatar\/1b9d010cf1716692cb9c34f21554e07d17d461acaea5b61b8cb21cbec678d48a?s=96&d=mm&r=g","caption":"Andr\u00e9 Minhorst"}}]}},"_links":{"self":[{"href":"https:\/\/access-im-unternehmen.de\/data\/wp\/v2\/posts\/55000976","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/access-im-unternehmen.de\/data\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/access-im-unternehmen.de\/data\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/access-im-unternehmen.de\/data\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/access-im-unternehmen.de\/data\/wp\/v2\/comments?post=55000976"}],"version-history":[{"count":0,"href":"https:\/\/access-im-unternehmen.de\/data\/wp\/v2\/posts\/55000976\/revisions"}],"wp:attachment":[{"href":"https:\/\/access-im-unternehmen.de\/data\/wp\/v2\/media?parent=55000976"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/access-im-unternehmen.de\/data\/wp\/v2\/categories?post=55000976"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/access-im-unternehmen.de\/data\/wp\/v2\/tags?post=55000976"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}