{"id":55001054,"date":"2016-10-01T00:00:00","date_gmt":"2020-05-22T15:24:53","guid":{"rendered":"http:\/\/access-im-unternehmen.aix-dev.de\/aiu\/?p=1054"},"modified":"-0001-11-30T00:00:00","modified_gmt":"-0001-11-30T00:00:00","slug":"RDBMSZugriff_per_VBA_Verbindungen","status":"publish","type":"post","link":"https:\/\/access-im-unternehmen.de\/RDBMSZugriff_per_VBA_Verbindungen\/","title":{"rendered":"RDBMS-Zugriff per VBA: Verbindungen"},"content":{"rendered":"<p><img loading=\"lazy\" decoding=\"async\" src=\"http:\/\/vg09.met.vgwort.de\/na\/3673dc84a734441d84a8fbe96dba1a9c\" width=\"1\" height=\"1\" alt=\"\"><\/p>\n<p><b>Wenn Sie von Access aus auf die Daten einer SQL Server-Datenbank (und neuerdings auch auf LocalDB-Datenbanken) zugreifen wollen, m&uuml;ssen Sie mit Bordmitteln arbeiten, die h&auml;ufig nicht zufriedenstellend sind. Wir haben einen Satz von Tools entwickelt, mit denen Sie eine Reihe von Aufgaben sehr schnell erledigen k&ouml;nnen: Verbindungen definieren, Tabellen verkn&uuml;pfen und SQL-Abfragen direkt an den Server schicken. Dieser  Beitrag zeigt, wie Sie mithilfe eines Teils dieser Tools per VBA auf SQL Server und Co. zugreifen.<\/b><\/p>\n<p>Mal eben eine Auswahlabfrage oder Pass-Through-Abfrage per VBA an den SQL Server absetzen &#8211; das w&auml;re doch eine praktische Sache. <\/p>\n<p>Sie werden an verschiedenen Stellen per VBA auf die Tabellen der SQL Server-Datenbank zugreifen m&uuml;ssen &#8211; sei es, um eine ODBC-Verkn&uuml;pfung herzustellen oder zu aktualisieren, das Ergebnis einer gespeicherten Abfrage abzurufen oder eine solche auszuf&uuml;hren oder auch um ein Recordset auf Basis einer gespeicherten Prozedur einem Formular oder einem Steuerelement zuzuweisen. Alles, was Sie wissen m&uuml;ssen, um dies zu erledigen, erfahren Sie in diesem Beitrag.<\/p>\n<h2>Beispieldatenbank<\/h2>\n<p>Als Beispieldatenbank verwenden wir die Datenbank <b>Suedsturm.mdf<\/b>, die Sie wie im Beitrag <b>Access und LocalDB <\/b>(<b>www.access-im-unternehmen.de\/1057<\/b>) beschrieben nutzen k&ouml;nnen. Alternativ k&ouml;nnen Sie diese nat&uuml;rlich auch per SQL Server nutzen. Die Tools, mit denen Sie die in diesem Beitrag verwendeten Verbindungszeichenfolgen zusammenstellen k&ouml;nnen, stellen wir im Beitrag <b>SQL Server-Tools <\/b>(<b>www.access-im-unternehmen.de\/1061<\/b>) in der n&auml;chsten Ausgabe vor.<\/p>\n<h2>Verbindungszeichenfolgen<\/h2>\n<p>Als Erstes ben&ouml;tigen Sie Zugriff auf die SQL Server-Datenbank. Voraussetzung daf&uuml;r ist eine geeignete Verbindungszeichenfolge. Bei den Verbindungszeichenfolgen gibt es verschiedene Ans&auml;tze.<\/p>\n<p>Sie sind relativ flexibel, wenn Sie die notwendigen Informationen in einer lokalen Tabelle im Access-Frontend speichern und von Access aus per VBA darauf zugreifen, um Verbindungszeichen-fol-gen daraus zu erstellen. Alternativ k&ouml;nnen Sie Verbindungszeichenfolgen in einer DSN-Datei oder als System-DSN in der Registry speichern &#8211; wir gehen an dieser Stelle jedoch auf die Variante der tabellenbasierten Verbindungszeichenfolge ein. Die notwendigen Daten speichern wir in den Beispieldatenbanken in einer Tabelle namens <b>tblVerbindungszeichenfolgen<\/b> (s. Bild 1). Diese Tabelle haben Sie bereits im Beitrag <b>RDBMS-Tools: Verbindungen verwalten <\/b>(<b>www.access-im-unternehmen.de\/976<\/b>) kennengelernt.<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2016_05\/pic_1054_001.png\" alt=\"Entwurf der Tabelle zum Speichern der Verbindungszeichenfolgen\" width=\"499,5594\" height=\"514,8\" \/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 1: Entwurf der Tabelle zum Speichern der Verbindungszeichenfolgen<\/span><\/b><\/p>\n<p>Au&szlig;erdem ben&ouml;tigen wir eine Tabelle namens <b>tblTreiber<\/b>, welche die Daten der g&auml;ngigen Treiber enth&auml;lt (s. Bild 2). Die Tabelle <b>tblVerbindungszeichenfolgen <\/b>ist &uuml;ber das Fremdschl&uuml;sselfeld <b>TreiberID <\/b>mit der Tabelle <b>tblTreiber <\/b>verkn&uuml;pft.<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2016_05\/pic_1054_002.png\" alt=\"Entwurf der Tabelle zum Speichern der Treiber\" width=\"499,5594\" height=\"403,1371\"\/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 2: Entwurf der Tabelle zum Speichern der Treiber<\/span><\/b><\/p>\n<p>In der Beispielanwendung verwenden wir die Prozedur aus Listing 1, um eine Verbindungszeichen-folge aus den Daten der Tabelle <b>tblVerbindungszeichenfolgen <\/b>zu ermitteln.<\/p>\n<pre><span style=\"color:blue;\">Public Function <\/span>VerbindungszeichenfolgeNachID(lngVerbindungszeichenfolgeID<span style=\"color:blue;\"> As Long<\/span>, _\r\n         <span style=\"color:blue;\">Optional<\/span> bolZugangsdatenAusVariablen<span style=\"color:blue;\"> As Boolean<\/span>)<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>, strTreiber<span style=\"color:blue;\"> As String<\/span>, strServer<span style=\"color:blue;\"> As String<\/span>, strDatenbank<span style=\"color:blue;\"> As String<\/span>\r\n     <span style=\"color:blue;\">Set<\/span> db = CurrentDb\r\n     <span style=\"color:blue;\">Set<\/span> rst = db.OpenRecordset(\"SELECT * FROM tblVerbindungszeichenfolgen WHERE VerbindungszeichenfolgeID = \" _\r\n         & lngVerbindungszeichenfolgeID)\r\n     strTreiber = DLookup(\"Treiber\", \"tblTreiber\", \"TreiberID = \" & rst!TreiberID)\r\n     strServer = rst!Server\r\n     strDatenbank = rst!Datenbank\r\n     strTemp = \"ODBC;DRIVER={\" & strTreiber & \"};\" & \"SERVER=\" & strServer & \";\" _\r\n         & \"DATABASE=\" & strDatenbank & \";\"\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!Benutzername, \"\")) &gt; 0 And bolZugangsdatenAusVariablen = <span style=\"color:blue;\">False<\/span><span style=\"color:blue;\"> Then<\/span>\r\n             strBenutzername = 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>(Nz(rst!Kennwort, \"\")) &gt; 0 And bolZugangsdatenAusVariablen = <span style=\"color:blue;\">False<\/span><span style=\"color:blue;\"> Then<\/span>\r\n             strKennwort = rst!Kennwort\r\n         <span style=\"color:blue;\">End If<\/span>\r\n         strTemp = strTemp & \"UID=\" & strBenutzername & \";\"\r\n         strTemp = strTemp & \"PWD=\" & strKennwort\r\n     <span style=\"color:blue;\">End If<\/span>\r\n     VerbindungszeichenfolgeNachID = strTemp\r\n<span style=\"color:blue;\">End Function<\/span><\/pre>\n<p><b><span style=\"color:darkgrey;\">Listing 1: Ermitteln einer Verbindungszeichenfolge aus der Tabelle tblVerbindungszeichenfolgen<\/span><\/b><\/p>\n<p>Die Funktion arbeitet direkt mit der Tabelle <b>tblVerbindungszeichenfolgen<\/b>, in der die Verbindungsprarameter gespeichert sind. Dabei liest sie den Datensatz der Tabelle <b>tblVerbindungszeichenfolgen <\/b>ein, dessen Prim&auml;r-schl&uuml;s-selwert dem mit dem Parameter <b>lngVerbindungszeichenfolgeID <\/b>&uuml;bergebenen Wert entspricht. Der zweite Parameter der Funktion hei&szlig;t <b>bolZugangsdatenAusVariablen <\/b>und legt fest, ob auf jeden Fall die Zugangsdaten aus den beiden Variablen <b>strBenutzername <\/b>und <b>strKennwort <\/b>verwendet werden sollen. Dies ben&ouml;tigen wir f&uuml;r einen Aufruf aus der sp&auml;ter erl&auml;uterten Funktion <b>VerbindungTesten<\/b>, die gegebenenfalls die Zugangsdaten vorher per Dialog abfragt und diese aus Sicherheitsgr&uuml;nden nur in den beiden Variablen <b>strBenutzername <\/b>und <b>strKennwort <\/b>speichert, aber nicht in der Tabelle.<\/p>\n<p>Es gibt zwei Variablen namens <b>strBenutzername<\/b> und <b>strKennwort<\/b>, die speziell f&uuml;r den Einsatz mit der SQL Server-Authentifizierung vorgesehen sind (oder auch f&uuml;r die Anmeldung an einem anderen SQL-Server-System wie MySQL mit der Anforderung von Benutzerdaten). In diesem Fall muss die Access-Anwendung die Benutzerdaten bereitstellen, um eine Verbindung herzustellen. Diese sollen aber nicht in der Datenbank gespeichert werden, da die Daten sonst f&uuml;r jedermann zug&auml;nglich w&auml;ren. Die Variablen sollen zuvor per Formular vom Benutzer einmalig pro Sitzung abgefragt und in entsprechenden Variablen gespeichert werden, die wie folgt deklariert werden:<\/p>\n<pre><span style=\"color:blue;\">Public <\/span>strBenutzername<span style=\"color:blue;\"> As String<\/span>\r\n<span style=\"color:blue;\">Public <\/span>strKennwort<span style=\"color:blue;\"> As String<\/span><\/pre>\n<p>Die Funktion <b>VerbindungszeichenfolgeNachID<\/b> pr&uuml;ft dann, ob die Tabelle eigene Werte f&uuml;r Benutzername und Kennwort enth&auml;lt, und tr&auml;gt diese gegebenenfalls in die Variablen <b>strBenutzername <\/b>und <b>strKennwort <\/b>ein. Danach setzt die Funktion die einzelnen Elemente dann zu einer Verbindungszeichen-folge zu-sammen. Abh&auml;ngig davon, ob die Windows-Authentifizierung oder SQL Server-Authentifizie-rung gew&auml;hlt wurde, erh&auml;lt die Verbindungszeichenfolge das Name-Wert-Paar <b>Trusted_Con-nec-tion=Yes<\/b>, anderenfalls die Benutzerdaten in der Form <b>UID=<Benutzername>;PWD=<Kenn-wort><\/b>. Woher die Werte der beiden Variablen <b>strBenutzername <\/b>beziehungsweise <b>strKennwort <\/b>kommen, haben wir ja weiter oben bereits erl&auml;utert.<\/p>\n<p>Aus dem obersten Eintrag der Tabelle <b>tblVerbindungszeichenfolgen<\/b> aus Bild 3 w&uuml;rde die Funktion mit dem Wert <b>9 <\/b>als Parameter etwa folgendes Ergebnis liefern:<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2016_05\/pic_1054_003.png\" alt=\"Tabelle mit den Daten einer Verbindungszeichenfolge\" width=\"700\" height=\"249,7895\" \/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 3: Tabelle mit den Daten einer Verbindungszeichenfolge<\/span><\/b><\/p>\n<pre>  VerbindungszeichenfolgeNachID(9)\r\nODBC;DRIVER={ODBC Driver 11 for SQL Server};SERVER=(localdb)\\MSSQLLocalDB;DATABASE=Suedsturm;Trusted_Connection=Yes<\/pre>\n<h2>Standardverbindungszeichenfolge<\/h2>\n<p>In der Tabelle <b>tblVerbindungszeichenfolgen <\/b>finden Sie auch ein <b>Boolean<\/b>-Feld namens <b>Aktiv<\/b>. Dieses legt fest, welche Verbindungszeichenfolge f&uuml;r die aktuelle Datenbank standardm&auml;&szlig;ig verwendet werden soll.<\/p>\n<p>Der generelle Vorteil des Speicherns der Daten f&uuml;r die Verbindungszeichenfolge in einer Tabelle ist, dass Sie diese bei Bedarf einfach &auml;ndern k&ouml;nnen. Der zweite Vorteil ist: Sie k&ouml;nnen auch mehrere Verbindungszeichenfolgen angeben und zwischen diesen Zeichenfolgen wechseln. Genau dies erm&ouml;glicht das Feld <b>Aktiv<\/b>.<\/p>\n<p>W&auml;hrend Sie nun mit der Funktion <b>VerbindungszeichenfolgeNachID <\/b>immer die ID der aktuell ben&ouml;tigten Verbindungszeichenfolge angeben m&uuml;ssen, erm&ouml;glicht die Funktion <b>Standardverbindungszeichenfolge<\/b>, direkt die als <b>Aktiv <\/b>markierte Verbindungszeichenfolge zu ermitteln (s. Listing 2).<\/p>\n<pre><span style=\"color:blue;\">Public Function <\/span>Standardverbindungszeichenfolge()<span style=\"color:blue;\"> As String<\/span>\r\n     <span style=\"color:blue;\">Dim <\/span>lngAktivID<span style=\"color:blue;\"> As Long<\/span>\r\n     <span style=\"color:blue;\">If <\/span><span style=\"color:blue;\">Not<\/span> lngAktivID = 0<span style=\"color:blue;\"> Then<\/span>\r\n         Standardverbindungszeichenfolge = VerbindungszeichenfolgeNachID(lngAktivID)\r\n     <span style=\"color:blue;\">Else<\/span>\r\n         <span style=\"color:blue;\">MsgBox<\/span> \"Achtung: Es ist keine Verbindungszeichenfolge als aktiv gekennzeichnet.\"\r\n     <span style=\"color:blue;\">End If<\/span>\r\n<span style=\"color:blue;\">End Function<\/span><\/pre>\n<p><!--30percent--><\/p>\n<p><b><span style=\"color:darkgrey;\">Listing 2: Ermitteln der Standardverbindungszeichenfolge aus der Tabelle tblVerbindungszeichenfolgen<\/span><\/b><\/p>\n<p>Die Funktion ermittelt per <b>DLookup<\/b>-Funktion den ersten Eintrag der Tabelle <b>tblVerbindungszei-chen-folgen<\/b>, dessen Feld <b>Aktiv <\/b>den Wert <b>True <\/b>aufweist. Dieser wird dann der Funktion <b>Ver-bin-dungs-zeichenfolgeNachID <\/b>&uuml;bergeben, um die entsprechende Verbindungszeichenfolge zu ermitteln. Sollte keine Verbindungszeichenfolge als aktiv markiert sein, erscheint eine entsprechende Mel-dung.<\/p>\n<p>Wenn hingegen mehr als eine Verbindungszeichenfolge den Wert <b>True <\/b>im Feld <b>Aktiv <\/b>enth&auml;lt, liefert die Funktion die Verbindungszeichenfolge f&uuml;r den ersten markierten Eintrag zur&uuml;ck.<\/p>\n<h2>ID der aktiven Verbindungszeichenfolge ermitteln<\/h2>\n<p>Andere Routinen erwarten gegebenenfalls die ID der zu verwendenden Verbindungszeichenfolge. Wenn Sie nicht explizit einen Wert des Feldes <b>VerbindungszeichenfolgeID<\/b> der Tabelle <b>tblVerbindungszeichenfolgen <\/b>&uuml;bergeben m&ouml;chten, k&ouml;nnen Sie mit der Funktion aus Listing 3 den Wert f&uuml;r den aktiven Datensatz ermitteln.<\/p>\n<pre><span style=\"color:blue;\">Public Function <\/span>AktiveVerbindungszeichenfolgeID()<span style=\"color:blue;\"> As Long<\/span>\r\n     <span style=\"color:blue;\">Dim <\/span>lngAktivID<span style=\"color:blue;\"> As Long<\/span>\r\n     lngAktivID = Nz(DLookup(\"VerbindungszeichenfolgeID\", \"tblVerbindungszeichenfolgen\", \"Aktiv = True\"), 0)\r\n     <span style=\"color:blue;\">If <\/span>lngAktivID = 0<span style=\"color:blue;\"> Then<\/span>\r\n         <span style=\"color:blue;\">MsgBox<\/span> \"Achtung: Es ist keine Verbindungszeichenfolge als aktiv gekennzeichnet.\"\r\n     <span style=\"color:blue;\">End If<\/span>\r\n     AktiveVerbindungszeichenfolgeID = lngAktivID\r\n<span style=\"color:blue;\">End Function<\/span><\/pre>\n<p><b><span style=\"color:darkgrey;\">Listing 3: Ermitteln der ID der Standardverbindungszeichenfolge aus der Tabelle tblVerbindungszeichenfolgen<\/span><\/b><\/p>\n<p>Auch diese Funktion liefert eine Meldung, wenn keine aktive Verbindungszeichenfolge gefunden werden konnte.<\/p>\n<h2>Verbindung und Zugriffsdaten pr&uuml;fen<\/h2>\n<p>Aufbauend auf den vorherigen Funktionen wollen wir nun eine weitere Funktion einf&uuml;hren, die pr&uuml;ft, ob eine Verbindungszeichenfolge funktioniert. Diese hei&szlig;t <b>VerbindungTesten<\/b> (s. Listing 4). Die Funktion erledigt gleich drei Aufgaben:<\/p>\n<pre><span style=\"color:blue;\">Public Function <\/span>VerbindungTesten(lngVerbindungszeichenfolgeID<span style=\"color:blue;\"> As Long<\/span>, _\r\n         <span style=\"color:blue;\">Optional<\/span> strVerbindungszeichenfolge<span style=\"color:blue;\"> As String<\/span>)<span style=\"color:blue;\"> As Boolean<\/span>\r\n     <span style=\"color:blue;\">Dim <\/span>bolTrustedConnection<span style=\"color:blue;\"> As Boolean<\/span>\r\n     <span style=\"color:blue;\">Dim <\/span>bolVerbindungHergestellt<span style=\"color:blue;\"> As Boolean<\/span>\r\n     bolTrustedConnection = DLookup(\"TrustedConnection\", \"tblVerbindungszeichenfolgen\", \"VerbindungszeichenfolgeID = \" _\r\n         & lngVerbindungszeichenfolgeID)\r\n     strBenutzername = Nz(DLookup(\"Benutzername\", \"tblVerbindungszeichenfolgen\", \"VerbindungszeichenfolgeID = \" _\r\n         & lngVerbindungszeichenfolgeID), strBenutzername)\r\n     strKennwort = Nz(DLookup(\"Kennwort\", \"tblVerbindungszeichenfolgen\", \"VerbindungszeichenfolgeID = \" _\r\n         & lngVerbindungszeichenfolgeID), strKennwort)\r\n     <span style=\"color:blue;\">If <\/span>(<span style=\"color:blue;\">Len<\/span>(strBenutzername) * <span style=\"color:blue;\">Len<\/span>(strKennwort) = 0) And <span style=\"color:blue;\">Not<\/span> bolTrustedConnection<span style=\"color:blue;\"> Then<\/span>\r\n         <span style=\"color:blue;\">If <\/span>LogindatenErmitteln(lngVerbindungszeichenfolgeID) = <span style=\"color:blue;\">False<\/span><span style=\"color:blue;\"> Then<\/span>\r\n             <span style=\"color:blue;\">Exit Function<\/span>\r\n         <span style=\"color:blue;\">End If<\/span>\r\n     <span style=\"color:blue;\">End If<\/span>\r\n     strVerbindungszeichenfolge = VerbindungszeichenfolgeNachID(lngVerbindungszeichenfolgeID)\r\n     On Error Resume <span style=\"color:blue;\">Next<\/span>\r\n     bolVerbindungHergestellt = VerbindungHerstellen(strVerbindungszeichenfolge)\r\n     <span style=\"color:blue;\">Do While<\/span> <span style=\"color:blue;\">Not<\/span> bolVerbindungHergestellt\r\n         <span style=\"color:blue;\">MsgBox<\/span> \"Die Verbindung konnte nicht hergestellt werden.\"\r\n         <span style=\"color:blue;\">On Error GoTo<\/span> 0\r\n         <span style=\"color:blue;\">If <\/span><span style=\"color:blue;\">Not<\/span> bolTrustedConnection<span style=\"color:blue;\"> Then<\/span>\r\n             <span style=\"color:blue;\">If <\/span>LogindatenErmitteln(lngVerbindungszeichenfolgeID) = <span style=\"color:blue;\">True<\/span><span style=\"color:blue;\"> Then<\/span>\r\n                 strVerbindungszeichenfolge = VerbindungszeichenfolgeNachID(lngVerbindungszeichenfolgeID)\r\n                 bolVerbindungHergestellt = VerbindungHerstellen(strVerbindungszeichenfolge)\r\n             <span style=\"color:blue;\">Else<\/span>\r\n                 <span style=\"color:blue;\">Exit Function<\/span>\r\n             <span style=\"color:blue;\">End If<\/span>\r\n         <span style=\"color:blue;\">Else<\/span>\r\n             <span style=\"color:blue;\">Exit Function<\/span>\r\n         <span style=\"color:blue;\">End If<\/span>\r\n     <span style=\"color:blue;\">Loop<\/span>\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 4: Testen einer per VerbindungszeichenfolgeID angegebenen Verbindungszeichenfolge<\/span><\/b><\/p>\n<ul>\n<li>Sie testet die Verbindung und liefert einen <b>Boolean<\/b>-Wert zur&uuml;ck, der &uuml;ber das Ergebnis Auskunft gibt.<\/li>\n<li>Wenn die Verbindung SQL Server-Authentifizierung nutzt, soll zumindest das Kennwort nicht in der Verbindungszeichenfolge und auch nicht in der Tabelle <b>tblVerbindungszeichenfol-gen <\/b>enthalten sein. Die Funktion pr&uuml;ft die Verbindung f&uuml;r die verf&uuml;gbaren Werte von Be-nut-zername und Kennwort und zeigt ein Formular zur erneuten Eingabe oder Korrektur der Werte an, wenn damit keine Verbindung hergestellt werden konnte.<\/li>\n<li>Sie liefert, sofern daf&uuml;r beim Aufruf ein entsprechender Parameter festgelegt wurde, gleich die Verbindungszeichenfolge f&uuml;r diese Verbindung zur&uuml;ck.<\/li>\n<\/ul>\n<p>Die Funktion erwartet folgende Parameter:<\/p>\n<ul>\n<li><b>lngVerbindungszeichenfolgeID<\/b>: Prim&auml;rschl&uuml;sselwert der zu verwendenden Verbindung aus der Tabelle <b>tblVerbindungszeichenfolgen<\/b><\/li>\n<li><b>strVerbindungszeichenfolge<\/b>: R&uuml;ckgabeparameter, der die gepr&uuml;fte Verbindungszeichenfolge zur&uuml;ckgibt. Wenn nicht gew&uuml;nscht, kann dieser Parameter einfach weggelassen werden.<\/li>\n<\/ul>\n<p>Nun hat diese Funktion nicht nur die Aufgabe, einfach nur Verbindungen zu testen, sondern spe-ziell im Falle von Verbindungen auf Basis der SQL Server-Authentifizierung gleich noch eventuell fehlende Daten wie <b>Benutzername <\/b>oder <b>Kennwort <\/b>abzufragen.<\/p>\n<p>Diese sollen, sofern ermittelt, nat&uuml;rlich nicht etwa in die Tabelle <b>tblVerbindungszeichenfolgen <\/b>eingetragen werden, wo sie leicht abzugreifen w&auml;ren, sondern nur in globalen Variablen, die wie weiter oben bereits erl&auml;utert deklariert werden.<\/p>\n<h2>Testen der Verbindung<\/h2>\n<p>Die Funktion deklariert zun&auml;chst zwei Variable. <b>bolTrustedConnection <\/b>ermittelt, ob eine Ver-bin-dung mit Windows-Authentifizierung aufgebaut werden soll, <b>bolVerbindungHergestellt <\/b>nimmt das Ergebnis einer Funktion zum Herstellen der Verbindung auf.<\/p>\n<p><b>bolTrustedConnection <\/b>wird gleich zu Beginn mit dem entsprechenden Wert der Tabelle <b>tblVerbindungszeichenfolgen<\/b> gef&uuml;llt.<\/p>\n<p>Anschlie&szlig;end pr&uuml;ft die Funktion, ob die Felder <b>Benutzername <\/b>und <b>Kennwort <\/b>des betroffenen Datensatzes der Tabelle <b>tblVerbindungszeichenfolgen<\/b> Werte enthalten und tr&auml;gt diese gegebenenfalls f&uuml;r die beiden Variablen <b>strBenutzername <\/b>und <b>strKennwort <\/b>ein. Sollten <b>strBenutzername <\/b>und\/oder <b>strKennwort <\/b>danach immer noch leer sein, ruft die Routine eine weitere Funktion auf, die einen Dialog namens <b>frmLogin<\/b> zum Eingeben der fehlenden Daten anzeigt &#8211; mehr dazu weiter unten. Liefert dieser Dialog keine Anmeldedaten, weil der Benutzer diesen abbricht, wird die Funktion beendet und liefert den Wert <b>False <\/b>zur&uuml;ck. In diesem Fall wird die Funktion auch gleich verlassen, wobei als Ergebnis der Standardwert <b>False <\/b>zur&uuml;ckgegeben wird.<\/p>\n<p>Nun ermittelt die Funktion <b>VerbindungszeichenfolgeNachID <\/b>eine Verbindungszeichenfolge, und zwar auf Basis der ID der zu verwendenden Verbindung aus der Tabelle <b>tblVerbindungszeichenfolgen<\/b> und &#8211; sofern SQL-Server-Authentifizierung erforderlich ist &#8211; mithilfe der Werte aus <b>strBenutzername <\/b>und <b>strKennwort<\/b> beziehungsweise aus den entsprechenden Feldern der Tabelle <b>tblVerbindungszeichenfolgen<\/b>.<\/p>\n<h2>Verbindung herstellen<\/h2>\n<p>Dann folgt der Aufruf der Funktion <b>VerbindungHerstellen<\/b>. Diese pr&uuml;ft, ob mit dieser Verbindungszeichenfolge ein Zugriff auf die Datenbank m&ouml;glich ist, das Ergebnis landet in der Variablen <b>bolVerbindungHergestellt<\/b> (die Funktion <b>VerbindungHerstellen <\/b>schauen wir uns weiter unten an):<\/p>\n<pre>bolVerbindungHergestellt = VerbindungHerstellen(strVerbindungszeichenfolge)<\/pre>\n<p>Die folgende <b>Do While<\/b>-Schleife wird &uuml;berhaupt nur durchlaufen, wenn noch keine Verbindung mit den erfassten Daten hergestellt werden konnte, beispielsweise weil die Zugangsdaten nicht korrekt eingegeben wurden. Sollte die Verbindung hergestellt worden sein, ist <b>bolVerbindungHergestellt <\/b>gleich <b>True <\/b>und die Abbruchbedingung direkt erf&uuml;llt und die Funktion wird mit dem R&uuml;ckgabewert <b>True <\/b>beendet.<\/p>\n<p>Sollte der Benutzer jedoch noch nicht die korrekten Daten eingegeben haben, beginnt der Durchlauf der <b>Do While<\/b>-Schleife. Diese gibt zun&auml;chst eine Meldung aus, dass der erste Versuch nicht gelungen ist. Dann pr&uuml;ft die Funktion, ob es sich um Windows-Authentifizierung oder SQL Server-Authentifizierung handelt. Im ersteren Fall l&auml;sst sich das Problem an dieser Stelle nicht beheben, die Funktion endet mit dem R&uuml;ckgabewert <b>False<\/b>. Bei SQL Server-Authentifizierung erscheint ebenfalls die Meldung, der Benutzer kann jedoch den Benutzernamen korrigieren.<\/p>\n<p>Beim Verbinden k&ouml;nnen beispielsweise die folgenden Probleme auftreten:<\/p>\n<ul>\n<li>Der Name des SQL Servers ist falsch beziehungsweise der SQL Server nicht verf&uuml;gbar. Es dauert eine Weile, bis dieser Fehler auftritt.<\/li>\n<li>Der Name der Datenbank ist falsch beziehungsweise die Datenbank ist nicht vorhanden.<\/li>\n<li>Bei der Windows-Authentifizierung greift ein Benutzer ohne ausreichende Berechtigungen\/Benutzerkonto auf die Datenbank zu. Dies l&ouml;st einen Fehler aus, bei dem im Anschluss der eingebaute Verbindungsdialog zur Korrektur der Verbindungsdaten angezeigt wird.<\/li>\n<li>Bei der SQL Server-Authentifizierung stimmen die Anmeldedaten (Benutzername und Kenn-wort) nicht. Dies l&ouml;st einen Fehler aus, der abgefangen werden kann. Wichtig: Dies gelingt nur, wenn die Parameter <b>USR <\/b>und <b>PWD <\/b>in der Verbindungszeichenfolge vorhanden sind (<b>&#8230;;USR=;PWD= <\/b>reicht aus). Fehlen die Daten, erscheint wiederum der eingebaute An-mel-de-dialog.<\/li>\n<\/ul>\n<p>In den meisten F&auml;llen liefert der Treiber jedoch nur einen wagen Hinweis auf den Fehler. Eine genaue Ermittlung des Problems w&uuml;rde hier den Rahmen sprengen.<\/p>\n<h2>Login-Formular<\/h2>\n<p>Die Funktion <b>LoginDatenErmitteln<\/b>, die von der Funktion <b>VerbindungTesten <\/b>aufgerufen wird, wenn weder die Variablen <b>strBenutzername <\/b>und <b>strKennwort <\/b>noch die entsprechenden Felder der Tabelle <b>tblVerbindungszeichenfolgen <\/b>einen Zugriff erm&ouml;glichen, &ouml;ffnet das Formular <b>frmLogin<\/b> und &uuml;bergibt als &ouml;ffnungs-ar-gu-ment die ID der zu verwendenden Verbindungszeichenfolge (s. Listing 5). Der Code dieser Funktion wird nach dem &ouml;ffnen des Formulars so lange angehalten, bis der Benutzer das Formular mit der Schaltfl&auml;che <b>OK <\/b>unsichtbar macht oder es mit <b>Abbrechen <\/b>schlie&szlig;t. Danach pr&uuml;ft die Funktion, ob das Formular noch ge&ouml;ffnet, aber unsichtbar ist, und liest in diesem Fall die eingegebenen Anmeldedaten in die beiden Variablen <b>strBenutzername <\/b>und <b>strKennwort <\/b>ein. Schlie&szlig;lich schlie&szlig;t sie das Formular endg&uuml;ltig und liefert den Wert <b>True <\/b>als R&uuml;ckgabewert.<\/p>\n<pre><span style=\"color:blue;\">Public Function <\/span>LogindatenErmitteln(lngVerbindungszeichenfolgeID)<span style=\"color:blue;\"> As Boolean<\/span>\r\n     DoCmd.OpenForm \"frmLogin\", WindowMode:=acDialog, OpenArgs:=lngVerbindungszeichenfolgeID\r\n     <span style=\"color:blue;\">If <\/span>IstFormularGeoeffnet(\"frmLogin\")<span style=\"color:blue;\"> Then<\/span>\r\n         strBenutzername = Forms!frmLogin!txtBenutzername\r\n         strKennwort = Forms!frmLogin!txtKennwort\r\n         DoCmd.Close acForm, \"frmLogin\"\r\n         LogindatenErmitteln = <span style=\"color:blue;\">True<\/span>\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: Funktion zum &ouml;ffnen und Ermitteln der Zugangsdaten f&uuml;r eine Verbindung mittels Dialog<\/span><\/b><\/p>\n<p>Das Formular sieht im Entwurf wie in Bild 4 aus.<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2016_05\/pic_1054_004.png\" alt=\"Das Login-Formular in der Entwurfsansicht\" width=\"599,4715\" height=\"353,2762\" \/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 4: Das Login-Formular in der Entwurfsansicht<\/span><\/b><\/p>\n<p>Damit das Formular beim &ouml;ffnen gleich die in der Tabelle <b>tblVerbindungszeichenfolgen<\/b> enthaltenen Anmeldedaten in den beiden Textfeldern anzeigt, l&ouml;st es die Ereignisprozedur aus Listing 6 aus.<\/p>\n<pre><span style=\"color:blue;\">Private Sub <\/span>Form_Open(Cancel<span style=\"color:blue;\"> As Integer<\/span>)\r\n     <span style=\"color:blue;\">Dim <\/span>strVerbindungszeichenfolge<span style=\"color:blue;\"> As String<\/span>\r\n     lngVerbindungszeichenfolgeID = Nz(Me.OpenArgs)\r\n     <span style=\"color:blue;\">If <\/span>lngVerbindungszeichenfolgeID = 0<span style=\"color:blue;\"> Then<\/span>\r\n         lngVerbindungszeichenfolgeID = StandardverbindungszeichenfolgeID\r\n     <span style=\"color:blue;\">End If<\/span>\r\n     Me!txtBenutzername = Nz(DLookup(\"Benutzername\", \"tblVerbindungszeichenfolgen\", \"VerbindungszeichenfolgeID = \" _\r\n         & lngVerbindungszeichenfolgeID), strBenutzername)\r\n     Me!txtKennwort = Nz(DLookup(\"Kennwort\", \"tblVerbindungszeichenfolgen\", \"VerbindungszeichenfolgeID = \" _\r\n         & lngVerbindungszeichenfolgeID), strKennwort)\r\n<span style=\"color:blue;\">End Sub<\/span><\/pre>\n<p><b><span style=\"color:darkgrey;\">Listing 6: Ereignisprozedur, die beim &ouml;ffnen des Login-Formulars ausgel&ouml;st wird<\/span><\/b><\/p>\n<p>Die Prozedur schreibt die per &ouml;ffnungsargument &uuml;bergebene <b>VerbindungszeichenfolgeID<\/b> in eine entsprechende Variable. Sollte <b>lngVerbindungszeichenfolgeID <\/b>den Wert <b>0 <\/b>erhalten, weil kein Wert mit dem &ouml;ffnungsargument &uuml;bergeben wurde, ermittelt die Prozedur mit der Funktion <b>StandardverbindungszeichenfolgeID <\/b>die ID der als aktiv markierten Verbindungszeichenfolge. Die ID wird nachfolgend im Kriterium zweier <b>DLookup<\/b>-Aufrufe eingesetzt, um Benutzername und Kennwort des entsprechenden Eintrags der Tabelle <b>tblVerbindungs-zei-chen-folgen <\/b>zu ermitteln. Sollten diese Eintr&auml;ge leer sein, verwendet die Prozedur die in den Variablen <b>strBenutzername <\/b>und <b>strKennwort <\/b>gespeicherten Zugangsdaten.<\/p>\n<h2>Herstellen einer Verbindung<\/h2>\n<p>Die Funktion <b>VerbindungHerstellen <\/b>erwartet die Verbindungszeichenfolge als Parameter. Sie erstellt ein neues tempor&auml;res <b>QueryDef<\/b>-Objekt und weist diesem die Verbindungszeichenfolge sowie eine Dummy-Abfrage (hier <b>SELECT 1 AS Test<\/b>) zu (s. Listing 7). Au&szlig;erdem erh&auml;lt die Eigenschaft <b>ReturnsRecords <\/b>den Wert <b>True<\/b>. Nach einer tempor&auml;ren Deaktivierung der eingebauten Fehlerbehandlung versucht sie dann, die Abfrage mit der <b>OpenRecordset<\/b>-Methode des <b>QueryDef<\/b>-Objekts auszuf&uuml;hren. Sollte dies keinen Fehler liefern, war der Verbindungsaufbau erfolgreich und die Funktion liefert den Wert <b>True <\/b>zur&uuml;ck.<\/p>\n<pre><span style=\"color:blue;\">Public Function <\/span>VerbindungHerstellen(strVerbindungszeichenfolge<span style=\"color:blue;\"> As String<\/span>)<span style=\"color:blue;\"> As Long<\/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>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         .ReturnsRecords = <span style=\"color:blue;\">True<\/span>\r\n         .SQL = \"SELECT 1 AS Test\"\r\n         On Error Resume <span style=\"color:blue;\">Next<\/span>\r\n         .OpenRecordset\r\n         <span style=\"color:blue;\">If <\/span>Err.Number = 0<span style=\"color:blue;\"> Then<\/span>\r\n             VerbindungHerstellen = <span style=\"color:blue;\">True<\/span>\r\n         <span style=\"color:blue;\">End If<\/span>\r\n         <span style=\"color:blue;\">On Error GoTo<\/span> 0\r\n     End <span style=\"color:blue;\">With<\/span>\r\n<span style=\"color:blue;\">End Function<\/span><\/pre>\n<p><b><span style=\"color:darkgrey;\">Listing 7: Diese Funktion baut eine testweise Verbindung zur SQL Server-Datenbank auf.<\/span><\/b><\/p>\n<h2>Verwendung dieser Funktionen<\/h2>\n<p>Die Funktion <b>VerbindungTesten<\/b> pr&uuml;ft nicht nur, ob der Zugriff auf die Tabellen der SQL Server-Datenbank gelingt, sondern liefert auch gleich noch die korrekte Verbindungszeichenfolge zur&uuml;ck. Mit dieser Zeichenfolge im Gep&auml;ck k&ouml;nnen Sie gleich einige wichtige Schritte durchf&uuml;hren, die Probleme mit dem Zugriff auf eingebundene Objekte wie per ODCB verkn&uuml;pfte Tabellen oder Pass-Through-Abfragen verhindern.<\/p>\n<p>Im Falle der verkn&uuml;pften Tabellen treten Probleme auf, wenn Sie diese unter Windows-Au-then-ti-fizierung eingebunden haben und der Kunde dann per SQL Server-Authentifizierung darauf zugreifen will &#8211; dies zeigt wiederum den eingebauten Anmeldedialog an. Andersherum verh&auml;lt es sich ebenso.<\/p>\n<p>Steht also ein Wechsel zwischen den beiden Authentifizierungsarten an, ist ein erneutes Ein-bin-den aller Tabellen n&ouml;tig. Haben Sie die Tabellen unter SQL Server-Au-then-ti-fi-zie-rung eingebunden und melden sich dann unter einem anderen SQL Server-Account an, greifen Sie automatisch unter diesem Account auf die Tabellen zu.<\/p>\n<p>Den Unterschied machen die in der Systemtabelle <b>MSysObjects <\/b>gespeicherten Verbindungseigenschaften.<\/p>\n<p>Enthalten diese den Ausdruck <b>Trusted_Connection=Yes<\/b>, k&ouml;nnen Sie mit Windows-Au-then-ti-fi-zierung darauf zugreifen, sonst nur mit SQL Server-Authentifizierung. Alternativ m&uuml;ssen Sie die Ver-kn&uuml;pfungen aktualisieren. Dies ist dank der Funktion <b>VerknuepfungErstellen <\/b>aus dem Beitrag <b>Tabellen per VBA verkn&uuml;pfen<\/b> (<b>www.access-im-unternehmen.de\/974<\/b>) zwar auch kein Problem, je nach Anzahl der eingebundenen Ta-bel-len kann dieser Vor-gang jedoch entsprechend Zeit beanspruchen.<\/p>\n<p>Pass-Through-Abfragen sollten Sie grunds&auml;tzlich beim Starten der Anwendung mit der aktuellen Verbindungszeichenfolge ausstatten, bei SQL Server-Authentifizierung allerdings ohne Angabe des Kennwortes &#8211; dieses k&ouml;nnte sonst einfach ausgelesen werden. Dies beschreiben wir im Beitrag <b>RDBMS per VBA: Daten abfragen <\/b>(<b>www.access-im-unternehmen.de\/1062<\/b>) in der n&auml;chsten Ausgabe.<\/p>\n<h2>Zusammenfassung und Ausblick<\/h2>\n<p>Dieser Beitrag hat Funktionen geliefert, mit denen Sie Verbindungen zum SQL Server und anderen RDBMS aufbauen k&ouml;nnen. In weiteren Teilen dieser Beitragsreihe erfahren Sie, wie Sie auf Basis der hier vorgestellten Grundlagen Pass-Through-Abfragen erstellen, Tabellen verkn&uuml;pfen, Recordsets f&uuml;llen oder Aktionsabfragen ausf&uuml;hren.<\/p>\n<h3>Downloads zu diesem Beitrag<\/h3>\n<p>Enthaltene Beispieldateien:<\/p>\n<p>RDBMSPerVBA_Verbindungen.accdb<\/p>\n<p><a href=\"..\/fileadmin\/beispiele\/C85C309B-93ED-4570-852B-182113B33798\/aiu_1054.zip\">Download<\/a><\/p>\n","protected":false},"excerpt":{"rendered":"<p>Wenn Sie von Access aus auf die Daten einer SQL Server-Datenbank (und neuerdings auch auf LocalDB-Datenbanken) zugreifen wollen, m&uuml;ssen Sie mit Bordmitteln arbeiten, die h&auml;ufig nicht zufriedenstellend sind. Wir haben einen Satz von Tools entwickelt, mit denen Sie eine Reihe von Aufgaben sehr schnell erledigen k&ouml;nnen: Verbindungen definieren, Tabellen verkn&uuml;pfen und SQL-Abfragen direkt an den Server schicken. Dieser  Beitrag zeigt, wie Sie mithilfe eines Teils dieser Tools per VBA auf SQL Server und Co. zugreifen.<\/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":[662016,66052016,44000022],"tags":[],"class_list":["post-55001054","post","type-post","status-publish","format-standard","hentry","category-662016","category-66052016","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-Zugriff per VBA: Verbindungen - 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\/RDBMSZugriff_per_VBA_Verbindungen\/\" \/>\n<meta property=\"og:locale\" content=\"de_DE\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"RDBMS-Zugriff per VBA: Verbindungen\" \/>\n<meta property=\"og:description\" content=\"Wenn Sie von Access aus auf die Daten einer SQL Server-Datenbank (und neuerdings auch auf LocalDB-Datenbanken) zugreifen wollen, m&uuml;ssen Sie mit Bordmitteln arbeiten, die h&auml;ufig nicht zufriedenstellend sind. Wir haben einen Satz von Tools entwickelt, mit denen Sie eine Reihe von Aufgaben sehr schnell erledigen k&ouml;nnen: Verbindungen definieren, Tabellen verkn&uuml;pfen und SQL-Abfragen direkt an den Server schicken. Dieser Beitrag zeigt, wie Sie mithilfe eines Teils dieser Tools per VBA auf SQL Server und Co. zugreifen.\" \/>\n<meta property=\"og:url\" content=\"https:\/\/access-im-unternehmen.de\/RDBMSZugriff_per_VBA_Verbindungen\/\" \/>\n<meta property=\"og:site_name\" content=\"Access im Unternehmen\" \/>\n<meta property=\"article:published_time\" content=\"2020-05-22T15:24:53+00:00\" \/>\n<meta property=\"og:image\" content=\"http:\/\/vg09.met.vgwort.de\/na\/3673dc84a734441d84a8fbe96dba1a9c\" \/>\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=\"15\u00a0Minuten\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\\\/\\\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/RDBMSZugriff_per_VBA_Verbindungen\\\/#article\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/RDBMSZugriff_per_VBA_Verbindungen\\\/\"},\"author\":{\"name\":\"Andr\u00e9 Minhorst\",\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/#\\\/schema\\\/person\\\/13395c4bcd7d7963efe33be9c584d93f\"},\"headline\":\"RDBMS-Zugriff per VBA: Verbindungen\",\"datePublished\":\"2020-05-22T15:24:53+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/RDBMSZugriff_per_VBA_Verbindungen\\\/\"},\"wordCount\":2606,\"commentCount\":0,\"publisher\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/#organization\"},\"image\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/RDBMSZugriff_per_VBA_Verbindungen\\\/#primaryimage\"},\"thumbnailUrl\":\"http:\\\/\\\/vg09.met.vgwort.de\\\/na\\\/3673dc84a734441d84a8fbe96dba1a9c\",\"articleSection\":[\"2016\",\"5\\\/2016\",\"SQL Server und Co.\"],\"inLanguage\":\"de\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\\\/\\\/access-im-unternehmen.de\\\/RDBMSZugriff_per_VBA_Verbindungen\\\/#respond\"]}]},{\"@type\":\"WebPage\",\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/RDBMSZugriff_per_VBA_Verbindungen\\\/\",\"url\":\"https:\\\/\\\/access-im-unternehmen.de\\\/RDBMSZugriff_per_VBA_Verbindungen\\\/\",\"name\":\"RDBMS-Zugriff per VBA: Verbindungen - Access im Unternehmen\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/RDBMSZugriff_per_VBA_Verbindungen\\\/#primaryimage\"},\"image\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/RDBMSZugriff_per_VBA_Verbindungen\\\/#primaryimage\"},\"thumbnailUrl\":\"http:\\\/\\\/vg09.met.vgwort.de\\\/na\\\/3673dc84a734441d84a8fbe96dba1a9c\",\"datePublished\":\"2020-05-22T15:24:53+00:00\",\"breadcrumb\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/RDBMSZugriff_per_VBA_Verbindungen\\\/#breadcrumb\"},\"inLanguage\":\"de\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\\\/\\\/access-im-unternehmen.de\\\/RDBMSZugriff_per_VBA_Verbindungen\\\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"de\",\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/RDBMSZugriff_per_VBA_Verbindungen\\\/#primaryimage\",\"url\":\"http:\\\/\\\/vg09.met.vgwort.de\\\/na\\\/3673dc84a734441d84a8fbe96dba1a9c\",\"contentUrl\":\"http:\\\/\\\/vg09.met.vgwort.de\\\/na\\\/3673dc84a734441d84a8fbe96dba1a9c\"},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/RDBMSZugriff_per_VBA_Verbindungen\\\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\\\/\\\/access-im-unternehmen.de\\\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"RDBMS-Zugriff per VBA: Verbindungen\"}]},{\"@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-Zugriff per VBA: Verbindungen - 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\/RDBMSZugriff_per_VBA_Verbindungen\/","og_locale":"de_DE","og_type":"article","og_title":"RDBMS-Zugriff per VBA: Verbindungen","og_description":"Wenn Sie von Access aus auf die Daten einer SQL Server-Datenbank (und neuerdings auch auf LocalDB-Datenbanken) zugreifen wollen, m&uuml;ssen Sie mit Bordmitteln arbeiten, die h&auml;ufig nicht zufriedenstellend sind. Wir haben einen Satz von Tools entwickelt, mit denen Sie eine Reihe von Aufgaben sehr schnell erledigen k&ouml;nnen: Verbindungen definieren, Tabellen verkn&uuml;pfen und SQL-Abfragen direkt an den Server schicken. Dieser Beitrag zeigt, wie Sie mithilfe eines Teils dieser Tools per VBA auf SQL Server und Co. zugreifen.","og_url":"https:\/\/access-im-unternehmen.de\/RDBMSZugriff_per_VBA_Verbindungen\/","og_site_name":"Access im Unternehmen","article_published_time":"2020-05-22T15:24:53+00:00","og_image":[{"url":"http:\/\/vg09.met.vgwort.de\/na\/3673dc84a734441d84a8fbe96dba1a9c","type":"","width":"","height":""}],"author":"Andr\u00e9 Minhorst","twitter_card":"summary_large_image","twitter_misc":{"Verfasst von":"Andr\u00e9 Minhorst","Gesch\u00e4tzte Lesezeit":"15\u00a0Minuten"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/access-im-unternehmen.de\/RDBMSZugriff_per_VBA_Verbindungen\/#article","isPartOf":{"@id":"https:\/\/access-im-unternehmen.de\/RDBMSZugriff_per_VBA_Verbindungen\/"},"author":{"name":"Andr\u00e9 Minhorst","@id":"https:\/\/access-im-unternehmen.de\/#\/schema\/person\/13395c4bcd7d7963efe33be9c584d93f"},"headline":"RDBMS-Zugriff per VBA: Verbindungen","datePublished":"2020-05-22T15:24:53+00:00","mainEntityOfPage":{"@id":"https:\/\/access-im-unternehmen.de\/RDBMSZugriff_per_VBA_Verbindungen\/"},"wordCount":2606,"commentCount":0,"publisher":{"@id":"https:\/\/access-im-unternehmen.de\/#organization"},"image":{"@id":"https:\/\/access-im-unternehmen.de\/RDBMSZugriff_per_VBA_Verbindungen\/#primaryimage"},"thumbnailUrl":"http:\/\/vg09.met.vgwort.de\/na\/3673dc84a734441d84a8fbe96dba1a9c","articleSection":["2016","5\/2016","SQL Server und Co."],"inLanguage":"de","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/access-im-unternehmen.de\/RDBMSZugriff_per_VBA_Verbindungen\/#respond"]}]},{"@type":"WebPage","@id":"https:\/\/access-im-unternehmen.de\/RDBMSZugriff_per_VBA_Verbindungen\/","url":"https:\/\/access-im-unternehmen.de\/RDBMSZugriff_per_VBA_Verbindungen\/","name":"RDBMS-Zugriff per VBA: Verbindungen - Access im Unternehmen","isPartOf":{"@id":"https:\/\/access-im-unternehmen.de\/#website"},"primaryImageOfPage":{"@id":"https:\/\/access-im-unternehmen.de\/RDBMSZugriff_per_VBA_Verbindungen\/#primaryimage"},"image":{"@id":"https:\/\/access-im-unternehmen.de\/RDBMSZugriff_per_VBA_Verbindungen\/#primaryimage"},"thumbnailUrl":"http:\/\/vg09.met.vgwort.de\/na\/3673dc84a734441d84a8fbe96dba1a9c","datePublished":"2020-05-22T15:24:53+00:00","breadcrumb":{"@id":"https:\/\/access-im-unternehmen.de\/RDBMSZugriff_per_VBA_Verbindungen\/#breadcrumb"},"inLanguage":"de","potentialAction":[{"@type":"ReadAction","target":["https:\/\/access-im-unternehmen.de\/RDBMSZugriff_per_VBA_Verbindungen\/"]}]},{"@type":"ImageObject","inLanguage":"de","@id":"https:\/\/access-im-unternehmen.de\/RDBMSZugriff_per_VBA_Verbindungen\/#primaryimage","url":"http:\/\/vg09.met.vgwort.de\/na\/3673dc84a734441d84a8fbe96dba1a9c","contentUrl":"http:\/\/vg09.met.vgwort.de\/na\/3673dc84a734441d84a8fbe96dba1a9c"},{"@type":"BreadcrumbList","@id":"https:\/\/access-im-unternehmen.de\/RDBMSZugriff_per_VBA_Verbindungen\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/access-im-unternehmen.de\/"},{"@type":"ListItem","position":2,"name":"RDBMS-Zugriff per VBA: Verbindungen"}]},{"@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\/55001054","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=55001054"}],"version-history":[{"count":0,"href":"https:\/\/access-im-unternehmen.de\/data\/wp\/v2\/posts\/55001054\/revisions"}],"wp:attachment":[{"href":"https:\/\/access-im-unternehmen.de\/data\/wp\/v2\/media?parent=55001054"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/access-im-unternehmen.de\/data\/wp\/v2\/categories?post=55001054"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/access-im-unternehmen.de\/data\/wp\/v2\/tags?post=55001054"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}