{"id":55000668,"date":"2009-06-01T00:00:00","date_gmt":"2020-05-22T22:23:44","guid":{"rendered":"http:\/\/access-im-unternehmen.aix-dev.de\/aiu\/?p=668"},"modified":"-0001-11-30T00:00:00","modified_gmt":"-0001-11-30T00:00:00","slug":"Anmeldung_an_SQL_Server_und_Co","status":"publish","type":"post","link":"https:\/\/access-im-unternehmen.de\/Anmeldung_an_SQL_Server_und_Co\/","title":{"rendered":"Anmeldung an SQL Server und Co."},"content":{"rendered":"<p><img loading=\"lazy\" decoding=\"async\" src=\"http:\/\/vg06.met.vgwort.de\/na\/d1e5a55d976b4fabab14647fba80f4be\" width=\"1\" height=\"1\" alt=\"\"><\/p>\n<p><b>Wenn Sie ein aktives Datenbanksystem wie SQL Server oder MySQL als Backend Ihrer Access-Anwendung verwenden, m&uuml;ssen Sie sich vor dem Zugriff auf die Daten anmelden. Dieser Beitrag liefert Methoden, mit denen sich die Benutzer Ihrer Datenbanken auf verschiedenste Weise an unterschiedlichen Datenbanksystemen anmelden k&ouml;nnen &#8211; egal, ob Sie die Verbindungsdaten in einer DSN oder in der Datenbank speichern und ob Benutzername und\/oder Kennwort in der Verbindungszeichenfolge stecken oder per Login-Dialog eingegeben werden sollen.<\/b><\/p>\n<p>Sie verwenden eine Access-Anwendung zum Zugriff auf eine Datenbank in einem aktiven Datenbanksystem Dann kennen Sie sicherlich auch die erforderlichen Umstellungsarbeiten, wenn der Datenbankserver oder anderes ge&auml;ndert werden muss. Falls die ODBC-Verbindungsdaten als DSN-Datenquelle vorliegen, m&uuml;ssen Sie daf&uuml;r sorgen, dass diese bei allen Clients aktualisiert werden. Nutzen Sie jedoch eine Verbindung ohne DSN (&#8222;DSN less&#8220;), reicht ein Update des Frontends aus. <\/p>\n<p>Falls Sie mehrere unterschiedliche Datenbankmanagementsysteme (DBMS) nutzen, bleibt es meist nicht nur bei der &auml;nderung einiger Parameter, sondern der Connectionstring muss vollkommen neu gestaltet werden. W&auml;re es in diesem Fall nicht praktisch, wenn Sie nur ein Formular zum Einstellen der Verbindungsparameter &ouml;ffnen m&uuml;ssten und der Rest von der Anwendung erledigt wird<\/p>\n<p><b>Ziel<\/b><\/p>\n<p>Der Anmeldevorgang an ein DBMS, also eine Datenbank mit einem SQL-Server-Backend, soll standardisiert werden, um unabh&auml;ngig vom eingesetzten Server eine modularisierte Anmelderoutine nutzen zu k&ouml;nnen.<\/p>\n<p><b>Ausgangssituation<\/b><\/p>\n<p>In einer Access-Anwendung werden per ODBC verkn&uuml;pfte Tabellen eingesetzt. Beim Verkn&uuml;pfen der Tabellen k&ouml;nnen Sie entscheiden, ob das Passwort in der Verkn&uuml;pfung gespeichert werden soll. Sobald Sie das Passwort speichern, ist ein Zugriff auf diese Tabellen ohne Anmeldung am DBMS m&ouml;glich. Diese Variante kann eine Sicherheitsl&uuml;cke darstellen, da die Tabellen in eine ungesch&uuml;tzte <b>.mdb<\/b>-Datei importiert werden k&ouml;nnen. Aus diesem Grund ist es sinnvoll, das Passwort nicht zu speichern.<\/p>\n<p>Dann erscheint beim erstmaligen Zugriff auf eine dieser Tabellen der ODBC-Anmelde-Dialog, wenn keine Windows-Authentifizierung genutzt wird. Damit Sie diesen Dialog umgehen beziehungsweise bei fehlgeschlagener Anmeldung die Access-Anwendung beenden k&ouml;nnen, ist es zweckm&auml;&szlig;ig, eine Anmelderoutine zu entwerfen, welche die Anmeldung am DBMS durchf&uuml;hrt und vom Benutzer nur die Eingabe von Benutzername und Passwort fordert (siehe Bild 1).<\/p>\n<p><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2009_03\/ODBC-web-images\/APP_Anwendungsstart_opt.jpeg\" alt=\"APP_Anwendungsstart.png\" \/><\/p>\n<p><b><span style=\"color:darkgrey\">Bild 1: Anmeldedialog<\/span><\/b><\/p>\n<p>Die Auswahl der Datenbank und des Servers ist f&uuml;r den Anwendungs-Benutzer eher nebens&auml;chlich, da dies meistens von den Anwendungsadministratoren vorab eingestellt wird. Das nachfolgende umgesetzte Konzept entspricht folgenden Anforderungen:<\/p>\n<ul>\n<li class=\"aufz-hlung\">Unabh&auml;ngig vom eingesetzten DBMS<\/li>\n<li class=\"aufz-hlung\">Verbindung ohne Code-&auml;nderung konfigurierbar<\/li>\n<li class=\"aufz-hlung\">Modularer Aufbau f&uuml;r flexiblen Einbau in Access-Anwendungen<\/li>\n<\/ul>\n<p>Der L&ouml;sungsansatz sieht folgenderma&szlig;en aus:<\/p>\n<ul>\n<li class=\"aufz-hlung\">Verbindungsparameter in Tabelle speichern<\/li>\n<li class=\"aufz-hlung\">Verbindungsspezifischen Code in einem Klassenmodul sammeln<\/li>\n<li class=\"aufz-hlung\">Jede Abfrage von Verbindungsdaten erfolgt ausschlie&szlig;lich &uuml;ber diese Klasse<\/li>\n<\/ul>\n<p><b>Funktionsweise<\/b><\/p>\n<p>Die folgenden Ausf&uuml;hrungen beziehen sich auf die den Beitrag begleitende Beispieldatenbank <b>DBMSVerbindung.mdb<\/b>. Abb. 2 stellt den Ablauf schematisch dar. &Uuml;ber das Startformular <b>frmAppWatcher <\/b>wird die Startprozedur <b>StartApplication <\/b>aufgerufen, welche die Verbindungspr&uuml;fung startet.<\/p>\n<p><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2009_03\/ODBC-web-images\/Funktionsweise_opt.jpeg\" alt=\"Funktionsweise.wmf\" \/><\/p>\n<p><b><span style=\"color:darkgrey\">Bild 2: Ablauf beim Verbinden mit dem SQL-Server<\/span><\/b><\/p>\n<p>Nach dem Auslesen der Verbindungsparameter wird bei Bedarf ein Loginformular zur Eingabe von Benutzer und Kennwort aufgerufen. Nach Eingabe dieser Werte werden die ODBC- und OLEDB-Connectionstrings erstellt.<\/p>\n<p>Verwendung finden diese sp&auml;ter in unterschiedlichsten Situationen: Beim Einbinden von ODBC-Tabellen, beim Erstellen von DAO- und ADO-Recordsets sowie beim Modifizieren von PassThrough-Abfragen.<\/p>\n<p>Als n&auml;chster Schritt folgt nun der Verbindungstest. Wenn eine Verbindung aufgebaut werden konnte, wird das Loginformular geschlossen und eine ODBC-Verbindung zur Datenbank ge&ouml;ffnet. Anschlie&szlig;end wird in der Startprozedur mit der restlichen Anwendungsinitialisierung fortgefahren.<\/p>\n<p>Falls beim Verbindungstest keine Verbindung hergestellt werden konnte, kann der Benutzer die Logindaten &auml;ndern oder die Anmeldung abbrechen. Mit dem Abbruch der Anmeldung wird dann auch die Anwendung beendet.<\/p>\n<p><b>Umsetzung<\/b><\/p>\n<p>Auf den folgenden Seiten ist eine Umsetzungsvariante f&uuml;r die zuvor getroffenen Anforderungen beschrieben. Aufgrund des doch etwas umfangreicheren Codes in der Beispielanwendung werden in der folgenden Beschreibung nur Code-Ausz&uuml;ge gezeigt. Wenn Sie mehr Details zu den gezeigten Prozeduren ben&ouml;tigen, &ouml;ffnen Sie einfach den Code in der Beispielanwendung.<\/p>\n<p class=\"zwischen-berschrift-oberer-spaltenrand\">Speichern der Verbindungsdaten<\/p>\n<p>Als Datenspeicher f&uuml;r die Verbindungsparameter dient eine lokale Tabelle im Frontend (siehe Bild 3). Diese Verbindungsparameter werden mittels Code zum ODBC- und OLEDB-Connectionstring zusammengesetzt. Ein Vorteil der Aufteilung in mehrere Datenfelder ist die M&ouml;glichkeit, die Werte getrennt zu nutzen. Im Datenfeld <b>dbmsUser <\/b>wird etwa der zuletzt angemeldete Benutzer gespeichert, damit dieser Name beim n&auml;chsten Anwendungsstart als Vorschlagswert verwendet werden kann. Das Pr&auml;fix <b>usys <\/b>im Tabellennamen ist hilfreich, damit diese Systemtabelle nicht mitten in den eigentlichen Nutztabellen f&uuml;r die Anwendung aufgelistet wird. (Objekte mit dem Pr&auml;fix <b>usys<\/b> werden wie mit <b>MSys<\/b> ausgeblendet, wenn in den Access-Optionen die Einstellung <b>Systemobjekte anzeigen<\/b> nicht aktiviert ist.)<\/p>\n<p><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2009_03\/ODBC-web-images\/TAB_usys_DbmsConnectio_opt.jpeg\" alt=\"TAB_usys_DbmsConnection.png\" \/><\/p>\n<p><b><span style=\"color:darkgrey\">Bild 3: Die Tabelle usys_DbmsConnection<\/span><\/b><\/p>\n<p>Das Formular <b>frmConfig_DBMS <\/b>und das Unterformular <b>frmConfig_DBMS_SF_Data <\/b>dienen zur Eingabe dieser Verbindungsdaten (siehe Bild 4). Je nach Auswahl der Verbindungsart <b>ohne DSN<\/b>, <b>mit DSN<\/b> beziehungsweise <b>benutzerdefiniert<\/b> werden die ben&ouml;tigten Eingabefelder aktiviert. In der Beispieldatenbank wird f&uuml;r diese Steuerung die Hilfstabelle <b>usys_DbmsConnection_X <\/b>genutzt, damit der Formularcode unabh&auml;ngig vom eingesetzten DBMS ist.<\/p>\n<p><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2009_03\/ODBC-web-images\/FRM_frmConfig_DBMS_opt.jpeg\" alt=\"FRM_frmConfig_DBMS.png\" \/><\/p>\n<p><b><span style=\"color:darkgrey\">Bild 4: Das Formular zum Konfigurieren der Verbindungen<\/span><\/b><\/p>\n<p>Falls Sie nur ein einziges DBMS verwenden, k&ouml;nnten Sie auf diese Tabelle verzichten und stattdessen Konstanten im VBA-Code einsetzen. Die Aktivierung der Eingabefelder erfolgt in der Formularprozedur <b>setLayoutMode <\/b>(s. Listing 1).<\/p>\n<p class=\"kastentabelleheader\">Listing 1: Aktivierung der Eingabefelder<\/p>\n<pre>Private Sub setLayoutMode()\r\n    ...\r\n    lngConnectionMode = Nz(Me!dbmsConnectionMode, -1)\r\n    &apos; dbmsConnectionMode ... Datenfeld aus usys_DbmsConnection\r\n    ...\r\n    Me.txtDbmsServer.Enabled = _\r\n    ((Nz(Me!XdbmsServer, 255) And lngConnectionMode) = lngConnectionMode)\r\n    &apos; txtDbmsServer ... Steuerelement im Formular\r\n    &apos; XdbmsServer... Ja\/Nein-Feld aus der Tabelle usys_DbmsConnection_X\r\n    Me.txtDbmsPort.Enabled = _\r\n    ((Nz(Me!XdbmsPort, 255) And lngConnectionMode) = lngConnectionMode)\r\n    ...\r\n    End Sub<\/pre>\n<p>Mit der Schaltfl&auml;che <b>Verbindung testen<\/b> (<b>cmdCheckConnection<\/b>) erfolgt der erste Einsatz der <b>DbConnectionInfo<\/b>-Klasse, die mit den angezeigten Daten den ODBC- und OLEDB-Connectionstring erzeugt sowie einen Verbindungstest durchf&uuml;hrt (s. Listing 2). <\/p>\n<p class=\"kastentabelleheader\">Listing 2: Pr&uuml;fen der Verbindung<\/p>\n<pre>Public Function CheckConnection(Optional ByRef errMsg As String = vbNullString) As Boolean\r\n    Dim checkOk As Boolean\r\n    On Error GoTo HandleErr\r\n    checkOk = checkAdoConnection(OleDbConnectionstring, errMsg)\r\n    If checkOk Then &apos;ODBC testen (au&szlig;er ADO-Check schlug bereits fehl)\r\n    checkOk = checkOdbcConnection(OdbcConnectionstring, errMsg)\r\nEnd If\r\nCheckConnection = checkOk\r\n...\r\nEnd Function<\/pre>\n<p>Wie dieser Verbindungsaufbau und der Verbindungstest abl&auml;uft, ist aus Sicht des Formulars nebens&auml;chlich (Stichwort: Kapselung). F&uuml;r den Formularcode reicht es aus, wenn <b>True <\/b>beziehungsweise <b>False <\/b>zur&uuml;ckgeliefert wird. Im Falle eines negativen Verbindungstests ist es allerdings hilfreich, den Grund f&uuml;r den fehlgeschlagenen Verbindungsaufbau anzuzeigen.<\/p>\n<p>Das erm&ouml;glicht das Auslesen des Wertes aus der Variablen <b>errMsg<\/b>, die als <b>ByRef<\/b>-Parameter an die Methode <b>CheckConnection <\/b>&uuml;bergeben wurde. Nun ist es an der Zeit, die Klasse <b>DbConnectionInfo <\/b>genauer zu betrachten.<\/p>\n<p class=\"zwischen-berschrift-oberer-spaltenrand\">Die Klasse DbConnectionInfo<\/p>\n<p>Die Klasse <b>DbConnectionInfo <\/b>ist die &#8222;Steuerzentrale&#8220; f&uuml;r die Bereitstellung der ben&ouml;tigten Verbindungsinformationen. Tab. 1, Tab. 2 und Tab. 3 zeigen die Eigenschaften, Methoden und Ereignisse dieser Klasse.<\/p>\n<table class=\"table-style-2\">\n<thead>\n<tr>\n<td>\n<p class=\"tabellekopfzeile\">Eigenschaft<\/p>\n<\/td>\n<td>\n<p class=\"tabellekopfzeile\">Beschreibung<\/p>\n<\/td>\n<\/tr>\n<\/thead>\n<tbody>\n<tr>\n<td class=\"aiu-zeile1\">\n<\/td>\n<td class=\"aiu-zeile1\">\n<\/td>\n<\/tr>\n<tr>\n<td class=\"aiu-zeile1\">\n<\/td>\n<td class=\"aiu-zeile1\">\n<\/td>\n<\/tr>\n<tr>\n<td class=\"aiu-zeile1\">\n<\/td>\n<td class=\"aiu-zeile1\">\n<\/td>\n<\/tr>\n<tr>\n<td class=\"aiu-zeile1\">\n<\/td>\n<td class=\"aiu-zeile1\">\n<\/td>\n<\/tr>\n<tr>\n<td class=\"aiu-zeile1\">\n<\/td>\n<td class=\"aiu-zeile1\">\n<\/td>\n<\/tr>\n<tr>\n<td class=\"aiu-zeile1\">\n<\/td>\n<td class=\"aiu-zeile1\">\n<\/td>\n<\/tr>\n<tr>\n<td class=\"aiu-zeile1\">\n<\/td>\n<td class=\"aiu-zeile1\">\n<\/td>\n<\/tr>\n<tr>\n<td class=\"aiu-zeile1\">\n<\/td>\n<td class=\"aiu-zeile1\">\n<\/td>\n<\/tr>\n<tr>\n<td class=\"aiu-zeile1\">\n<\/td>\n<td class=\"aiu-zeile1\">\n<\/td>\n<\/tr>\n<tr>\n<td class=\"aiu-zeile1\">\n<\/td>\n<td class=\"aiu-zeile1\">\n<\/td>\n<\/tr>\n<tr>\n<td class=\"aiu-zeile1\">\n<\/td>\n<td class=\"aiu-zeile1\">\n<\/td>\n<\/tr>\n<tr>\n<td class=\"aiu-zeile1\">\n<\/td>\n<td class=\"aiu-zeile1\">\n<\/td>\n<\/tr>\n<tr>\n<td class=\"aiu-zeile1\">\n<\/td>\n<td class=\"aiu-zeile1\">\n<\/td>\n<\/tr>\n<tr>\n<td class=\"aiu-zeile1\">\n<\/td>\n<td class=\"aiu-zeile1\">\n<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<p><b><span style=\"color:darkgrey\">Tab. 1: Eigenschaften der Klasse DBConnectionInfo<\/span><\/b><\/p>\n<table class=\"table-style-2\">\n<thead>\n<tr>\n<td>\n<p class=\"tabellekopfzeile\">Methode<\/p>\n<\/td>\n<td>\n<p class=\"tabellekopfzeile\">Beschreibung<\/p>\n<\/td>\n<\/tr>\n<\/thead>\n<tbody>\n<tr>\n<td>\n<\/td>\n<td>\n<\/td>\n<\/tr>\n<tr>\n<td>\n<\/td>\n<td>\n<\/td>\n<\/tr>\n<tr>\n<td>\n<\/td>\n<td>\n<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<p><b><span style=\"color:darkgrey\">Tab. 2: Methoden der Klasse DbConnectionInfo<\/span><\/b><\/p>\n<table class=\"table-style-2\">\n<thead>\n<tr>\n<td>\n<p class=\"tabellekopfzeile\">Ereignis<\/p>\n<\/td>\n<td>\n<p class=\"tabellekopfzeile\">Beschreibung<\/p>\n<\/td>\n<\/tr>\n<\/thead>\n<tbody>\n<tr>\n<td>\n<\/td>\n<td>\n<\/td>\n<\/tr>\n<tr>\n<td>\n<\/td>\n<td>\n<\/td>\n<\/tr>\n<tr>\n<td>\n<\/td>\n<td>\n<\/td>\n<\/tr>\n<tr>\n<td>\n<\/td>\n<td>\n<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<p><b><span style=\"color:darkgrey\">Tab. 3: Ereignisse der Klasse DbConnectionInfo<\/span><\/b><\/p>\n<p><!--30percent--><\/p>\n<p>Wie diese Klasse aufgebaut ist, sehen Sie am besten, wenn Sie die Entstehung der Eigenschaften, Methoden und Ereignisse nach deren &#8222;Bedarfszeitpunkt&#8220; betrachten.<\/p>\n<p>Die zuerst ben&ouml;tigte Methode war <b>CheckConnection <\/b>f&uuml;r die &Uuml;berpr&uuml;fung der Verbindungsparameter im Formular <b>frmConfig_DBMS_SF_Data<\/b> (s. Listing 3). Damit der Code &uuml;bersichtlich bleibt, werden die Pr&uuml;fungen f&uuml;r die OLEDB- und ODBC-Verbindung in Hilfsprozeduren ausgelagert. Innerhalb der beiden Hilfsprozeduren wird versucht, mit dem &uuml;bergebenen Connectionstring eine Verbindung aufzubauen, und bei Erfolg wird <b>True <\/b>zur&uuml;ckgegeben. An diese Hilfsprozeduren werden der OLEDB- beziehungsweise ODBC-Connectionstring &uuml;bergeben (s. Listing 3 und Listing 4). <\/p>\n<p class=\"kastentabelleheader\">Listing 3: Die Routine CheckConnection<\/p>\n<pre>Private Sub cmdCheckConnection_Click()\r\n    Dim strCID As String\r\n    Dim oDbConnectionInfo As DbConnectionInfo\r\n    Dim errMsg As String\r\n    On Error GoTo HandleErr\r\n    If Me.Dirty Then Me.Dirty = False\r\n    strCID = Nz(Me!CID, vbNullString)\r\n    If Len(strCID) = 0 Then Exit Sub\r\n    Set oDbConnectionInfo = New DbConnectionInfo\r\n    oDbConnectionInfo.CID = strCID &apos; &Uuml;bergabe der Verbindungskennung\r\n    If oDbConnectionInfo.CheckConnection(errMsg) = True Then\r\n        MsgBox \"Verbindungsaufbau war erfolgreich\"\r\n    Else\r\n        If Len(errMsg) &gt; 0 Then errMsg = vbNewLine &amp; vbNewLine _\r\n        &amp; errMsg\r\n        MsgBox \"Verbindung konnte nicht hergestellt werden.\" _\r\n        &amp; errMsg\r\n    End If\r\n    Set oDbConnectionInfo = Nothing\r\n    ...\r\n    End Sub<\/pre>\n<\/p>\n<p class=\"kastentabelleheader\">Listing 4: Die Property OleDbConnectionstring (OdbcConnectionString sieht analog aus)<\/p>\n<pre>Public Property Get OleDbConnectionstring() As String\r\nOn Error GoTo HandleErr\r\nIf Len(m_OledbConnectionString) = 0 Then\r\n setConnectionStrings\r\nEnd If\r\nOleDbConnectionstring = m_OledbConnectionString\r\n...\r\nEnd Property<\/pre>\n<p>In den <b>Property<\/b>-Prozeduren <b>OleDbConnectionstring <\/b>und <b>OdbcConnectionstring <\/b>wird gepr&uuml;ft, ob die Variable einen Wert enth&auml;lt. Falls kein Wert enthalten ist, wird &uuml;ber die Prozedur <b>setConnetionStrings <\/b>das Zusammensetzen der Connectionstrings gestartet (s. Listing 5). &auml;hnlich wie in <b>OleDbConnectionstring <\/b>wird nun mit der Hilfsvariablen <b>m_DbmsInfoReaded <\/b>gepr&uuml;ft, ob die Verbindungsparameter bereits eingelesen wurden.<\/p>\n<p class=\"kastentabelleheader\">Listing 5: Die Routine setConnectionStrings<\/p>\n<pre>Private Sub setConnectionStrings(Optional ByVal bWithConnectionCheck As Boolean = True)\r\n    Dim myConnectionStrings As DbmsConnectionStrings\r\n    Dim errMsg As String\r\n    On Error GoTo HandleErr\r\n    If Not m_DbmsInfoReaded Then\r\n        readDBMSprop\r\n        If m_LoginCancelled Or ((Len(m_DBSERVER) + Len(m_DBNAME)) = 0) Then\r\n            Exit Sub\r\n        End If\r\n    ElseIf m_LoginCancelled Then\r\n        Exit Sub\r\n    End If\r\n    ...\r\n    myConnectionStrings = Me.ConnectionStrings\r\n    m_OledbConnectionString = myConnectionStrings.OleDbConnectionstring\r\n    m_OdbcConnectionString = myConnectionStrings.OdbcConnectionstring\r\n    m_DatabaseFile = myConnectionStrings.DatabaseFile\r\n    ...\r\n    End Sub<\/pre>\n<p>Sollte das Einlesen noch fehlen, wird die Prozedur <b>readDBMSprop <\/b>aufgerufen. Nach dem Einlesen der Daten k&ouml;nnen die Connectionstrings von der Property-Prozedur <b>ConnectionStrings <\/b>bereitgestellt und in den Hilfsvariablen <b>m_OledbConnectionString <\/b>und <b>m_OdbcConnectionString <\/b>zwischengespeichert werden, damit sie nicht bei jedem Aufruf neu berechnet werden m&uuml;ssen.<\/p>\n<p><b>readDBMSprop<\/b><\/p>\n<p>Die Hilfsprozedur <b>readDBMSprop <\/b>liest die Daten aus der Tabelle <b>usys_DbmsConnection <\/b>aus und speichert die Werte in Variablen ab (s. Listing 6). Au&szlig;erdem wird bei Bedarf das Login-Formular zur Eingabe von Benutzername und Passwort ge&ouml;ffnet.<\/p>\n<p class=\"kastentabelleheader\">Listing 6: Die Routine readDBMSprop<\/p>\n<pre>Private Sub readDBMSprop(Optional ByVal withoutLoginForm As Boolean = False)\r\n    ...\r\n    m_DBMSNAME = Nz(rst.Fields(\"DBMS\"), vbNullString)\r\n    ...\r\n    m_UseLoginForm = Nz(.Fields(\"dbmsUseLoginForm\"), False)\r\n    ...\r\n    &apos;m_LoginForm &uuml;ber Property LoginForm zug&auml;nglich machen und im\r\n    &apos;LoginForm selbst setzen:\r\n    Set g_TempRef = Me\r\n    DoCmd.OpenForm g_conApplicationLoginFormName, acNormal, , , acFormEdit, acDialog, _\r\n    m_DBMSNAME &amp; \"@\" &amp; m_DBUSER\r\n    Set g_TempRef = Nothing\r\n    ...\r\n    End Sub<\/pre>\n<p class=\"zwischen-berschrift-oberer-spaltenrand\">ConnectionStrings<\/p>\n<p>In der Property-Prozedur <b>Connectionstrings <\/b>werden die ausgelesenen Verbindungsparameter zu den jeweiligen Connectionstrings zusammengef&uuml;gt (s. Listing 7). Diese Connectionstrings sind vom verwendeten DBMS abh&auml;ngig. Aus diesem Grund ist es sinnvoll, an dieser Stelle &uuml;ber den Wert in m_DBMSNAME, der in readDBMSprop eingestellt wurde, eine Verzweigung in die unterschiedlichen DBMS-abh&auml;ngigen Hilfsprozeduren einzubauen.<\/p>\n<p class=\"kastentabelleheader\">Listing 7: Die Property-Get-Prozedur ConnectionStrings<\/p>\n<pre>Public Property Get ConnectionStrings() As DbmsConnectionStrings\r\n...\r\nSelect Case m_DBMSNAME\r\nCase \"MSSQL\"\r\nConnectionStrings = ConnectionStrings_MSSQL\r\nCase \"MySQL\"\r\nConnectionStrings = ConnectionStrings_MySQL\r\nCase Else\r\nErr.Raise ErrorNumbers.ERRNR_NODBMS, \"DbConnectionInfo.ConnectionStrings\", _\r\n\"F&uuml;r &apos;\" &amp; m_DBMSNAME &amp; \"&apos; k&ouml;nnen [...]\"\r\nEnd Select\r\n...\r\nEnd Property<\/pre>\n<p>Falls Sie ein anderes DBMS verwenden wollen, l&auml;sst sich an dieser Stelle der Code leicht entsprechend anpassen.<\/p>\n<p>Die Hilfsprozeduren <b>ConnectionStrings_MSSQL <\/b>oder <b>ConnectionStrings_MySQL <\/b>erzeugen den DBMS-spezifischen Connectionstring aus den eingelesenen Werten (s. Listing 8, <b>ConnectionStrings_MySQL <\/b>sieht analog aus). Mit diesen Codeausschnitten stie&szlig;en Sie direkt zum Kern der Klasse <b>DbConnectionInfo <\/b>vor.<\/p>\n<p class=\"kastentabelleheader\">Listing 8: Die Property-Get-Prozedur ConnectionStrings<\/p>\n<pre>Private Function ConnectionStrings_MSSQL() As DbmsConnectionStrings\r\n    ...\r\n    strSrvCon = m_DBSERVER\r\n    If Len(m_PORT) &gt; 0 Then\r\n        strSrvCon = strSrvCon &amp; \",\" &amp; m_PORT\r\n    End If\r\n    ...\r\n    strOLEDB = \"Provider=\" &amp; m_DBOLEDBPROVIDER &amp; \";Data Source=\" &amp; _\r\n    strSrvCon &amp; \";Initial Catalog=\" &amp; m_DBNAME &amp; strOLEDB\r\n    ...\r\n    tempConnectionStrings.OleDbConnectionstring = strOLEDB\r\n    tempConnectionStrings.OdbcConnectionstring = \"ODBC;\" &amp; strODBC\r\n    ConnectionStrings_MSSQL = tempConnectionStrings\r\n    ...\r\nEnd Function<\/pre>\n<p>Bevor Sie sich im n&auml;chsten Abschnitt dem Anmeldevorgang beim Anwendungsstart widmen, werfen Sie noch kurz einen Blick auf das Login-Formular, das in der Prozedur <b>readDBMSprop <\/b>aufgerufen wird (siehe Bild 5).<\/p>\n<p><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2009_03\/ODBC-web-images\/FRM_frmLogin_opt.jpeg\" alt=\"FRM_frmLogin.png\" \/><\/p>\n<p><b><span style=\"color:darkgrey\">Bild 5: Das Login-Formular<\/span><\/b><\/p>\n<p>Nach dem Bet&auml;tigen der <b>OK<\/b>-Schaltfl&auml;che wird ein Ereignis ausgel&ouml;st, auf das die Klasse <b>DbConnectionInfo <\/b>reagiert (s. Listing 9 und Listing 10). Sie sehen an den Aufrufen von <b>setConnectionStrings <\/b>und <b>checkAdoConnection<\/b>, dass sich das Aufteilen einiger Prozeduren in der Klasse <b>DbConnectionInfo <\/b>nun bezahlt macht, da die erforderlichen Abl&auml;ufe bereits in gekapselter Form vorliegen.<\/p>\n<p class=\"kastentabelleheader\">Listing 9: Code-Auszug aus dem frmLogin-Klassenmodul<\/p>\n<pre>Public Event Logon( ByVal LoginName As String, _\r\nByVal Password As String, ByRef Cancel As Boolean)\r\nPrivate Sub cmdLogin_Click()\r\n    Dim strLoginName As String\r\n    Dim strLoginPassword As String\r\n    Dim bolCancel As Boolean\r\n    On Error GoTo HandleErr\r\n    strLoginName = Me.txtUID &amp; vbNullString\r\n    strLoginPassword = Me.txtPwd &amp; vbNullString\r\n    If Len(strLoginName) * Len(strLoginPassword) = 0 Then\r\n        MsgBox \"Bitte Loginnamen und Kennwort angeben\"\r\n        If Len(strLoginName) = 0 Then\r\n            Me.txtUID.SetFocus\r\n        Else\r\n            Me.txtPwd.SetFocus\r\n        End If\r\n        Exit Sub\r\n    End If\r\n    RaiseEvent Logon(strLoginName, strLoginPassword, _\r\n    bolCancel)\r\n    If bolCancel Then\r\n        Me.txtPwd.SetFocus\r\n        Exit Sub\r\n    End If\r\n    ...\r\n    End Sub<\/pre>\n<\/p>\n<p class=\"kastentabelleheader\">Listing 10: Auszug aus der Klasse DbConnectionInfo<\/p>\n<pre>Private Sub m_LoginForm_Logon(ByVal LoginName As String, _\r\n    ByVal Password As String, Cancel As Boolean)\r\n    Dim errMsg As String\r\n    On Error GoTo HandleErr\r\n    m_DBUSER = LoginName\r\n    m_DBUSERPWD = Password\r\n    Call setConnectionStrings(False)\r\n    If checkAdoConnection(m_OledbConnectionString, errMsg) _\r\n    = False Then\r\n    If Len(errMsg) &gt; 0 Then errMsg = vbNewLine _\r\n    &amp; vbNewLine &amp; errMsg\r\n    MsgBox \"Verbindung konnte nicht hergestellt werden\" _\r\n    &amp; errMsg\r\n    Cancel = True\r\n    Exit Sub\r\nEnd If\r\n...\r\nEnd Sub<\/pre>\n<p>Die Basis f&uuml;r den Anmeldevorgang ist erstellt. Nutzen Sie nun die Klasse <b>DbConnectionString<\/b>, um den Anmeldevorgang beim Anwendungsstart f&uuml;r den &#8222;normalen&#8220; Benutzer zu gestalten.<\/p>\n<p><b>Anmeldevorgang beim Anwendungsstart<\/b><\/p>\n<p>Damit Sie die Anmeldung am DBMS beim Start der Access-Anwendung durchf&uuml;hren k&ouml;nnen, m&uuml;ssen Sie daf&uuml;r sorgen, dass die Methode <b>CheckConnection <\/b>ausgef&uuml;hrt wird, bevor der Benutzer die eigentlichen Masken der Access-Anwendung verwenden kann. In der Beispielanwendung wurde dazu der Aufruf einer Startprozedur &uuml;ber ein Startformular gew&auml;hlt. Das Formular <b>frmAppWatcher <\/b>ist in den Startoptionen von Access als Startformular eingetragen und ruft nach dem Laden die Prozedur <b>StartApplication <\/b>im Modul <b>_initApplication <\/b>auf.<\/p>\n<p>In der Prozedur <b>StartApplication <\/b>erfolgt der Aufruf des Verbindungstests (s. Listing 11). Da f&uuml;r die Anwendung nur eine Instanz von <b>DbConnectionInfo <\/b>ben&ouml;tigt wird, k&ouml;nnen Sie eine <b>Property<\/b>-Prozedur in einem allgemeinen Modul erstellen, die diese Instanz erzeugt und zur Verf&uuml;gung stellt (s. Listing 12).<\/p>\n<p class=\"kastentabelleheader\">Listing 11: Aufruf des Verbindungstests beim Start der Anwendung<\/p>\n<pre>Public Function StartApplication() As Boolean\r\n    ...\r\n    &apos;Verbindung zu Server herstellen\/Login-Berechtigung\r\n    &apos;pr&uuml;fen\r\n    Do While bolAllowStart = False\r\n        bolAllowStart = CurrentConnectionInfo.CheckConnection\r\n        If bolAllowStart = False Then\r\n            If MsgBox(\"Anmeldung ist fehlgeschlagen\", _\r\n            vbRetryCancel, CurrentApplicationName _\r\n            &amp; \" - Login\") = vbCancel Then\r\n            Application.Quit acQuitSaveNone\r\n            Exit Function\r\n        Else\r\n            &apos;Daten neu einlesen\r\n            CurrentConnectionInfo.ClearConnectionInfo\r\n        End If\r\n    End If\r\nLoop\r\n...\r\nEnd Function<\/pre>\n<\/p>\n<p class=\"kastentabelleheader\">Listing 12: Bereitstellen der ConnectionInfo in einem globalen Modul &#8230;<\/p>\n<pre>Private m_DbConnectionInfo As DbConnectionInfo\r\nPublic Property Get CurrentConnectionInfo() _\r\nAs DbConnectionInfo\r\nIf m_DbConnectionInfo Is Nothing Then\r\nSet m_DbConnectionInfo = New DbConnectionInfo\r\nEnd If\r\nSet CurrentConnectionInfo = m_DbConnectionInfo\r\nEnd Property<\/pre>\n<p>Diese Variante kann allerdings nicht auf Ereignisse reagieren, die von <b>DbConnectionInfo <\/b>ausgel&ouml;st werden. Um auf diese Ereignisse reagieren zu k&ouml;nnen, m&uuml;ssen Sie die Deklaration der Objektvariablen mit <b>WithEvents <\/b>in eine weitere Hilfsklasse verschieben. In der Beispielanwendung wird daf&uuml;r die Klasse <b>JPSLAccUtilInstancer <\/b>verwendet (s. Listing 13).<\/p>\n<p class=\"kastentabelleheader\">Listing 13: &#8230; und in einer Klasse, hier mit der M&ouml;glichkeit zum Reagieren auf Ereignisse<\/p>\n<pre>Private WithEvents m_DbConnectionInfo As DbConnectionInfo\r\nPublic Property Get ConnectionInfo() As DbConnectionInfo\r\nIf m_DbConnectionInfo Is Nothing Then\r\n Set m_DbConnectionInfo = New DbConnectionInfo\r\nEnd If\r\nSet ConnectionInfo = m_DbConnectionInfo\r\nEnd Property<\/pre>\n<p>Damit wird es m&ouml;glich, in dieser Hilfsklasse auf die Ereignisse von <b>DbConnectionInfo <\/b>zu reagieren. Das kann f&uuml;r Sie hilfreich werden, wenn Sie auf &auml;nderungen der aktiven Verbindung reagieren wollen, um etwa die aktuellen Verbindungsdaten in der Titelleiste der Anwendung anzuzeigen (s. Listing 14).<\/p>\n<p class=\"kastentabelleheader\">Listing 14: Diese Ereignisprozedur reagiert auf &auml;nderungen der Verbindung.<\/p>\n<pre>Private Sub m_DbConnectionInfo_DbmsConnectionChanged( ByVal newCID As String)\r\n...\r\n&apos;Aktuelle Verbindung in Titelleiste anzeigen\r\nIf Len(newCID) = 0 Then\r\n SetApplicationTitelbar CurrentApplicationName\r\nElse\r\n SetApplicationTitelbar CurrentApplicationName &amp; \" (\" &amp; newCID &amp; \" | \" _\r\n    &amp; CurrentConnectionInfo.DbServer &amp; \".\" &amp; UCase$(CurrentConnectionInfo.DbName) &amp; _\r\n    \" | User: \" &amp; CurrentConnectionInfo.DbUser(True) &amp; \")\"\r\nEnd If\r\n...\r\nEnd Sub<\/pre>\n<p>Nun m&uuml;ssen Sie noch eine Instanz der Klasse <b>JPSLAccUtilInstancer <\/b>erzeugen. Da diese Klasse allerdings nur als Hilfsklasse zum Instanzieren der <b>DbConnectionInfo<\/b>-Klasse verwendet wird, reicht es aus, wenn Sie die anfangs gezeigte <b>Property<\/b>-Prozedur <b>CurrentConnectionInfo <\/b>umgestalten (s. Listing 15). Mit dieser Prozedur erhalten Sie Zugriff auf die Eigenschaft <b>ConnectionInfo <\/b>der <b>JPSLAccUtilInstancer<\/b>-Instanz. F&uuml;r die weitere Verwendung im Code k&ouml;nnen Sie ab jetzt die Eigenschaft <b>CurrentConnectionInfo <\/b>verwenden und m&uuml;ssen sich nicht um die Initialisierung der <b>DbConnectionInfo<\/b>-Instanz k&uuml;mmern.<\/p>\n<p class=\"kastentabelleheader\">Listing 15: Hilfsklasse zum Instanzieren der DBConnectionInfo-Klasse<\/p>\n<pre>Private m_AccessUtilsApplicationInstancer As JPSLAccUtilInstancer\r\nPublic Property Get CurrentConnectionInfo() As DbConnectionInfo\r\nIf m_AccessUtilsApplicationInstancer Is Nothing Then\r\n Set m_AccessUtilsApplicationInstancer = New JPSLAccUtilInstancer\r\nEnd If\r\nSet CurrentConnectionInfo = m_AccessUtilsApplicationInstancer.ConnectionInfo\r\nEnd Property<\/pre>\n<p>Tipp: Falls Sie weitere &auml;hnliche Hilfsklassen in Ihrer Anwendung einsetzen, also generell gern klassenorientiert entwickeln, k&ouml;nnen Sie diese &uuml;ber die Klasse <b>JPSLAccUtilInstancer <\/b>instanzieren.<\/p>\n<p>Wenn Sie anschlie&szlig;end noch eine Eigenschaft f&uuml;r den Zugriff auf die Instanz von <b>JPSLAccUtilInstancer <\/b>in Ihrer Anwendung erstellen, erhalten Sie ein &auml;hnliches Konstrukt wie bei der <b>Application<\/b>-Instanz von Access und k&ouml;nnen zentral &uuml;ber die <b>JPSLAccUtilInstancer<\/b>-Instanz alle Instanzen Ihrer Hilfsklassen ansteuern.<\/p>\n<p><b>Tabellen verkn&uuml;pfen<\/b><\/p>\n<p>Aufgrund des Verbindungstests wurde bereits eine ODBC-Verbindung aufgebaut. Dies erm&ouml;glicht nach der Anmeldung die Nutzung der verkn&uuml;pften Tabellen, auch wenn beim Verkn&uuml;pfen aus Sicherheitsgr&uuml;nden das Passwort nicht gespeichert wurde. Die Klasse <b>DbConnectionInfo <\/b>erm&ouml;glicht allerdings nicht nur einen standardisierten Anmeldevorgang. Sie k&ouml;nnen diese Klasse auch zum Verkn&uuml;pfen der Tabelle einsetzen und die erforderlichen Verbindungseinstellungen daraus abfragen (s. Listing 16). F&uuml;r diese Prozedur ist es nicht mehr erforderlich, die Zusammensetzung des Connectionstrings zu kennen, da dies vollst&auml;ndig von der Klasse <b>DbConnectionInfo <\/b>&uuml;bernommen wird. Weiterhin liefert diese Klasse die Information, ob das Benutzerpasswort gespeichert werden soll. Ein m&ouml;glicher Anwendungsfall dazu ist im Formular <b>frmConfig_LinkTables <\/b>zu sehen.<\/p>\n<p class=\"kastentabelleheader\">Listing 16: Verkn&uuml;pfen mit einer Tabelle<\/p>\n<pre>Public Sub LinkTable(ByVal SourceTableName As String, _\r\nOptional ByVal sLinkedTableName As String = vbNullString, _\r\nOptional ByVal bRemoveSchemaName As Boolean = True)\r\n...\r\nSet dbs = CurrentDbC\r\nSet tdf = dbs.CreateTableDef(strTdfName)\r\nWith tdf\r\ntdf.SourceTableName = SourceTableName\r\ntdf.Connect = CurrentConnectionInfo.OdbcConnectionstring\r\nIf CurrentConnectionInfo.SavePassword Then\r\nIf (.Attributes And dbAttachSavePWD) = 0 Then\r\n .Attributes = dbAttachSavePWD\r\nEnd If\r\nEnd If\r\nEnd With\r\ndbs.TableDefs.Append tdf\r\n...\r\nEnd Sub<\/pre>\n<p><b>Datenzugriff<\/b><\/p>\n<p>Sollten Sie f&uuml;r den Datenzugriff ADODB-Recordsets verwenden, m&uuml;ssen Sie sich nicht mehr um den <b>OLEDB<\/b>-Connectionstring k&uuml;mmern, sondern k&ouml;nnen diesen ebenso von der <b>DbConnectionInfo<\/b>-Instanz anfordern.<\/p>\n<p>Besonders beim h&auml;ufigen Einsatz von ADODB-Datenzugriffen ist eine Hilfsprozedur &auml;hnlich dem <b>CurrentDbC<\/b>-Vorschlag von Michael Kaplan hilfreich, die eine ADODB-Connection liefert (s. Listing 17).<\/p>\n<p class=\"kastentabelleheader\">Listing 17: Diese Funktion liefert die aktuelle Verbindung.<\/p>\n<pre>Private m_AdodbConnection As ADODB.Connection\r\nPublic Property Get CurrentConnection() As ADODB.Connection\r\nIf (m_AdodbConnection Is Nothing) Then\r\n Set m_AdodbConnection = New ADODB.Connection\r\n    m_AdodbConnection.Open _\r\n    CurrentConnectionInfo.OleDbConnectionstring, _\r\n    CurrentConnectionInfo.DbUser, _\r\n    CurrentConnectionInfo.DbUserPassword\r\nEnd If\r\nSet CurrentConnection = m_AdodbConnection\r\nEnd Property<\/pre>\n<p>Auch in dieser Prozedur k&uuml;mmert sich die <b>DbConnection<\/b>-Instanz um die passenden Verbindungsparameter. Weitere Beispiele zum Datenzugriff finden Sie in den Modulen <b>modADO <\/b>und <b>modODBC<\/b>.<\/p>\n<p class=\"zwischen-berschrift-oberer-spaltenrand\">Optimierungsm&ouml;glichkeiten<\/p>\n<p>Wie Sie sehen, kann diese <b>DbConnection<\/b>-Klasse vielseitig eingesetzt werden. Trotzdem werden Sie beim Einsatz dieser Struktur immer wieder Verbesserungen einbauen. Wenn Sie Ihre Code-Anpassungen unter Ber&uuml;cksichtigung modularer Anwendungsentwicklung in gekapselter Form durchf&uuml;hren, werden Sie nach einiger Zeit eine sehr umfangreiche, aber gut strukturierte Codebibliothek erhalten, die Sie f&uuml;r den Einsatz eines Access-Frontends f&uuml;r aktive DBMS nicht mehr missen m&ouml;chten.<\/p>\n<p><b>Zusammenfassung und Ausblick<\/b><\/p>\n<p>F&uuml;r den Einsatz der hier vorgestellten L&ouml;sung haben wir einige weitere Anregungen:<\/p>\n<ul>\n<li class=\"aufz-hlung\">Legen Sie die Verbindungsdaten nicht nur in der Tabelle ab, sondern gestalten Sie einen Import\/Export, damit bei der Weitergabe (Update) der Anwendung die Verbindungsparameter nicht erneut eingestellt werden m&uuml;ssen. <\/li>\n<li class=\"aufz-hlung\">Lagen Sie Code in eine COM-Bibliothek (DLL) beziehungsweise <b>.mde<\/b>-Bibliothek aus. Damit bleibt die Anwendung frei von &#8222;Standardcode&#8220;. Au&szlig;erdem gibt es dann weniger &#8222;Versions-Chaos&#8220;, wenn man mehrere Access-Anwendungen einsetzt. <\/li>\n<li class=\"aufz-hlung\">Unterscheiden Sie zwischen Benutzer- und Administrator-Anmeldung. Es kann n&uuml;tzlich sein, wenn nur der Administrator das Formular zum Einstellen der Verbindungsdaten &ouml;ffnen kann.<\/li>\n<li class=\"aufz-hlung\">Die Einstellung der Verbindungsdaten &uuml;ber das Formular <b>frmConfig_DBMS <\/b>k&ouml;nnten Sie in ein Access-AddIn auslagern, da es nur f&uuml;r die Grundeinstellung der Verbindungsdaten ben&ouml;tigt wird. F&uuml;r den Anwendungsbetrieb beim Endbenutzer sind meist die gespeicherten Daten in der Tabelle ausreichend.<\/li>\n<li class=\"aufz-hlung\">Schaffen Sie eine M&ouml;glichkeit zum Umschalten zwischen Test- und Produktivumgebung. F&uuml;r viele Datenbankanwendungen gibt es im Datenbankserver zwei (oftmals sogar mehrere) Datenbanken mit identischer Struktur, allerdings mit unterschiedlichen Daten (Test- und Produktiv-Daten). Wenn Sie den Anmeldedialog erweitern, k&ouml;nnten Sie bei der Anmeldung auch die Auswahl der jeweils ben&ouml;tigten Datenbank (beziehungsweise der Verbindungseinstellungen aus <b>usys_DbmsConnection<\/b>) erm&ouml;glichen.<\/li>\n<\/ul>\n<h3>Downloads zu diesem Beitrag<\/h3>\n<p>Enthaltene Beispieldateien:<\/p>\n<p>DbmsVerbindung.mdb<\/p>\n<p><a href=\"..\/fileadmin\/beispiele\/{3DD790DE-ECEC-4D49-8451-ADB808F46654}\/aiu_668.zip\">Download<\/a><\/p>\n","protected":false},"excerpt":{"rendered":"<p>Wenn Sie ein aktives Datenbanksystem wie SQL Server oder MySQL als Backend Ihrer Access-Anwendung verwenden, m&uuml;ssen Sie sich vor dem Zugriff auf die Daten anmelden. Dieser Beitrag liefert Methoden, mit denen sich die Benutzer Ihrer Datenbanken auf verschiedenste Weise an unterschiedliche Datenbanksysteme anmelden k&ouml;nnen &#8211; egal, ob Sie die Verbindungsdaten in einer DSN oder in der Datenbank speichern und ob Benutzername und\/oder Kennwort in der Verbindungszeichenfolge stecken oder per Login-Dialog eingegeben werden sollen.<\/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":[662009,66032009,44000027,44000022],"tags":[],"class_list":["post-55000668","post","type-post","status-publish","format-standard","hentry","category-662009","category-66032009","category-Loesungen","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>Anmeldung an SQL Server und Co. - 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\/Anmeldung_an_SQL_Server_und_Co\/\" \/>\n<meta property=\"og:locale\" content=\"de_DE\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Anmeldung an SQL Server und Co.\" \/>\n<meta property=\"og:description\" content=\"Wenn Sie ein aktives Datenbanksystem wie SQL Server oder MySQL als Backend Ihrer Access-Anwendung verwenden, m&uuml;ssen Sie sich vor dem Zugriff auf die Daten anmelden. Dieser Beitrag liefert Methoden, mit denen sich die Benutzer Ihrer Datenbanken auf verschiedenste Weise an unterschiedliche Datenbanksysteme anmelden k&ouml;nnen - egal, ob Sie die Verbindungsdaten in einer DSN oder in der Datenbank speichern und ob Benutzername und\/oder Kennwort in der Verbindungszeichenfolge stecken oder per Login-Dialog eingegeben werden sollen.\" \/>\n<meta property=\"og:url\" content=\"https:\/\/access-im-unternehmen.de\/Anmeldung_an_SQL_Server_und_Co\/\" \/>\n<meta property=\"og:site_name\" content=\"Access im Unternehmen\" \/>\n<meta property=\"article:published_time\" content=\"2020-05-22T22:23:44+00:00\" \/>\n<meta property=\"og:image\" content=\"http:\/\/vg06.met.vgwort.de\/na\/d1e5a55d976b4fabab14647fba80f4be\" \/>\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=\"17\u00a0Minuten\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\\\/\\\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Anmeldung_an_SQL_Server_und_Co\\\/#article\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Anmeldung_an_SQL_Server_und_Co\\\/\"},\"author\":{\"name\":\"Andr\u00e9 Minhorst\",\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/#\\\/schema\\\/person\\\/13395c4bcd7d7963efe33be9c584d93f\"},\"headline\":\"Anmeldung an SQL Server und Co.\",\"datePublished\":\"2020-05-22T22:23:44+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Anmeldung_an_SQL_Server_und_Co\\\/\"},\"wordCount\":2578,\"commentCount\":0,\"publisher\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/#organization\"},\"image\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Anmeldung_an_SQL_Server_und_Co\\\/#primaryimage\"},\"thumbnailUrl\":\"http:\\\/\\\/vg06.met.vgwort.de\\\/na\\\/d1e5a55d976b4fabab14647fba80f4be\",\"articleSection\":[\"2009\",\"3\\\/2009\",\"L\u00f6sungen\",\"SQL Server und Co.\"],\"inLanguage\":\"de\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\\\/\\\/access-im-unternehmen.de\\\/Anmeldung_an_SQL_Server_und_Co\\\/#respond\"]}]},{\"@type\":\"WebPage\",\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Anmeldung_an_SQL_Server_und_Co\\\/\",\"url\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Anmeldung_an_SQL_Server_und_Co\\\/\",\"name\":\"Anmeldung an SQL Server und Co. - Access im Unternehmen\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Anmeldung_an_SQL_Server_und_Co\\\/#primaryimage\"},\"image\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Anmeldung_an_SQL_Server_und_Co\\\/#primaryimage\"},\"thumbnailUrl\":\"http:\\\/\\\/vg06.met.vgwort.de\\\/na\\\/d1e5a55d976b4fabab14647fba80f4be\",\"datePublished\":\"2020-05-22T22:23:44+00:00\",\"breadcrumb\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Anmeldung_an_SQL_Server_und_Co\\\/#breadcrumb\"},\"inLanguage\":\"de\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\\\/\\\/access-im-unternehmen.de\\\/Anmeldung_an_SQL_Server_und_Co\\\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"de\",\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Anmeldung_an_SQL_Server_und_Co\\\/#primaryimage\",\"url\":\"http:\\\/\\\/vg06.met.vgwort.de\\\/na\\\/d1e5a55d976b4fabab14647fba80f4be\",\"contentUrl\":\"http:\\\/\\\/vg06.met.vgwort.de\\\/na\\\/d1e5a55d976b4fabab14647fba80f4be\"},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Anmeldung_an_SQL_Server_und_Co\\\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\\\/\\\/access-im-unternehmen.de\\\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Anmeldung an SQL Server und Co.\"}]},{\"@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":"Anmeldung an SQL Server und Co. - 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\/Anmeldung_an_SQL_Server_und_Co\/","og_locale":"de_DE","og_type":"article","og_title":"Anmeldung an SQL Server und Co.","og_description":"Wenn Sie ein aktives Datenbanksystem wie SQL Server oder MySQL als Backend Ihrer Access-Anwendung verwenden, m&uuml;ssen Sie sich vor dem Zugriff auf die Daten anmelden. Dieser Beitrag liefert Methoden, mit denen sich die Benutzer Ihrer Datenbanken auf verschiedenste Weise an unterschiedliche Datenbanksysteme anmelden k&ouml;nnen - egal, ob Sie die Verbindungsdaten in einer DSN oder in der Datenbank speichern und ob Benutzername und\/oder Kennwort in der Verbindungszeichenfolge stecken oder per Login-Dialog eingegeben werden sollen.","og_url":"https:\/\/access-im-unternehmen.de\/Anmeldung_an_SQL_Server_und_Co\/","og_site_name":"Access im Unternehmen","article_published_time":"2020-05-22T22:23:44+00:00","og_image":[{"url":"http:\/\/vg06.met.vgwort.de\/na\/d1e5a55d976b4fabab14647fba80f4be","type":"","width":"","height":""}],"author":"Andr\u00e9 Minhorst","twitter_card":"summary_large_image","twitter_misc":{"Verfasst von":"Andr\u00e9 Minhorst","Gesch\u00e4tzte Lesezeit":"17\u00a0Minuten"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/access-im-unternehmen.de\/Anmeldung_an_SQL_Server_und_Co\/#article","isPartOf":{"@id":"https:\/\/access-im-unternehmen.de\/Anmeldung_an_SQL_Server_und_Co\/"},"author":{"name":"Andr\u00e9 Minhorst","@id":"https:\/\/access-im-unternehmen.de\/#\/schema\/person\/13395c4bcd7d7963efe33be9c584d93f"},"headline":"Anmeldung an SQL Server und Co.","datePublished":"2020-05-22T22:23:44+00:00","mainEntityOfPage":{"@id":"https:\/\/access-im-unternehmen.de\/Anmeldung_an_SQL_Server_und_Co\/"},"wordCount":2578,"commentCount":0,"publisher":{"@id":"https:\/\/access-im-unternehmen.de\/#organization"},"image":{"@id":"https:\/\/access-im-unternehmen.de\/Anmeldung_an_SQL_Server_und_Co\/#primaryimage"},"thumbnailUrl":"http:\/\/vg06.met.vgwort.de\/na\/d1e5a55d976b4fabab14647fba80f4be","articleSection":["2009","3\/2009","L\u00f6sungen","SQL Server und Co."],"inLanguage":"de","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/access-im-unternehmen.de\/Anmeldung_an_SQL_Server_und_Co\/#respond"]}]},{"@type":"WebPage","@id":"https:\/\/access-im-unternehmen.de\/Anmeldung_an_SQL_Server_und_Co\/","url":"https:\/\/access-im-unternehmen.de\/Anmeldung_an_SQL_Server_und_Co\/","name":"Anmeldung an SQL Server und Co. - Access im Unternehmen","isPartOf":{"@id":"https:\/\/access-im-unternehmen.de\/#website"},"primaryImageOfPage":{"@id":"https:\/\/access-im-unternehmen.de\/Anmeldung_an_SQL_Server_und_Co\/#primaryimage"},"image":{"@id":"https:\/\/access-im-unternehmen.de\/Anmeldung_an_SQL_Server_und_Co\/#primaryimage"},"thumbnailUrl":"http:\/\/vg06.met.vgwort.de\/na\/d1e5a55d976b4fabab14647fba80f4be","datePublished":"2020-05-22T22:23:44+00:00","breadcrumb":{"@id":"https:\/\/access-im-unternehmen.de\/Anmeldung_an_SQL_Server_und_Co\/#breadcrumb"},"inLanguage":"de","potentialAction":[{"@type":"ReadAction","target":["https:\/\/access-im-unternehmen.de\/Anmeldung_an_SQL_Server_und_Co\/"]}]},{"@type":"ImageObject","inLanguage":"de","@id":"https:\/\/access-im-unternehmen.de\/Anmeldung_an_SQL_Server_und_Co\/#primaryimage","url":"http:\/\/vg06.met.vgwort.de\/na\/d1e5a55d976b4fabab14647fba80f4be","contentUrl":"http:\/\/vg06.met.vgwort.de\/na\/d1e5a55d976b4fabab14647fba80f4be"},{"@type":"BreadcrumbList","@id":"https:\/\/access-im-unternehmen.de\/Anmeldung_an_SQL_Server_und_Co\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/access-im-unternehmen.de\/"},{"@type":"ListItem","position":2,"name":"Anmeldung an SQL Server und Co."}]},{"@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\/55000668","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=55000668"}],"version-history":[{"count":0,"href":"https:\/\/access-im-unternehmen.de\/data\/wp\/v2\/posts\/55000668\/revisions"}],"wp:attachment":[{"href":"https:\/\/access-im-unternehmen.de\/data\/wp\/v2\/media?parent=55000668"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/access-im-unternehmen.de\/data\/wp\/v2\/categories?post=55000668"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/access-im-unternehmen.de\/data\/wp\/v2\/tags?post=55000668"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}