{"id":55001230,"date":"2020-04-01T00:00:00","date_gmt":"2020-07-10T09:40:31","guid":{"rendered":"http:\/\/access-im-unternehmen.aix-dev.de\/aiu\/?p=1230"},"modified":"-0001-11-30T00:00:00","modified_gmt":"-0001-11-30T00:00:00","slug":"MySQL_im_Web_Tools_fuer_das_AccessFrontend_Teil_1","status":"publish","type":"post","link":"https:\/\/access-im-unternehmen.de\/MySQL_im_Web_Tools_fuer_das_AccessFrontend_Teil_1\/","title":{"rendered":"MySQL im Web: Tools f&uuml;r das Access-Frontend, Teil 1"},"content":{"rendered":"<p><img loading=\"lazy\" decoding=\"async\" src=\"http:\/\/vg06.met.vgwort.de\/na\/2bf7efd45c6e4044a682da9b9afbcfec\" width=\"1\" height=\"1\" alt=\"\"><\/p>\n<p><b>Wenn Sie eine Datenbank von mehreren Standorten aus nutzen, aber nicht auf den Komfort der Access-Programmierung verzichten wollen, dann gibt es nicht viele M&ouml;glichkeiten. Sie k&ouml;nnen entweder eine SQL Server-Datenbank oder eine MySQL-Datenbank auf einem Internetserver ablegen und f&uuml;r den Zugriff von einer Access-Datenbank aus verf&uuml;gbar machen. Wie das gelingt, haben wir am Beispiel von MySQL in verschiedenen Beitr&auml;gen bereits dargestellt. Der vorliegende Beitrag schlie&szlig;t den Kreis und zeigt, wie Sie von einem Access-Frontend aus auf die MySQL-Datenbank auf dem Internetserver zugreifen und mit den Daten so arbeiten, als w&uuml;rden diese auf dem heimischen Rechner liegen. Wir starten mit einigen Tools, die den Zugriff erleichtern.<\/b><\/p>\n<p><b>Formular zum Zusammenstellen einer Verbindungszeichenfolge<\/b><\/p>\n<p>Um von Access aus auf eine MySQL-Datenbank zuzugreifen, ben&ouml;tigen Sie zuerst einmal eine Verbindungszeichenfolge. Um diese zusammenzustellen, wollen wir Ihnen ein praktisches Formular bereitstellen.<\/p>\n<p>In dieses geben Sie die ben&ouml;tigten Daten wie Serveradresse, Datenbankname, Benutzername, Kennwort oder Port ein und pr&uuml;fen, ob die Verbindung hergestellt werden kann. Damit das Formular komfortabel anzuwenden ist, ben&ouml;tigen wir einige Steuer-elemente, einige Zeilen VBA-Code und auch Tabellen, in denen wir die ermittelten Daten speichern &#8211; und auch grundlegende Daten wie die Informationen &uuml;ber die zur Auswahl stehenden Treiber.<\/p>\n<p><b>Treiber verwalten<\/b><\/p>\n<p>Bevor Sie &uuml;berhaupt von einer Access-Datenbank auf eine MySQL-Datenbank zugreifen k&ouml;nnen, ben&ouml;tigen Sie einen entsprechenden ODBC-Treiber.<\/p>\n<p>Diesen erhalten Sie vom Datenbankhersteller, in diesem Fall von der folgenden Webseite:<\/p>\n<pre>https:\/\/dev.mysql.com\/downloads\/connector\/odbc\/<\/pre>\n<p>Hier finden Sie ODBC-Treiber f&uuml;r verschiedene Versionen vor (siehe Bild 1).<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2020_02\/pic_1230_001.png\" alt=\"Download des ODBC-Treibers f&uuml;r MySQL\" width=\"649,559\" height=\"399,967\" \/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 1: Download des ODBC-Treibers f&uuml;r MySQL<\/span><\/b><\/p>\n<p>Wenn Sie bereits den Beitrag <b>Access-Datenbank zu MySQL migrieren <\/b>(<b>www.access-im-unternehmen.de\/1229<\/b>) gelesen haben, kennen Sie schon eine Herausforderung, die auch bei der Auswahl des geeigneten Treibers auf Sie zukommt: Sie m&uuml;ssen zwischen der 32-bit- und der 64-bit-Version w&auml;hlen.<\/p>\n<p>Wer dabei meint, er m&uuml;sse sich an der Windows-Version orientieren, die auf dem Zielrechner installiert ist, liegt falsch: Den MySQL-Treiber w&auml;hlen Sie wie die MySQL Workbench-Version anhand der Variante des installierten Office-Pakets aus. Haben Sie Office in der 32-bit-Version installiert, ben&ouml;tigen Sie also auch den entsprechenden ODBC-Treiber.<\/p>\n<p>Auf unserem Rechner ist die 32-bit-Variante von Office installiert, also w&auml;hlen wir von der obigen Seite den Download der Datei <b>mysql-connector-odbc-8.0.19-win32.msi<\/b>. Genau wie beim Download von MySQL Workbench ben&ouml;tigen Sie auch hier einen kostenlosen Zugang bei Oracle.<\/p>\n<p>Nach dem Download installieren wir den Treiber auch direkt. Hierbei k&ouml;nnen Sie die Standard-einstellungen beibehalten. Beachten Sie, dass Microsoft Access w&auml;hrend der Installation nicht gestartet sein darf.<\/p>\n<p>Nach der Installation k&ouml;nnen Sie auf folgende Weise pr&uuml;fen, ob Sie den richtigen Treiber installiert haben, je nachdem, ob Sie die 32-bit- oder die 64-bit-Version ben&ouml;tigen. Dazu geben Sie im Windows-Suchfeld <b>ODBC <\/b>ein und starten das dann erscheinende <b>ODBC-Datenquellen (32-bit)<\/b> oder <b>ODBC-Datenquellen (64-bit)<\/b>.<\/p>\n<p>In dieser Anwendung wechseln Sie auf die Seite <b>Treiber <\/b>und pr&uuml;fen, ob dort ein MySQL-ODBC-Treiber in der soeben installierten Version vorliegt &#8211; in unserem Fall die Version <b>8.0<\/b> (siehe Bild 2).<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2020_02\/pic_1230_002.png\" alt=\"Pr&uuml;fen, ob der richtige ODBC-Treiber installiert ist\" width=\"599,593\" height=\"424,9639\" \/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 2: Pr&uuml;fen, ob der richtige ODBC-Treiber installiert ist<\/span><\/b><\/p>\n<p><b>Speichern der Treiberinformationen<\/b><\/p>\n<p>Die verschiedenen ODBC-Treiber haben verschiedene Zeichenfolgen, die in der ODBC-Verbindungszeichenfolge zum Einsatz kommen. Damit wir diese nicht fest im Code verdrahten m&uuml;ssen, legen wir eine neue Tabelle namens <b>tblTreiber <\/b>an, mit der wir diese Zeichenketten speichern k&ouml;nnen.<\/p>\n<p>Diese Tabelle enth&auml;lt neben dem Prim&auml;rschl&uuml;sselfeld noch ein Feld namens <b>Treiber<\/b>, um die Zeichenfolge aufzunehmen, und ein Beschreibungsfeld.<\/p>\n<p>Den Entwurf sehen Sie in Bild 3. F&uuml;r eine &auml;ltere Version des MySQL-Treibers lautet diese Zeichenfolge so:<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2020_02\/pic_1230_003.png\" alt=\"Entwurf der Tabelle zum Speichern der Treiberinformationen\" width=\"499,6607\" height=\"355,7513\"\/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 3: Entwurf der Tabelle zum Speichern der Treiberinformationen<\/span><\/b><\/p>\n<pre>MySQL ODBC 5.3 ANSI Driver<\/pre>\n<p>Wir haben nun allerdings soeben die Version 8.0 des Treibers installiert und die obige Zeichenfolge wird nicht mehr funktionieren. Ob man die 5.3 einfach durch die 8.0 ersetzen kann, werden wir gleich herausfinden. Wir f&uuml;gen jedenfalls einfach mal einen Datensatz mit dieser Kombination hinzu (siehe Bild 4).<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2020_02\/pic_1230_004.png\" alt=\"Eintr&auml;ge der Tabelle tblTreiber\" width=\"549,6265\" height=\"173,1241\" \/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 4: Eintr&auml;ge der Tabelle tblTreiber<\/span><\/b><\/p>\n<p><b>Daten zu Verbindungs-zeichen-folgen speichern<\/b><\/p>\n<p>Eine Verbindungszeichenfolge erfordert allerdings noch einige weitere Informationen wie etwa den Server, den Datenbanknamen, den Benutzernamen, das Kennwort oder den Port.<\/p>\n<p>Diese wollen wir ebenfalls in einer Tabelle speichern, die wir <b>tblVerbindungszeichenfolgen <\/b>nennen und die im Entwurf wie in Bild 5 aussieht.<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2020_02\/pic_1230_005.png\" alt=\"Entwurfsansicht der Tabelle tblVerbindungszeichenfolgen\" width=\"649,559\" height=\"449,8858\" \/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 5: Entwurfsansicht der Tabelle tblVerbindungszeichenfolgen<\/span><\/b><\/p>\n<p><b>Formular zum Verwalten der Ver-bin-dungs-zeichen-folgen<\/b><\/p>\n<p>Damit der Benutzer die Daten dieser Tabelle komfortabel verwalten kann, stellen wir ihm ein Formular zur Verf&uuml;gung, das an die Tabelle <b>tblVerbindungszeichenfolgen <\/b>gebunden ist und wie in Bild 6 aussieht.<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2020_02\/pic_1230_006.png\" alt=\"Entwurfsansicht des Formulars frmVerbindungszeichenfolgen\" width=\"549,6265\" height=\"436,6024\" \/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 6: Entwurfsansicht des Formulars frmVerbindungszeichenfolgen<\/span><\/b><\/p>\n<p>Das Kombinationsfeld oben zeigt die Bezeichnungen aus der Tabelle <b>tblVerbindungszeichenfolgen <\/b>an und stellt die gew&auml;hlte Verbindungszeichenfolge ein. Daf&uuml;r sorgt diese Ereignisprozedur:<\/p>\n<pre><span style=\"color:blue;\">Private Sub <\/span>cboSchnellauswahl_AfterUpdate()\r\n     Me.Recordset.FindFirst  \"VerbindungszeichenfolgeID = \"  & Me!cboSchnellauswahl\r\n<span style=\"color:blue;\">End Sub<\/span><\/pre>\n<p>In die meisten der &uuml;brigen Steuer-ele-mente gibt der Benutzer die gew&uuml;nschten Werte einfach ein. Diese sind an die entsprechenden Felder der Datensatzquelle des Formulars gebunden.<\/p>\n<p>Es gibt folgende Ausnahmen:<\/p>\n<ul>\n<li><b>cboDatenbank<\/b>: Dient zur Auswahl einer der Datenbanken auf dem Server.<\/li>\n<li><b>cboTreiberID<\/b>: Dient zur Auswahl des Treibers aus der Tabelle <b>tblTreiber<\/b>.<\/li>\n<\/ul>\n<p><b>Datenbanken einlesen und ausw&auml;hlen<\/b><\/p>\n<p>Das Kombinationsfeld <b>cboDatenbank <\/b>soll die Auswahl einer der Datenbanken auf dem im Feld <b>Server <\/b>angegebenen Server erm&ouml;glichen.<\/p>\n<p>Dies ist allerdings erst m&ouml;glich, wenn die Datenbanken eingelesen wurden. Dazu bet&auml;tigt man die Schaltfl&auml;che rechts neben dem Kombinationsfeld. <\/p>\n<p>Die Schaltfl&auml;che hei&szlig;t <b>cmdDatenbankenEinlesen <\/b>und l&ouml;st die Prozedur aus Listing 1 aus.<\/p>\n<pre><span style=\"color:blue;\">Private Sub <\/span>cmdDatenbankenEinlesen_Click()\r\n     <span style=\"color:blue;\">If <\/span><span style=\"color:blue;\">Len<\/span>(Nz(Me!txtServer)) = 0<span style=\"color:blue;\"> Then<\/span>\r\n         <span style=\"color:blue;\">MsgBox<\/span> \"Bitte geben Sie den Namen des MySQL-Servers ein.\"\r\n         Me!txtServer.SetFocus\r\n         <span style=\"color:blue;\">Exit Sub<\/span>\r\n     <span style=\"color:blue;\">End If<\/span>\r\n     <span style=\"color:blue;\">If <\/span><span style=\"color:blue;\">Len<\/span>(Nz(Me!cboTreiberID)) = 0<span style=\"color:blue;\"> Then<\/span>\r\n         <span style=\"color:blue;\">MsgBox<\/span> \"Bitte w&auml;hlen Sie einen Treiber aus.\"\r\n         Me!cboTreiberID.SetFocus\r\n         <span style=\"color:blue;\">Exit Sub<\/span>\r\n     <span style=\"color:blue;\">End If<\/span>\r\n     <span style=\"color:blue;\">If <\/span><span style=\"color:blue;\">Len<\/span>(Nz(Me!txtBenutzername)) = 0<span style=\"color:blue;\"> Then<\/span>\r\n         <span style=\"color:blue;\">MsgBox<\/span> \"Bitte geben Sie einen Benutzernamen ein.\"\r\n         Me!txtBenutzername.SetFocus\r\n         <span style=\"color:blue;\">Exit Sub<\/span>\r\n     <span style=\"color:blue;\">End If<\/span>\r\n     <span style=\"color:blue;\">If <\/span><span style=\"color:blue;\">Len<\/span>(Nz(Me!txtKennwort)) = 0<span style=\"color:blue;\"> Then<\/span>\r\n         <span style=\"color:blue;\">MsgBox<\/span> \"Bitte geben Sie ein Kennwort ein.\"\r\n         Me!txtKennwort.SetFocus\r\n         <span style=\"color:blue;\">Exit Sub<\/span>\r\n     <span style=\"color:blue;\">End If<\/span>\r\n     <span style=\"color:blue;\">Set<\/span> Me!cboDatenbank.Recordset = DatenbankenEinlesen\r\n<span style=\"color:blue;\">End Sub<\/span><\/pre>\n<p><b><span style=\"color:darkgrey;\">Listing 1: Die Prozedur cmdDatenbankenEinlesen_Click<\/span><\/b><\/p>\n<p>Diese fragt ab, ob der Benutzer bereits Daten in die vier Steuer-elemente <b>txtServer<\/b>, <b>cboTreiber<\/b>, <b>txtBenutzername <\/b>und <b>txtKennwort <\/b>eingegeben hat.<\/p>\n<p>Fehlen die Daten in einem dieser Felder, erscheint eine Meldung, welches Feld noch gef&uuml;llt werden muss, und das entsprechende Steuer-element erh&auml;lt den Fokus. Dann wird die Prozedur beendet. Erst, wenn alle Felder gef&uuml;llt sind, wird die Funktion <b>DatenbankenEinlesen <\/b>aufgerufen und das Ergebnis der Eigenschaft <b>Recordset <\/b>des Kombinationsfeldes <b>cboDatenbank <\/b>zugewiesen.<\/p>\n<p>Die Funktion <b>DatenbankenEinlesen <\/b>finden Sie in Listing 2. Die Funktion schreibt die Verbindungszeichenfolge, die zuvor mit der Funktion <b>VerbindungszeichenfolgeDatenbanken <\/b>zusammengestellt wurde, in die Variable <b>strVerbindungszeichenfolge<\/b>.<\/p>\n<pre><span style=\"color:blue;\">Private Function <\/span>DatenbankenEinlesen()<span style=\"color:blue;\"> As <\/span>Recordset\r\n     <span style=\"color:blue;\">Dim <\/span>strSQL<span style=\"color:blue;\"> As String<\/span>\r\n     <span style=\"color:blue;\">Dim <\/span>qdf<span style=\"color:blue;\"> As <\/span>DAO.QueryDef\r\n     <span style=\"color:blue;\">Dim <\/span>strVerbindungszeichenfolge<span style=\"color:blue;\"> As String<\/span>\r\n     strVerbindungszeichenfolge = Me!txtVerbindungszeichenfolge\r\n     strSQL = \"SHOW DATABASES\"\r\n     <span style=\"color:blue;\">Set<\/span> qdf = QueryDefErstellen(strSQL, strVerbindungszeichenfolge)\r\n     On Error Resume <span style=\"color:blue;\">Next<\/span>\r\n     DoCmd.Hourglass <span style=\"color:blue;\">True<\/span>\r\n     <span style=\"color:blue;\">Set<\/span> DatenbankenEinlesen = qdf.OpenRecordset\r\n     DoCmd.Hourglass <span style=\"color:blue;\">False<\/span>\r\n     <span style=\"color:blue;\">If <\/span><span style=\"color:blue;\">Not<\/span> Err.Number = 0<span style=\"color:blue;\"> Then<\/span>\r\n         <span style=\"color:blue;\">MsgBox<\/span> \"Die Verbindung konnte nicht hergestellt werden:\" & <span style=\"color:blue;\">vbCrLf<\/span> & Err.Number & \" \" & Err.Description\r\n     <span style=\"color:blue;\">End If<\/span>\r\n<span style=\"color:blue;\">End Function<\/span><\/pre>\n<p><!--30percent--><\/p>\n<p><b><span style=\"color:darkgrey;\">Listing 2: Die Prozedur DatenbankenEinlesen<\/span><\/b><\/p>\n<p>In die Variable <b>strSQL <\/b>f&uuml;llen wir eine f&uuml;r Access- und SQL Server-gew&ouml;hnte Augen etwas ungew&ouml;hnliche Abfrage, n&auml;mlich die folgende:<\/p>\n<pre>SHOW DATABASES<\/pre>\n<p>Damit k&ouml;nnen Sie unter MySQL eine Liste aller Datenbanken des aktuellen Servers ausgeben lassen. Mit <b>strVerbindungszeichenfolge <\/b>und <b>strSQL <\/b>f&uuml;llen wir dann &uuml;ber die Funktion <b>QueryDefErstellen <\/b>ein neues <b>QueryDef<\/b>-Objekt namens <b>qdf<\/b>.<\/p>\n<p>Dieses f&uuml;hren wir mit der <b>OpenRecordset<\/b>-Methode aus und geben das Ergebnis als Funktionswert zur&uuml;ck.<\/p>\n<p>Die Funktion <b>VerbindungszeichenfolgeDatenbanken <\/b>liefert eine Verbindungszeichenfolge, die aus den Inhalten der Steuer-elemente <b>txtServer<\/b>, <b>cboTreiber<\/b>, <b>txtBenutzername <\/b>und <b>txtKennwort <\/b>zusammenstellt wird:<\/p>\n<pre><span style=\"color:blue;\">Private Function <\/span>VerbindungszeichenfolgeDatenbanken() <span style=\"color:blue;\"> As String<\/span>\r\n     <span style=\"color:blue;\">Dim <\/span>strTemp<span style=\"color:blue;\"> As String<\/span>\r\n     strTemp = \"ODBC;DRIVER={\"  & Me!cboTreiberID.Column(1) & \"};\"\r\n     strTemp = strTemp & \"SERVER=\" & Me!txtServer & \";\"\r\n     strTemp = strTemp & \"UID=\" & strBenutzername & \";\"\r\n     strTemp = strTemp & \"PWD=\" & strKennwort & \";\"\r\n     VerbindungszeichenfolgeDatenbanken = strTemp\r\n<span style=\"color:blue;\">End Function<\/span><\/pre>\n<p>Das Ergebnis ist eine Verbindungszeichenfolge ohne die Angabe einer Datenbank, mit der wir die <b>SHOW DATABASES<\/b>-Abfrage aufrufen k&ouml;nnen und das Ergebnis an das Kombinationsfeld <b>cboDatenbanken <\/b>weitergeben.<\/p>\n<p>Damit kann der Benutzer dann wie in Bild 7 die gew&uuml;nschte Datenbank ausw&auml;hlen. Mit der Auswahl l&ouml;st er dann die folgende Prozedur aus, welche wiederum die Prozedur <b>VerbindungszeichenfolgeErmitteln <\/b>nutzt, um die neue Verbindungszeichenfolge in das Textfeld <b>txtVerbindungszeichenfolge <\/b>zu schreiben:<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2020_02\/pic_1230_007.png\" alt=\"Auswahl der Datenbank\" width=\"499,6607\" height=\"396,9112\" \/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 7: Auswahl der Datenbank<\/span><\/b><\/p>\n<pre><span style=\"color:blue;\">Private Sub <\/span>cboDatenbank_AfterUpdate()\r\n     Me!txtVerbindungszeichenfolge =  VerbindungszeichenfolgeErmitteln( Nz(Me!cboDatenbank))\r\n<span style=\"color:blue;\">End Sub<\/span><\/pre>\n<p>Die Funktion <b>VerbindungszeichenfolgeErmitteln <\/b>finden Sie in Listing 3. Diese Prozedur stellt eine Verbindungszeichenfolge &auml;hnlich der zusammen, die wir f&uuml;r das Einlesen der Datenbanken des aktuellen Servers genutzt haben.<\/p>\n<pre><span style=\"color:blue;\">Private Function <\/span>VerbindungszeichenfolgeErmitteln()<span style=\"color:blue;\"> As String<\/span>\r\n     <span style=\"color:blue;\">Dim <\/span>strTemp<span style=\"color:blue;\"> As String<\/span>\r\n     strTemp = \"ODBC;DRIVER={\" & Me!cboTreiberID.Column(1) & \"};\"\r\n     strTemp = strTemp & \"SERVER=\" & Nz(Me!txtServer, \"\") & \";\"\r\n     strTemp = strTemp & \"DATABASE=\" & Nz(Me!Datenbank, \"\") & \";\"\r\n     strTemp = strTemp & \"UID=\" & Nz(Me!txtBenutzername, \"\") & \";\"\r\n     strTemp = strTemp & \"PWD=\" & Nz(Me!txtKennwort, \"\") & \";\"\r\n     <span style=\"color:blue;\">If <\/span>Me!chkLog<span style=\"color:blue;\"> Then<\/span>\r\n         strTemp = strTemp & \"OPTION=4;\"\r\n     <span style=\"color:blue;\">End If<\/span>\r\n     VerbindungszeichenfolgeErmitteln = strTemp\r\n<span style=\"color:blue;\">End Function<\/span><\/pre>\n<p><b><span style=\"color:darkgrey;\">Listing 3: Die Funktion VerbindungszeichenfolgeErmitteln<\/span><\/b><\/p>\n<p>Sie pr&uuml;ft allerdings noch einige Felder auf <b>NULL<\/b>-Werte, da sie auch noch von anderen Stellen aus aufgerufen wird, bei denen es noch keine Voraussetzung ist, dass die betroffenen Felder bereits gef&uuml;llt sind.<\/p>\n<p>Das Ergebnis ist eine Verbindungszeichenfolge wie die folgende:<\/p>\n<pre>ODBC;DRIVER={MySQL ODBC 8.0 ANSI Driver};SERVER=173.249.57.105;DATABASE=Zeiterfassung;UID=mein-dbnutzer;PWD=kennwort;OPTION=4;<\/pre>\n<p>Hier ist also zus&auml;tzlich noch der Datenbankname enthalten.<\/p>\n<p><b>Aktualisierung der Verbindungszeichenfolge<\/b><\/p>\n<p>Wenn der Benutzer eine der Informationen &auml;ndert, die mit in die Verbindungszeichenfolge einflie&szlig;en, dann muss diese aktualisiert werden.<\/p>\n<p>Das hei&szlig;t, dass wir immer dann, wenn der Benutzer eines der Steuer-elemente <b>txtServer<\/b>, <b>txtPort<\/b>, <b>cboDatenbanken<\/b>, <b>txtBenutzername<\/b>, <b>txtKennwort<\/b>, <b>cboTreiber <\/b>oder <b>chkLog <\/b>&auml;ndert, die Verbindungszeichenfolge erneut ermitteln m&uuml;ssen. <\/p>\n<p>Dazu werden die folgenden Ereignisprozeduren f&uuml;r diese Steuer-elemente hinterlegt:<\/p>\n<pre><span style=\"color:blue;\">Private Sub <\/span>cboDatenbank_AfterUpdate()\r\n     Me!txtVerbindungszeichenfolge =  VerbindungszeichenfolgeErmitteln()\r\n<span style=\"color:blue;\">End Sub<\/span>\r\n<span style=\"color:blue;\">Private Sub <\/span>chkLog_AfterUpdate()\r\n     Me!txtVerbindungszeichenfolge =  VerbindungszeichenfolgeErmitteln()\r\n<span style=\"color:blue;\">End Sub<\/span>\r\n<span style=\"color:blue;\">Private Sub <\/span>cboTreiberID_AfterUpdate()\r\n     Me!txtVerbindungszeichenfolge =  VerbindungszeichenfolgeErmitteln()\r\n<span style=\"color:blue;\">End Sub<\/span>\r\n<span style=\"color:blue;\">Private Sub <\/span>txtBenutzername_AfterUpdate()\r\n     Me!txtVerbindungszeichenfolge =  VerbindungszeichenfolgeErmitteln()\r\n<span style=\"color:blue;\">End Sub<\/span>\r\n<span style=\"color:blue;\">Private Sub <\/span>txtKennwort_AfterUpdate()\r\n     Me!txtVerbindungszeichenfolge =  VerbindungszeichenfolgeErmitteln()\r\n<span style=\"color:blue;\">End Sub<\/span>\r\n<span style=\"color:blue;\">Private Sub <\/span>txtServer_AfterUpdate()\r\n     Me!txtVerbindungszeichenfolge =  VerbindungszeichenfolgeErmitteln()\r\n<span style=\"color:blue;\">End Sub<\/span><\/pre>\n<p>Diese rufen jeweils erneut die Funktion <b>VerbindungszeichenfolgeErmitteln <\/b>auf und f&uuml;llen das Textfeld <b>txtVerbindungszeichenfolge <\/b>mit der aktuellen Verbindungszeichenfolge.<\/p>\n<p><b>Verbindungszeichenfolge testen<\/b><\/p>\n<p>Die erste Schaltfl&auml;che neben der Schaltfl&auml;che <b>OK <\/b>hei&szlig;t <b>cmdTesten <\/b>und soll die Verbindungszeichenfolge f&uuml;r die Verbindung zur Datenbank testen. Sie l&ouml;st die Prozedur aus Listing 4 aus.<\/p>\n<pre><span style=\"color:blue;\">Private Sub <\/span>cmdTesten_Click()\r\n     Me.Dirty = <span style=\"color:blue;\">False<\/span>\r\n     <span style=\"color:blue;\">If <\/span>VerbindungTesten(Me!VerbindungszeichenfolgeID, Me!txtVerbindungszeichenfolge) = <span style=\"color:blue;\">True<\/span><span style=\"color:blue;\"> Then<\/span>\r\n         <span style=\"color:blue;\">MsgBox<\/span> \"Die Verbindung wurde erfolgreich hergestellt.\"\r\n     <span style=\"color:blue;\">Else<\/span>\r\n         <span style=\"color:blue;\">MsgBox<\/span> \"Die Verbindung konnte nicht hergestellt werden.\"\r\n     <span style=\"color:blue;\">End If<\/span>\r\n<span style=\"color:blue;\">End Sub<\/span><\/pre>\n<p><b><span style=\"color:darkgrey;\">Listing 4: Testen der Verbindungszeichenfolge<\/span><\/b><\/p>\n<p>Diese Prozedur ruft eine weitere Prozedur namens <b>VerbindungTesten <\/b>auf. Diese finden Sie in Listing 5. Die Funktion erwartet den Prim&auml;rschl&uuml;sselwert der Verbindungszeichenfolge aus der Tabelle <b>tblVerbindungszeichenfolgen <\/b>und liefert einen Wert des Typs <b>Boolean <\/b>zur&uuml;ck sowie &uuml;ber den Parameter <b>strVerbindungszeichenfolge <\/b>die ermittelte Verbindungszeichenfolge.<\/p>\n<pre><span style=\"color:blue;\">Public Function <\/span>VerbindungTesten(lngVerbindungszeichenfolgeID<span style=\"color:blue;\"> As Long<\/span>, <span style=\"color:blue;\">Optional<\/span> strVerbindungszeichenfolge<span style=\"color:blue;\"> As String<\/span>) _\r\n        <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     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)<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>LogindatenErmitteln(lngVerbindungszeichenfolgeID) = <span style=\"color:blue;\">True<\/span><span style=\"color:blue;\"> Then<\/span>\r\n             strVerbindungszeichenfolge = VerbindungszeichenfolgeNachID(lngVerbindungszeichenfolgeID, <span style=\"color:blue;\">True<\/span>)\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;\">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 5: Die Funktion VerbindungTesten<\/span><\/b><\/p>\n<p>Die Funktion ermittelt zun&auml;chst den Benutzernamen und das Kennwort aus den beiden Feldern <b>Benutzername <\/b>und <b>Kennwort <\/b>der Tabelle <b>tblVerbindungszeichenfolgen<\/b>. Gegebenenfalls sind diese Werte bereits in den beiden Variablen <b>strBenutzer <\/b>und <b>strKennwort <\/b>gespeichert, die &uuml;ber ein weiteres Formular namens <b>frmLogin <\/b>gef&uuml;llt werden k&ouml;nnten, das wir an dieser Stelle aber nicht weiter beschreiben wollen.<\/p>\n<p>Dieses Formular wird &uuml;ber die Funktion <b>Logindaten-Ermitteln <\/b>aufgerufen, falls eine der beiden Variablen <b>strBenutzername <\/b>oder <b>strKennwort <\/b>nach diesem Schritt leer sein sollten. K&ouml;nnen diese Daten auch in diesem Dialog nicht ermittelt werden, wird die Funktion mit dem Wert <b>False <\/b>beendet. Anderenfalls ermittelt sie &uuml;ber eine weitere Funktion namens <b>VerbindungszeichenfolgeNachID<\/b> die Verbindungszeichenfolge, die dann in der Variablen <b>strVerbindungszeichenfolge <\/b>landet.<\/p>\n<p>Der erste Test der Verbindung erfolgt dann &uuml;ber den Aufruf einer Funktion namens <b>VerbindungHerstellen<\/b>, die wie in Listing 6 aussieht. Diese erstellt ein tempor&auml;res <b>QueryDef<\/b>-Objekt, das mit der Verbindungszeichenfolge f&uuml;r die Eigenschaft <b>Connect <\/b>und mit einer einfachen SQL-Abfrage wie <b>SELECT 1 AS Text <\/b>gef&uuml;llt wird. Diese wird per <b>OpenRecordset<\/b>-Methode ge&ouml;ffnet und wenn hier kein Fehler auftritt, wurde die Verbindung erfolgreich hergestellt und die Funktion kann den Wert <b>True <\/b>zur&uuml;ckliefern.<\/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 6: Die Funktion VerbindungHerstellen<\/span><\/b><\/p>\n<p>Damit geht es weiter in der Funktion <b>VerbindungTesten<\/b>, die nun entweder in der Variablen <b>bolVerbindungHergestellt <\/b>einen erfolgreichen Verbindungsversuch vermerkt hat oder auch nicht.<\/p>\n<p>Im letzteren Fall steigt die Funktion in eine <b>Do While<\/b>-Schleife ein, die erst dann verlassen wird, wenn <b>bolVerbindungHergestellt <\/b>den Wert <b>True <\/b>hat oder die Funktion mit <b>Exit Function <\/b>komplett verlassen wird. In der Schleife wird jeweils die Funktion <b>LoginDatenErmitteln <\/b>aufgerufen, um gegebenenfalls funktionierende Logindaten zu ermitteln.<\/p>\n<p>Liefert diese neue Daten zur&uuml;ck, werden diese ausprobiert, anderenfalls kann der Dialog auch endlos weiter aufgerufen werden. Erst, wenn der Benutzer den Dialog mit der <b>Abbrechen<\/b>-Schaltfl&auml;che abbricht, wird auch die Schleife verlassen und damit gleichzeitig auch die Funktion &#8211; dann mit dem Wert <b>False <\/b>als Ergebnis.<\/p>\n<p><b>Standardverbindung festlegen<\/b><\/p>\n<p>Mit der Schaltfl&auml;che <b>Als Standard <\/b>k&ouml;nnen Sie die Standardverbindung festlegen, die von der aktuellen Access-Datenbank aus verwendet werden soll. Diese Schaltfl&auml;che l&ouml;st die Ereignisprozedur aus Listing 7 aus.<\/p>\n<pre><span style=\"color:blue;\">Private Sub <\/span>cmdAlsStandard_Click()\r\n     <span style=\"color:blue;\">Dim <\/span>db<span style=\"color:blue;\"> As <\/span>DAO.Database\r\n     <span style=\"color:blue;\">Set<\/span> db = CurrentDb\r\n     db.Execute \"UPDATE tblVerbindungszeichenfolgen SET Aktiv = 0\", dbFailOnError\r\n     db.Execute \"UPDATE tblVerbindungszeichenfolgen SET Aktiv = -1 WHERE VerbindungszeichenfolgeID = \" _\r\n         & Me!VerbindungszeichenfolgeID, dbFailOnError\r\n     Me!cmdAlsStandard.Enabled = <span style=\"color:blue;\">False<\/span>\r\n<span style=\"color:blue;\">End Sub<\/span><\/pre>\n<p><b><span style=\"color:darkgrey;\">Listing 7: Die Funktion zum Einstellen einer Verbindung als Standardverbindung<\/span><\/b><\/p>\n<p>Die Prozedur stellt den Wert des Feldes <b>Aktiv <\/b>f&uuml;r alle Datens&auml;tze der Tabelle <b>tblVerbindungszeichenfolgen <\/b>auf den Wert <b>0 <\/b>ein, also <b>False<\/b>. Danach legt sie f&uuml;r die Verbindungszeichenfolge, f&uuml;r welche die Schaltfl&auml;che <b>cmdAlsStandard <\/b>angeklickt wurde, den Wert des Feldes <b>Aktiv <\/b>auf <b>-1 <\/b>fest.<\/p>\n<p>Damit die Schaltfl&auml;che gar nicht erst aktiviert ist, wenn die aktuell angezeigte Verbindungszeichenfolge schon als Standard definiert ist, aktivieren oder deaktivieren wir diese Schaltfl&auml;che in der Ereignisprozedur, die durch das Ereignis <b>Beim Anzeigen <\/b>des Formulars ausgel&ouml;st wird.<\/p>\n<pre><span style=\"color:blue;\">Private Sub <\/span>Form_Current()\r\n     Me!cmdAlsStandard.Enabled = Nz(Me!Aktiv, 0) = 0\r\n<span style=\"color:blue;\">End Sub<\/span><\/pre>\n<p>Die Schaltfl&auml;che <b>cmdKopieren <\/b>soll eine Kopie auf Basis der aktuell angezeigten Verbindungszeichenfolge erstellen. Dazu l&ouml;st sie die Ereignisprozedur aus Listing 8 aus.<\/p>\n<pre><span style=\"color:blue;\">Private Sub <\/span>Private Sub cmdKopierenAls_Click()\r\n     <span style=\"color:blue;\">Dim <\/span>db<span style=\"color:blue;\"> As <\/span>DAO.Database\r\n     <span style=\"color:blue;\">Dim <\/span>strBezeichnung<span style=\"color:blue;\"> As String<\/span>\r\n     <span style=\"color:blue;\">Dim <\/span>lngVerbindungszeichenfolgeID<span style=\"color:blue;\"> As Long<\/span>\r\n     <span style=\"color:blue;\">Set<\/span> db = CurrentDb\r\n     strBezeichnung = InputBox(\"Geben Sie die Bezeichnung der Verbindungszeichenfolge ein.\", _\r\n         \"Verbindungszeichenfolge kopieren\", \"Kopie von \" & Me!Bezeichnung)\r\n     <span style=\"color:blue;\">If <\/span><span style=\"color:blue;\">Not<\/span> <span style=\"color:blue;\">Len<\/span>(strBezeichnung) = 0<span style=\"color:blue;\"> Then<\/span>\r\n         <span style=\"color:blue;\">If <\/span>IsNull(DLookup(\"Bezeichnung\", \"tblVerbindungszeichenfolgen\", \"Bezeichnung = ''\"))<span style=\"color:blue;\"> Then<\/span>\r\n             db.Execute \"INSERT INTO tblVerbindungszeichenfolgen SELECT '\" & strBezeichnung _\r\n                 & \"' AS Bezeichnung, Server, Datenbank, Benutzername, Kennwort, TreiberID, Verbindungszeichenfolge, \" _\r\n                 & \"Port FROM tblVerbindungszeichenfolgen WHERE VerbindungszeichenfolgeID = \" _\r\n                 & Me!VerbindungszeichenfolgeID, dbFailOnError\r\n             lngVerbindungszeichenfolgeID = db.OpenRecordset(\"SELECT @@IDENTITY\").Fields(0)\r\n             Me.Requery\r\n             Me.Recordset.FindFirst \"VerbindungszeichenfolgeID = \" & lngVerbindungszeichenfolgeID\r\n             Me!cboSchnellauswahl.Requery\r\n             Me!cboSchnellauswahl = lngVerbindungszeichenfolgeID\r\n         <span style=\"color:blue;\">Else<\/span>\r\n             <span style=\"color:blue;\">MsgBox<\/span> \"Es ist bereits eine Verbindungszeichenfolge namens '\" & strBezeichnung & \"' vorhanden.\"\r\n         <span style=\"color:blue;\">End If<\/span>\r\n     <span style=\"color:blue;\">End If<\/span>\r\n<span style=\"color:blue;\">End Sub<\/span><\/pre>\n<p><b><span style=\"color:darkgrey;\">Listing 8: Prozedur zum Kopieren von Verbindungszeichenfolgen<\/span><\/b><\/p>\n<p>Diese nimmt zun&auml;chst &uuml;ber eine InputBox die gew&uuml;nschte Bezeichnung f&uuml;r die neue Verbindungszeichenfolge entgegen. Wenn die InputBox nicht leer geschlossen wird, wird der Hauptteil der Prozedur in der ersten <b>If&#8230;Then<\/b>-Bedingung durchgef&uuml;hrt.<\/p>\n<p>Hier pr&uuml;ft die Prozedur in einer weiteren <b>If&#8230;Then<\/b>-Bedingung, ob die angegebene Bezeichnung bereits vorhanden ist. Falls ja, wird die Prozedur mit einer entsprechenden Meldung beendet.<\/p>\n<p>Ist allerdings noch keine gleichnamige Verbindungszeichenfolge vorhanden, legt die Prozedur mit einer entsprechenden <b>INSERT INTO<\/b>-Anweisung die Kopie der Verbindungszeichenfolge in einem neuen Datensatz an. Dann ermittelt sie den Wert des Prim&auml;rschl&uuml;sselwertes dieses Datensatzes.<\/p>\n<p>Sie aktualisiert die Datensatzquelle des Formulars, stellt dieses auf den neu angelegten Datensatz ein und erledigt das Gleiche auch f&uuml;r das Kombinationsfeld. So wird die neue Verbindungszeichenfolge dann direkt nach dem Anlegen auch angezeigt.<\/p>\n<p><b>L&ouml;schen einer Verbindungszeichenfolge<\/b><\/p>\n<p>Mit der Schaltfl&auml;che <b>cmdLoeschen <\/b>k&ouml;nnen Sie die aktuell angezeigte Verbindungszeichenfolge aus der Tabelle <b>tblVerbindungszeichenfolgen <\/b>entfernen. Diese Schaltfl&auml;che ruft die folgende Prozedur auf:<\/p>\n<pre><span style=\"color:blue;\">Private Sub <\/span>cmdLoeschen_Click()\r\n     RunCommand acCmdDeleteRecord\r\n     Me.Requery\r\n     Me!cboSchnellauswahl.Requery\r\n     Me!cboSchnellauswahl = Nz(Me!VerbindungszeichenfolgeID)\r\n<span style=\"color:blue;\">End Sub<\/span><\/pre>\n<p><b>Anlegen einer neuen Verbindungszeichenfolge<\/b><\/p>\n<p>Wenn Sie eine neue Verbindungszeichenfolge anlegen wollen, ohne diese auf einer vorhandenen Verbindungszeichenfolge aufzubauen, k&ouml;nnen Sie einfach die Schaltfl&auml;che <b>Neu <\/b>bet&auml;tigen, welche die folgende Ereignisprozedur ausl&ouml;st:<\/p>\n<pre><span style=\"color:blue;\">Private Sub <\/span>cmdNeu_Click()\r\n     DoCmd.GoToRecord Record:=acNewRec\r\n<span style=\"color:blue;\">End Sub<\/span><\/pre>\n<p><b>Andere Verbindungszeichenfolge ausw&auml;hlen<\/b><\/p>\n<p>Das eingangs beschriebene Kombinationsfeld <b>cbo-Schnell-auswahl <\/b>erlaubt das Ausw&auml;hlen einer der Bezeichnungen der vorhandenen Verbindungszeichenfolgen.<\/p>\n<p>Dadurch wird das Recordset des Formulars auf die gew&auml;hlte Verbindungszeichenfolge eingestellt:<\/p>\n<pre><span style=\"color:blue;\">Private Sub <\/span>cboSchnellauswahl_AfterUpdate()\r\n     Me.Recordset.FindFirst \"VerbindungszeichenfolgeID = \"  & Me!cboSchnellauswahl\r\n<span style=\"color:blue;\">End Sub<\/span><\/pre>\n<p>Schlie&szlig;lich kann es auch sein, dass wir das Formular <b>frmVerbindungszeichenfolgen <\/b>von einem anderen Formular aus &ouml;ffnen, um damit direkt eine bestimmte Zeichenfolge anzuzeigen &#8211; zum Beispiel vom Formular <b>frmTabellenVerknuepfen <\/b>aus, das wir im zweiten Teil dieser Beitragsreihe beschreiben.<\/p>\n<p>Deshalb f&uuml;gen wir zu der Ereignisprozedur, die beim Laden des Formulars ausgel&ouml;st wird, eine Pr&uuml;fung hinzu, ob beim Aufruf des Formulars ein &Ouml;ffnungsparameter &uuml;bergeben wurde, der angibt, welche Verbindungszeichenfolge nun angezeigt werden soll.<\/p>\n<pre><span style=\"color:blue;\">Private Sub <\/span>Form_Load()\r\n     <span style=\"color:blue;\">If <\/span><span style=\"color:blue;\">Not<\/span> IsNull(Me.OpenArgs)<span style=\"color:blue;\"> Then<\/span>\r\n         Me.Recordset.FindFirst  \"VerbindungszeichenfolgeID = \" & Me.OpenArgs\r\n     <span style=\"color:blue;\">End If<\/span>\r\n<span style=\"color:blue;\">End Sub<\/span><\/pre>\n<p><b>Zusammenfassung und Ausblick<\/b><\/p>\n<p>Im zweiten Teil dieser Beitragsreihe schauen wir uns noch einen Dialog an, mit dem Sie die Tabellen der MySQL-Datenbank &uuml;ber die Verbindungszeichenfolge aus dem Formular <b>frmVerbindungszeichenfolgen <\/b>verkn&uuml;pfen k&ouml;nnen. So stehen diese wie lokale Access-Tabellen im Navigationsbereich von Access zur Verf&uuml;gung und Sie k&ouml;nnen diese beispielsweise in der Datenblattansicht &ouml;ffnen.<\/p>\n<p>Oder Sie geben die dort verkn&uuml;pften Tabellen als Quelle von Abfragen oder von Formularen, Berichten oder Steuer-elementen an.<\/p>\n<p>In weiteren Beitr&auml;gen schauen wir uns dann an, wie Sie von einer Access-Anwendung aus optimal mit den Daten einer MySQL-Datenbank arbeiten k&ouml;nnen.<\/p>\n<h3>Downloads zu diesem Beitrag<\/h3>\n<p>Enthaltene Beispieldateien:<\/p>\n<p>MySQLTools.accdb<\/p>\n<p><a href=\"..\/fileadmin\/beispiele\/7DBD50ED-EC2F-4FDB-A219-236F295CD6B8\/aiu_1230.zip\">Download<\/a><\/p>\n","protected":false},"excerpt":{"rendered":"<p>Wenn Sie eine Datenbank von mehreren Standorten aus nutzen, aber nicht auf den Komfort der Access-Programmierung verzichten wollen, dann gibt es nicht viele M&ouml;glichkeiten. Sie k&ouml;nnen entweder eine SQL Server-Datenbank oder eine MySQL-Datenbank auf einem Internetserver ablegen und f&uuml;r den Zugriff von einer Access-Datenbank aus verf&uuml;gbar machen. Wie das gelingt, haben wir am Beispiel von MySQL in verschiedenen Beitr&auml;gen bereits dargestellt. Der vorliegende Beitrag schlie&szlig;t den Kreis und zeigt, wie Sie von einem Access-Frontend aus auf die MySQL-Datenbank auf dem Internetserver zugreifen und mit den Daten so arbeiten, als w&uuml;rden diese auf dem heimischen Rechner liegen. Wir starten mit einigen Tools, die den Zugriff erleichtern.<\/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":[66022020,662020,44000022],"tags":[],"class_list":["post-55001230","post","type-post","status-publish","format-standard","hentry","category-66022020","category-662020","category-SQL_Server_und_Co"],"yoast_head":"<!-- This site is optimized with the Yoast SEO Premium plugin v20.9 (Yoast SEO v27.4) - https:\/\/yoast.com\/product\/yoast-seo-premium-wordpress\/ -->\n<title>MySQL im Web: Tools f&uuml;r das Access-Frontend, Teil 1 - 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\/MySQL_im_Web_Tools_fuer_das_AccessFrontend_Teil_1\/\" \/>\n<meta property=\"og:locale\" content=\"de_DE\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"MySQL im Web: Tools f&uuml;r das Access-Frontend, Teil 1\" \/>\n<meta property=\"og:description\" content=\"Wenn Sie eine Datenbank von mehreren Standorten aus nutzen, aber nicht auf den Komfort der Access-Programmierung verzichten wollen, dann gibt es nicht viele M&ouml;glichkeiten. Sie k&ouml;nnen entweder eine SQL Server-Datenbank oder eine MySQL-Datenbank auf einem Internetserver ablegen und f&uuml;r den Zugriff von einer Access-Datenbank aus verf&uuml;gbar machen. Wie das gelingt, haben wir am Beispiel von MySQL in verschiedenen Beitr&auml;gen bereits dargestellt. Der vorliegende Beitrag schlie&szlig;t den Kreis und zeigt, wie Sie von einem Access-Frontend aus auf die MySQL-Datenbank auf dem Internetserver zugreifen und mit den Daten so arbeiten, als w&uuml;rden diese auf dem heimischen Rechner liegen. Wir starten mit einigen Tools, die den Zugriff erleichtern.\" \/>\n<meta property=\"og:url\" content=\"https:\/\/access-im-unternehmen.de\/MySQL_im_Web_Tools_fuer_das_AccessFrontend_Teil_1\/\" \/>\n<meta property=\"og:site_name\" content=\"Access im Unternehmen\" \/>\n<meta property=\"article:published_time\" content=\"2020-07-10T09:40:31+00:00\" \/>\n<meta property=\"og:image\" content=\"http:\/\/vg06.met.vgwort.de\/na\/2bf7efd45c6e4044a682da9b9afbcfec\" \/>\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=\"16\u00a0Minuten\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\\\/\\\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/MySQL_im_Web_Tools_fuer_das_AccessFrontend_Teil_1\\\/#article\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/MySQL_im_Web_Tools_fuer_das_AccessFrontend_Teil_1\\\/\"},\"author\":{\"name\":\"Andr\u00e9 Minhorst\",\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/#\\\/schema\\\/person\\\/13395c4bcd7d7963efe33be9c584d93f\"},\"headline\":\"MySQL im Web: Tools f&uuml;r das Access-Frontend, Teil 1\",\"datePublished\":\"2020-07-10T09:40:31+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/MySQL_im_Web_Tools_fuer_das_AccessFrontend_Teil_1\\\/\"},\"wordCount\":2414,\"commentCount\":0,\"publisher\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/#organization\"},\"image\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/MySQL_im_Web_Tools_fuer_das_AccessFrontend_Teil_1\\\/#primaryimage\"},\"thumbnailUrl\":\"http:\\\/\\\/vg06.met.vgwort.de\\\/na\\\/2bf7efd45c6e4044a682da9b9afbcfec\",\"articleSection\":[\"2\\\/2020\",\"2020\",\"SQL Server und Co.\"],\"inLanguage\":\"de\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\\\/\\\/access-im-unternehmen.de\\\/MySQL_im_Web_Tools_fuer_das_AccessFrontend_Teil_1\\\/#respond\"]}]},{\"@type\":\"WebPage\",\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/MySQL_im_Web_Tools_fuer_das_AccessFrontend_Teil_1\\\/\",\"url\":\"https:\\\/\\\/access-im-unternehmen.de\\\/MySQL_im_Web_Tools_fuer_das_AccessFrontend_Teil_1\\\/\",\"name\":\"MySQL im Web: Tools f&uuml;r das Access-Frontend, Teil 1 - Access im Unternehmen\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/MySQL_im_Web_Tools_fuer_das_AccessFrontend_Teil_1\\\/#primaryimage\"},\"image\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/MySQL_im_Web_Tools_fuer_das_AccessFrontend_Teil_1\\\/#primaryimage\"},\"thumbnailUrl\":\"http:\\\/\\\/vg06.met.vgwort.de\\\/na\\\/2bf7efd45c6e4044a682da9b9afbcfec\",\"datePublished\":\"2020-07-10T09:40:31+00:00\",\"breadcrumb\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/MySQL_im_Web_Tools_fuer_das_AccessFrontend_Teil_1\\\/#breadcrumb\"},\"inLanguage\":\"de\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\\\/\\\/access-im-unternehmen.de\\\/MySQL_im_Web_Tools_fuer_das_AccessFrontend_Teil_1\\\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"de\",\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/MySQL_im_Web_Tools_fuer_das_AccessFrontend_Teil_1\\\/#primaryimage\",\"url\":\"http:\\\/\\\/vg06.met.vgwort.de\\\/na\\\/2bf7efd45c6e4044a682da9b9afbcfec\",\"contentUrl\":\"http:\\\/\\\/vg06.met.vgwort.de\\\/na\\\/2bf7efd45c6e4044a682da9b9afbcfec\"},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/MySQL_im_Web_Tools_fuer_das_AccessFrontend_Teil_1\\\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\\\/\\\/access-im-unternehmen.de\\\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"MySQL im Web: Tools f&uuml;r das Access-Frontend, Teil 1\"}]},{\"@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":"MySQL im Web: Tools f&uuml;r das Access-Frontend, Teil 1 - 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\/MySQL_im_Web_Tools_fuer_das_AccessFrontend_Teil_1\/","og_locale":"de_DE","og_type":"article","og_title":"MySQL im Web: Tools f&uuml;r das Access-Frontend, Teil 1","og_description":"Wenn Sie eine Datenbank von mehreren Standorten aus nutzen, aber nicht auf den Komfort der Access-Programmierung verzichten wollen, dann gibt es nicht viele M&ouml;glichkeiten. Sie k&ouml;nnen entweder eine SQL Server-Datenbank oder eine MySQL-Datenbank auf einem Internetserver ablegen und f&uuml;r den Zugriff von einer Access-Datenbank aus verf&uuml;gbar machen. Wie das gelingt, haben wir am Beispiel von MySQL in verschiedenen Beitr&auml;gen bereits dargestellt. Der vorliegende Beitrag schlie&szlig;t den Kreis und zeigt, wie Sie von einem Access-Frontend aus auf die MySQL-Datenbank auf dem Internetserver zugreifen und mit den Daten so arbeiten, als w&uuml;rden diese auf dem heimischen Rechner liegen. Wir starten mit einigen Tools, die den Zugriff erleichtern.","og_url":"https:\/\/access-im-unternehmen.de\/MySQL_im_Web_Tools_fuer_das_AccessFrontend_Teil_1\/","og_site_name":"Access im Unternehmen","article_published_time":"2020-07-10T09:40:31+00:00","og_image":[{"url":"http:\/\/vg06.met.vgwort.de\/na\/2bf7efd45c6e4044a682da9b9afbcfec","type":"","width":"","height":""}],"author":"Andr\u00e9 Minhorst","twitter_card":"summary_large_image","twitter_misc":{"Verfasst von":"Andr\u00e9 Minhorst","Gesch\u00e4tzte Lesezeit":"16\u00a0Minuten"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/access-im-unternehmen.de\/MySQL_im_Web_Tools_fuer_das_AccessFrontend_Teil_1\/#article","isPartOf":{"@id":"https:\/\/access-im-unternehmen.de\/MySQL_im_Web_Tools_fuer_das_AccessFrontend_Teil_1\/"},"author":{"name":"Andr\u00e9 Minhorst","@id":"https:\/\/access-im-unternehmen.de\/#\/schema\/person\/13395c4bcd7d7963efe33be9c584d93f"},"headline":"MySQL im Web: Tools f&uuml;r das Access-Frontend, Teil 1","datePublished":"2020-07-10T09:40:31+00:00","mainEntityOfPage":{"@id":"https:\/\/access-im-unternehmen.de\/MySQL_im_Web_Tools_fuer_das_AccessFrontend_Teil_1\/"},"wordCount":2414,"commentCount":0,"publisher":{"@id":"https:\/\/access-im-unternehmen.de\/#organization"},"image":{"@id":"https:\/\/access-im-unternehmen.de\/MySQL_im_Web_Tools_fuer_das_AccessFrontend_Teil_1\/#primaryimage"},"thumbnailUrl":"http:\/\/vg06.met.vgwort.de\/na\/2bf7efd45c6e4044a682da9b9afbcfec","articleSection":["2\/2020","2020","SQL Server und Co."],"inLanguage":"de","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/access-im-unternehmen.de\/MySQL_im_Web_Tools_fuer_das_AccessFrontend_Teil_1\/#respond"]}]},{"@type":"WebPage","@id":"https:\/\/access-im-unternehmen.de\/MySQL_im_Web_Tools_fuer_das_AccessFrontend_Teil_1\/","url":"https:\/\/access-im-unternehmen.de\/MySQL_im_Web_Tools_fuer_das_AccessFrontend_Teil_1\/","name":"MySQL im Web: Tools f&uuml;r das Access-Frontend, Teil 1 - Access im Unternehmen","isPartOf":{"@id":"https:\/\/access-im-unternehmen.de\/#website"},"primaryImageOfPage":{"@id":"https:\/\/access-im-unternehmen.de\/MySQL_im_Web_Tools_fuer_das_AccessFrontend_Teil_1\/#primaryimage"},"image":{"@id":"https:\/\/access-im-unternehmen.de\/MySQL_im_Web_Tools_fuer_das_AccessFrontend_Teil_1\/#primaryimage"},"thumbnailUrl":"http:\/\/vg06.met.vgwort.de\/na\/2bf7efd45c6e4044a682da9b9afbcfec","datePublished":"2020-07-10T09:40:31+00:00","breadcrumb":{"@id":"https:\/\/access-im-unternehmen.de\/MySQL_im_Web_Tools_fuer_das_AccessFrontend_Teil_1\/#breadcrumb"},"inLanguage":"de","potentialAction":[{"@type":"ReadAction","target":["https:\/\/access-im-unternehmen.de\/MySQL_im_Web_Tools_fuer_das_AccessFrontend_Teil_1\/"]}]},{"@type":"ImageObject","inLanguage":"de","@id":"https:\/\/access-im-unternehmen.de\/MySQL_im_Web_Tools_fuer_das_AccessFrontend_Teil_1\/#primaryimage","url":"http:\/\/vg06.met.vgwort.de\/na\/2bf7efd45c6e4044a682da9b9afbcfec","contentUrl":"http:\/\/vg06.met.vgwort.de\/na\/2bf7efd45c6e4044a682da9b9afbcfec"},{"@type":"BreadcrumbList","@id":"https:\/\/access-im-unternehmen.de\/MySQL_im_Web_Tools_fuer_das_AccessFrontend_Teil_1\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/access-im-unternehmen.de\/"},{"@type":"ListItem","position":2,"name":"MySQL im Web: Tools f&uuml;r das Access-Frontend, Teil 1"}]},{"@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\/55001230","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=55001230"}],"version-history":[{"count":0,"href":"https:\/\/access-im-unternehmen.de\/data\/wp\/v2\/posts\/55001230\/revisions"}],"wp:attachment":[{"href":"https:\/\/access-im-unternehmen.de\/data\/wp\/v2\/media?parent=55001230"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/access-im-unternehmen.de\/data\/wp\/v2\/categories?post=55001230"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/access-im-unternehmen.de\/data\/wp\/v2\/tags?post=55001230"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}