{"id":55000590,"date":"2008-06-01T00:00:00","date_gmt":"2021-02-11T21:20:36","guid":{"rendered":"http:\/\/access-im-unternehmen.aix-dev.de\/aiu\/?p=590"},"modified":"-0001-11-30T00:00:00","modified_gmt":"-0001-11-30T00:00:00","slug":"Access_MySQL_und_Datenzugriff","status":"publish","type":"post","link":"https:\/\/access-im-unternehmen.de\/Access_MySQL_und_Datenzugriff\/","title":{"rendered":"Access, MySQL und Datenzugriff"},"content":{"rendered":"<p><img loading=\"lazy\" decoding=\"async\" src=\"http:\/\/vg09.met.vgwort.de\/na\/bd6f3dd9d2b04ee2890d76a66fe8be87\" width=\"1\" height=\"1\" alt=\"\"><\/p>\n<p><b>Sie haben Ihr Access-Backend auf einen MySQL-Server migriert, die notwendigen Anpassungen vorgenommen und die Tabellen &uuml;ber ODBC in Ihr Frontend verkn&uuml;pft. Mit Unterst&uuml;tzung der beiden vorausgegangenen Beitr&auml;ge dieser Serie (Shortlink 544 und 588) sollte das gelungen sein. Schauen wir nun, was es mit dem Zugriff auf die Tabellen auf sich hat und was es dabei zu beachten gilt.<\/b><\/p>\n<p>Ein Hemmschuh, wenn es an die Migration einer Access-Datenbank mit File-Backend auf einen SQL-Server gehen soll, ist der vermeintliche Aufwand, der durch Anpassungen des Frontends zu erwarten ist. Hier erwartet man gr&ouml;&szlig;ere Umbauarbeiten am VBA-Code oder etwa spezielle Zugriffsroutinen in einem ungewohnten SQL-Dialekt. <\/p>\n<p>Wie die beiden vorherigen Beitr&auml;ge dieser Reihe gezeigt haben, ist es aber kein Hexenwerk, die Tabellen auf den Server zu kopieren und dann per ODBC-Datenquelle in das Frontend zu verlinken. Tats&auml;chlich ist damit bereits der wesentliche Teil einer Migration erledigt. Im Normalfall sollte die Datenbank dann genau so funktionieren, wie vorher mit dem File-Backend &#8211; irgendwelche &auml;nderungen am Code oder an Formularen oder Berichten sind nicht erforderlich. <\/p>\n<p class=\"zwischen-berschrift-oberer-spaltenrand\">ODBC-verkn&uuml;pfte Tabellen<\/p>\n<p>Nun h&ouml;rt man gelegentlich Unkenrufe, dass mit verlinkten SQL-Servertabellen noch kein nennenswerter Performancegewinn zu erwarten sei, weil Access die Daten dann genauso en bloc auf die Client-Seite holen muss, um sie daraufhin lokal zu verarbeiten.<\/p>\n<p>Selbst wenn dies zutr&auml;fe, w&uuml;rde durch die wegfallenden Sperrmechanismen, die einen erheblichen negativen Einfluss auf die Performance in Mehrbenutzerumgebung bei Bindung an ein File-Backend haben, die Zugriffsgeschwindigkeit deutlich steigen.<\/p>\n<p>Aber die Annahme ist ohnehin v&ouml;llig falsch: Access holt sich im Normalfall nur das Ergebnis einer Abfrage oder Indizes vom Server ab, nicht den kompletten Inhalt einer Tabelle. Dabei spielt es keine Rolle, ob eine Tabelle in der Datenblattansicht ge&ouml;ffnet oder eine Abfrage ausgef&uuml;hrt wird. In beiden F&auml;llen wird JET ein SELECT-Statement an den Server absetzen.<\/p>\n<p>Es ist dabei intelligent genug, nicht den ganzen Inhalt zu holen, sondern nur den Teil, der wirklich erforderlich ist. Der Nachweis daf&uuml;r kann mit verschiedenen Analysemethoden erbracht werden, die Sie sp&auml;ter unter <b>Zugriff loggen <\/b>kennenlernen werden.<\/p>\n<p>An dieser Stelle soll an einem Beispiel schon mal vorgegriffen werden, was abl&auml;uft, wenn Sie ein an die Tabelle <b>tblKunden <\/b>gebundenes Formular (<b>frmKunden2<\/b>) der Beispieldatenbank &ouml;ffnen.<\/p>\n<p>JET fragt dann im ersten Schritt zun&auml;chst einmal ausschlie&szlig;lich nach den Prim&auml;rschl&uuml;sseln der Tabelle:<\/p>\n<pre>SELECT &apos;tblkunden&apos;.&apos;KundeID&apos; FROM &apos;tblkunden&apos;<\/pre>\n<p>Als Ergebnis ermittelt es eine <b>1<\/b> f&uuml;r die <b>ID <\/b>des ersten Kundendatensatzes. Bis hierhin beschr&auml;nkt sich also der Austausch mit dem Server auf wenige Bytes f&uuml;r die Indizes der Tabelle. Nach Kenntnis des ersten Prim&auml;rschl&uuml;sselwerts fragt es die restlichen Felder des zur <b>ID <\/b>passenden Datensatzes ab:<\/p>\n<pre>SELECT &apos;KundeID&apos;, &apos;KundenCode&apos;, &apos;Firma&apos;,\r\n&apos;Kontaktperson&apos;, &apos;Position&apos;, &apos;Strasse&apos;, &apos;Ort&apos;, &apos;Region&apos;, &apos;PLZ&apos;, &apos;Land&apos;, &apos;Telefon&apos;, &apos;Telefax&apos;, &apos;TS&apos; FROM &apos;tblkunden&apos;\r\nWHERE &apos;KundeID&apos; = 1<\/pre>\n<p>Und mit dem Ergebnis dieser Abfrage f&uuml;llt es dann auch schon die Felder des Formulars. Der Umfang des gesamten Traffics f&uuml;r diesen Vorgang d&uuml;rfte nicht viel mehr als einige Hundert Bytes betragen. Erst dann, wenn Sie auf den n&auml;chsten Datensatz schalten, werden zus&auml;tzliche Daten geholt. Dabei denkt sich JET wohl: &#8222;Okay, da sollen wahrscheinlich noch mehr Datens&auml;tze angezeigt werden &#8230;&#8220;, und schickt dem Server eine Anfrage f&uuml;r gleich zehn weitere Datens&auml;tze:<\/p>\n<pre>SELECT &apos;KundeID&apos;, &apos;KundenCode&apos;, &apos;Firma&apos;,\r\n&apos;Kontaktperson&apos;, &apos;Position&apos;, &apos;Strasse&apos;, &apos;Ort&apos;, &apos;Region&apos;, &apos;PLZ&apos;, &apos;Land&apos;, &apos;Telefon&apos;, &apos;Telefax&apos;, &apos;TS&apos; FROM &apos;tblkunden&apos;\r\nWHERE &apos;KundeID&apos; = 2 OR &apos;KundeID&apos; = 3 OR &apos;KundeID&apos; = 4 OR &apos;KundeID&apos; = 5 OR &apos;KundeID&apos; = 6 OR &apos;KundeID&apos; = 7 OR &apos;KundeID&apos; = 8 OR &apos;KundeID&apos; = 9 OR &apos;KundeID&apos; = 10 OR &apos;KundeID&apos; = 11<\/pre>\n<p>&Uuml;brigens geschieht dasselbe auch, wenn Sie gar nichts tun und das Formular auf dem ersten Datensatz stehen lassen: Nach etwa einer Minute holt JET sich automatisch zehn neue Datens&auml;tze im Hintergrund, weil es offenbar gerade nichts Besseres zu tun hat.<\/p>\n<p>Das Spiel wiederholt sich regelm&auml;&szlig;ig, bis alle Kundendatens&auml;tze in den Cache der Client-Seite gezogen wurden, was im Beispielformular (90 Kundendatens&auml;tze) nach etwa neun Minuten der Fall ist. Wenn Sie dann durch alle Datens&auml;tze des Formulars steppen, muss JET gar keine Datens&auml;tze mehr beim Server anfragen, weil sie sich bereits im lokalen Cache befinden. <\/p>\n<p>&Ouml;ffnen Sie die Tabelle <b>tblKunden <\/b>in der Datenblattansicht, dann reicht ein Datensatz zur initialen Anzeige nat&uuml;rlich nicht aus. In diesem Fall fragt JET genau so viele Datens&auml;tze beim Server ab, wie zur Anzeige auf dem Bildschirm ben&ouml;tigt werden &#8211; nicht mehr und nicht weniger.<\/p>\n<p>Erst ein Scrollen nach unten holt tats&auml;chlich weitere Daten. Dabei ergehen die Anfragen immer in Zehnerbl&ouml;cken, wie im oben dargestellten SQL-Statement, &uuml;ber OR-verkettete Kriterien.<\/p>\n<p>Man sieht hier also, dass JET durchaus intelligent und resourcenschonend mit dem SQL-Server umgeht. &auml;hnlich geht es auch bei Abfragen vor.<\/p>\n<p>JET versucht hier, einen m&ouml;glichst gro&szlig;en Teil des SQL-Ausdrucks direkt an den Server zu schicken, wobei es das Statement teilweise umformuliert.<\/p>\n<p>Eine Abfrage der Artikel der Tabelle <b>tblArtikel <\/b>k&ouml;nnte etwa so aussehen:<\/p>\n<pre>SELECT &quot;ART.&quot; &amp; [Artikelname] AS Artikel,\r\ntblartikel.ArtikelID\r\nFROM tblartikel\r\nWHERE (((tblartikel.ArtikelID)&gt;20))\r\nORDER BY &quot;ART.&quot; &amp; [Artikelname];<\/pre>\n<p>JET macht daraus zwei Schritte:<\/p>\n<pre>SELECT &apos;Artikelname&apos;, &apos;tblartikel&apos;. &apos;ArtikelID&apos;\r\nFROM &apos;tblartikel&apos; WHERE (&apos;ArtikelID&apos; &gt; 20 )<\/pre>\n<p>Abgefragt wird hier also nicht nur der Prim&auml;rschl&uuml;ssel <b>ArtikelID<\/b>, sondern auch das Textfeld <b>Artikelname<\/b>. Der Grund ist die Sortierung nach dem Namen, die auf dieses Feld angewandt werden soll.<\/p>\n<p>Das erledigt JET erst anschlie&szlig;end und teilt sich die Arbeit in diesem Fall mit dem Server, obwohl auch dieser durchaus sortieren k&ouml;nnte. Dass die ORDER-Anweisung nicht mit an den Server geschickt wird, liegt an der VBA-Verkn&uuml;pfung des Feldinhalts mit dem gew&auml;hlten Pr&auml;fix <b>ART:<\/b>. Das Einschr&auml;nkungskriterium <b>ArtikelID&gt;20 <\/b>hingegen darf der Server selbst verarbeiten.<\/p>\n<p>Im zweiten Schritt werden die ersten zehn Datens&auml;tze der nun von JET sortierten Artikel-IDs abgefragt:<\/p>\n<pre>SELECT &apos;ArtikelID&apos;,&apos;Artikelname&apos;,&apos;TS&apos; FROM &apos;tblartikel&apos;\r\nWHERE &apos;ArtikelID&apos; = 40 OR &apos;ArtikelID&apos; = 60 OR &apos;ArtikelID&apos; = 39 OR &apos;ArtikelID&apos; = 48 OR\r\n&apos;ArtikelID&apos; = 38 OR &apos;ArtikelID&apos; = 58 OR\r\n&apos;ArtikelID&apos; = 52 OR &apos;ArtikelID&apos; = 71 OR\r\n&apos;ArtikelID&apos; = 33 OR &apos;ArtikelID&apos; = 56<\/pre>\n<p>Damit k&ouml;nnen die ersten zehn Zeilen des Datenblatts gef&uuml;llt werden. F&uuml;r die darauf folgenden Zeilen l&auml;uft dann ein analoges Prozedere ab.<\/p>\n<p>Ein Beispiel f&uuml;r eine Abfrage, die auf mehreren verkn&uuml;pften Tabellen basiert, soll hier aus Platzgr&uuml;nden au&szlig;en vor bleiben. Es sei aber verraten, dass JET auch dann den SQL-Ausdruck weitgehend an den Server &uuml;bergibt und ihm das Joinen &uuml;berl&auml;sst, statt selbst t&auml;tig zu werden.<\/p>\n<p><b>Pass-Through-Abfragen<\/b><\/p>\n<p>Es l&auml;sst sich also ableiten, dass allein verkn&uuml;pfte ODBC-Tabellen und Abfragen auf diese einen erheblichen Performance-Zugewinn bringen.<\/p>\n<p>Das letzte Beispiel zeigt aber auch, dass JET immer dann einschreiten muss, wenn der SQL-Ausdruck eine Syntax aufweist, die der MySQL-Server so nicht verstehen w&uuml;rde. Das kommt in erster Linie dann zum Tragen, wenn VBA-Funktionen im SQL-String zum Einsatz kommen.<\/p>\n<p>Auch das Verkn&uuml;pfungszeichen <b>&amp; <\/b>versteht MySQL nicht als String-Verkn&uuml;pfungsoperator, weshalb JET diesen Part &uuml;bernehmen muss. Die besprochene Abfrage h&auml;tte unter MySQL n&auml;mlich diese Syntax:<\/p>\n<pre>SELECT CONCAT(&apos;ART.&apos;,Artikelname) AS Artikel,\r\ntblartikel.ArtikelID\r\nFROM tblartikel\r\nWHERE tblartikel.ArtikelID&gt;20\r\nORDER BY CONCAT(&apos;ART.&apos;,Artikelname);<\/pre>\n<p>F&uuml;r die String-Verkn&uuml;pfung gibt es hier eine eigene Funktion <b>CONCAT<\/b>, die eine beliebige Anzahl durch Kommata getrennter Strings als Parameter erwartet. Die Ausf&uuml;hrung dieser Abfrage verl&auml;uft nochmal um Gr&ouml;&szlig;enordnungen schneller als die vorherige L&ouml;sung.<\/p>\n<p>Diese SQL-Anweisung k&ouml;nnen Sie aber nicht einfach in die SQL-Ansicht des Abfrageeditors eingeben. Access w&uuml;rde versuchen, sie als JET-Ausdruck zu parsen, und einen Fehler wegen unbekannter Funktion <b>CONCAT <\/b>melden.<\/p>\n<p>Es muss Access schon ausdr&uuml;cklich gesagt werden, dass es den Ausdruck unbesehen an den Server senden soll, um dann auf das Ergebnis zu warten. Sie erzwingen das, indem der Typ der Abfrage auf <b>Pass-Through <\/b>gestellt wird. &Ouml;ffnen Sie dazu eine neue Abfrage, f&uuml;gen keine Tabellen hinzu und bet&auml;tigen den Men&uuml;punkt <b>Abfrage|SQL spezifisch|Pass-Through<\/b>. In diesem Modus ist dann keine visuelle Gestaltung mehr m&ouml;glich, sondern ausschlie&szlig;lich die Eingabe von SQL-Statements. Damit Access wei&szlig;, wohin es dieses Statement unter Umgehung der verkn&uuml;pften Tabellen senden soll, muss au&szlig;erdem eine ODBC-Verbindungszeichenfolge angegeben werden, die analog zum Connect-String der Tabellen lautet und etwa so aussehen k&ouml;nnte:<\/p>\n<pre>ODBC;Driver={MySQL ODBC 3.51 Driver};DATABASE=suedsturm;\r\nSERVER=localhost ;PORT=3306; UID=;PWD=;OPTION=43<\/pre>\n<p>Die Eigenschaft <b>Liefert Datens&auml;tze <\/b>muss auf <b>Ja <\/b>stehen, sonst geschieht gar nichts (siehe Bild 1). Ein <b>Nein <\/b>ist hier nur angebracht, wenn es sich beim SQL-Ausdruck um eine Aktionsabfrage handelt.<\/p>\n<p><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2008_02\/MySQL_III-web-images\/Bild262_opt.jpeg\" alt=\"missing image file\" \/><\/p>\n<p><b><span style=\"color:darkgrey\">Bild 1: Pass-Through-Abfrage und ODBC-Verbindungsparameter<\/span><\/b><\/p>\n<p>Solche Pass-Through-Abfragen sind sehr schnell, haben aber drei Haken. Einmal n&ouml;tigen sie Sie dazu, sich mit der speziellen MySQL-Syntax zu besch&auml;ftigen. Im MySQL-Handbuch [3] finden Sie diese ersch&ouml;pfend beschrieben.<\/p>\n<p>Der Sprachumfang ist nicht so gro&szlig;, wie etwa beim T-SQL des Microsoft-SQL-Servers, verlangt aber doch einige Wochen Besch&auml;ftigung mit der Materie, wenn er beherrscht werden will. Sie brauchen sich das aber nicht auf einen Schlag anzueignen, sondern kommen mit gelegentlichem Suchen in der Hilfe und Experimenten ebenfalls nach und nach zum Ziel.<\/p>\n<p>Ein anderer Punkt ist, dass Sie mit Pass-Through-Abfragen die Portierbarkeit der Datenbank zunichte machen. W&auml;hrend Sie bei einem Frontend mit ausschlie&szlig;lich verkn&uuml;pften Tabellen ohne Weiteres etwa auf Oracle umstellen k&ouml;nnen, indem die Tabellen dorthin gezogen werden, steht bei Pass-Through-Abfragen immer erst eine Umstellung dieser Abfrage auf die spezifische Server-Syntax an.<\/p>\n<p><!--30percent--><\/p>\n<p>Und schlie&szlig;lich haben Pass-Through-Abfragen noch ein gewichtiges Manko: Sie sind lediglich zum Lesen von Daten gedacht.<\/p>\n<p>Das Ergebnis der Abfrage kann nicht editiert werden, auch wenn eine analoge JET-Abfrage aktualisierbar w&auml;re. Sie k&ouml;nnen ein Formular zwar auf Grundlage einer PT-Abfrage erstellen, die Datens&auml;tze werden aber schreibgesch&uuml;tzt sein. <\/p>\n<p><b>Datenzugriff per ADO<\/b><\/p>\n<p>Man k&ouml;nnte alternativ auf die Idee kommen, auf eine ODBC-Tabelle ein ADO-Recordset zu &ouml;ffnen und dieses einem Formular als Datenquelle zuzuweisen. Allerdings nur dann, wenn ein client-seitiger Cursor verwendet wird (<b>CursorLocation<\/b>-Eigenschaft), denn ein ADO-Recordset auf Basis einer Connection mit serverseitigem Cursor wird nicht als Formular-Recordset akzeptiert. <\/p>\n<p>Als Provider ist dabei der <b>Microsoft OLE DB-Provider for ODBC Drivers <\/b>zu benutzen und der <b>ConnectionString <\/b>sieht &auml;hnlich aus, wie der f&uuml;r Tabellen und Pass-Through-Abfragen:<\/p>\n<pre>Dim oCon As New ADODB.Connection\r\nDim rst As New ADODB.Recordset\r\noCon.Provider = &quot;MSDASQL.1&quot; &apos;ODBC-Provider\r\noCon.ConnectionString = _\r\n&amp; &quot;Extended Properties=\" _\r\n&amp; &quot;&apos;Driver={MySQL ODBC 3.51 Driver};&quot; _\r\n&amp; &quot;DATABASE=suedsturm;SERVER=localhost;&quot; _\r\n&amp; &quot;PORT=4040;&quot; _\r\n&amp; &quot;UID=root;PWD=adminpasswort;OPTION=43&apos;&quot;\r\noCon.CursorLocation = adUseClient\r\noCon.Open\r\nrst.Open &quot;SELECT * FROM tblkunden&quot;, oCon, _\r\nadOpenDynamic, adLockOptimistic\r\nSet Me.Recordset = rst<\/pre>\n<p>Bei der Inspektion der Anweisungen, die dann als Anfragen beim Server ankommen, wenn durch die Datens&auml;tze des Formulars gesteppt wird, tritt allerdings Ern&uuml;chterung ein: F&uuml;r jeden Datensatz wird wiederholt das Statement <b>SELECT * FROM tblkunden<\/b> abgesetzt. Das ist performancetechnisch nat&uuml;rlich au&szlig;erordentlich suboptimal. Da ist die Methode mit Bindung des Formulars an eine verkn&uuml;pfte Tabelle schon wesentlich effizienter. Ein Code wie in Listing 1 sollte also nicht zur Anwendung kommen.<\/p>\n<p>Aber auch abseits von Formularen ist ein ADO-Recordset nicht die erste Wahl, wenn es um den Datenzugriff auf einen MySQL-Server geht. Ohne hier ins Detail zu gehen, l&auml;sst sich sagen, dass der Zugriff dabei intern recht umst&auml;ndlich vonstatten geht. Das gilt f&uuml;r lesende wie schreibende Zugriffe gleicherma&szlig;en. Offenbar hat Microsoft ADO nur f&uuml;r Zugriffe auf den MS SQL Server und dessen Provider optimiert, was etwa bei Access-Projekten (ADP) zum Tragen kommt.<\/p>\n<p>F&uuml;r ODBC-Verbindungen bringt ADO eher Nachteile und sollte vermieden werden, falls nicht ausgew&auml;hlte Gr&uuml;nde daf&uuml;r sprechen.<\/p>\n<p><b>Datenzugriff per DAO<\/b><\/p>\n<p>Wenn Operationen auf die Daten &uuml;ber DAO-Recordsets auf die eingebundenen Tabellen ausgef&uuml;hrt werden, dann greifen weitgehend die gleichen optimierenden Mechanismen, wie bei gebundenen Formularen. Es kann daher identischer Code eingesetzt werden, wie bei einem Access-Backend. Anpassungen sind dabei nicht erforderlich.<\/p>\n<p>Es gelten allerdings auch die gleichen Beschr&auml;nkungen f&uuml;r SQL-Statements, wie f&uuml;r normale Abfragen: Sobald etwa VBA-Ausdr&uuml;cke enthalten sind, dann wird JET gen&ouml;tigt, teilweise selbst Hand anzulegen und Berechnungen durchzuf&uuml;hren.<\/p>\n<p>Umgehen k&ouml;nnen Sie das, indem &auml;hnlich wie bei den Pass-Through-Abfragen direkt die Syntax des SQL-Servers verwendet wird. Wie aber kann man DAO sagen, dass es ein SQL-Statement nicht parsen, sondern direkt abschicken soll<\/p>\n<p>Mit einem <b>Database<\/b>-Objekt und einem Recordset geht das n&auml;mlich nicht, weil ein <b>Database<\/b>-Objekt im Kontext der verkn&uuml;pften Tabellen steht, die ja gerade umgangen werden sollen.<\/p>\n<p>F&uuml;r diesen Zweck gibt es in DAO statt einem <b>Database<\/b>-Objekt ein <b>Connection<\/b>-Objekt. Operationen &uuml;ber eine solche <b>DAO.Connection <\/b>laufen in den omin&ouml;sen <b>ODBCDirect<\/b>-Arbeitsbereichen ab, die leider so selten in freier Wildbahn anzutreffen sind, dass Microsoft sich offenbar veranlasst sah, sie in Access 2007 nicht mehr zu unterst&uuml;tzen. Das ist meiner Meinung nach ein wichtiger Punkt, der leider gegen den Einsatz von Access 2007 bei ODBC-Anbindung spricht.<\/p>\n<p>Ein <b>ODBCDirect<\/b>-Arbeitsbereich wird &uuml;ber ein <b>Workspace<\/b>-Objekt erstellt, dem ausdr&uuml;cklich die Verwendung von ODBC &uuml;ber die Optionskonstante <b>dbUseODBC <\/b>mitgeteilt wird:<\/p>\n<pre>Dim wrk As Workspace\r\nSet wrk = DBEngine.CreateWorkspace(&quot;&quot;, &quot;&quot;, &quot;&quot;, _\r\n&amp; dbUseODBC)<\/pre>\n<p>Auf dieses Workspace kann nun eine ODBC-Connection ge&ouml;ffnet werden:<\/p>\n<pre>Dim oCon As DAO.Connection\r\nDim strConnect As String\r\nstrConnect = &quot;&lt;ODBC-Verbindungszeichenfolge&gt;&quot;\r\nSet oCon = wrk.OpenConnection(&quot;&quot;, , , strConnect)<\/pre>\n<p>Die Verbindungszeichenfolge ist wieder die gleiche, die auch zum Verkn&uuml;pfen der Server-Tabellen verwendet wird. Das <b>Connection<\/b>-Objekt kennt &auml;hnliche Methoden wie ein <b>Database<\/b>-Objekt, also etwa auch solche zum &Ouml;ffnen einer Datensatzgruppe:<\/p>\n<pre>Dim rst As DAO.Recordset\r\nSet rst = oCon.OpenRecordset( _\r\n&quot;SELECT * FROM tblKunden WHERE &quot; _\r\n&amp; &quot;Kundencode=&apos;ALFKI&apos;&quot;, _\r\ndbOpenDynamic)\r\nDebug.Print rst!Kontaktperson<\/pre>\n<p>Was aber so ein Recordset von einem &uuml;blichen Dynaset unterscheidet: Es ist wieder nicht aktualisierbar, also schreibgesch&uuml;tzt, und eignet sich daher nur f&uuml;r lesenden Zugriff.<\/p>\n<p>Methoden wie <b>.AddNew <\/b>oder <b>.Edit <\/b>werden demnach entsprechende Fehlermeldungen nach sich ziehen. Der Beweis daf&uuml;r ist, dass die Eigenschaft <b>rst.Updatable <\/b>den Wert <b>False <\/b>zur&uuml;ckliefert.<\/p>\n<p>Daf&uuml;r haben <b>ODBCDirect<\/b>-Recordsets einen anderen Vorzug: Wenn als &Ouml;ffnungsparameter f&uuml;r die Optionen der Connection die Konstante <b>dbRunAsync <\/b>abgegeben wird, dann wartet VBA mit der Ausf&uuml;hrung weiterer Codezeilen erst gar nicht, bis das Ergebnis vom Server vorliegt. Die Vorg&auml;nge geschehen also asynchron, was Zeit durch Parallelverarbeitungen sparen kann.<\/p>\n<p>Liegt das Resultat schlie&szlig;lich vor, dann zeigt das <b>Connection<\/b>-Objekt dies an seiner Eigenschaft <b>StillExecuting<\/b>, die auf <b>False <\/b>gesetzt wird. Ein Beispiel f&uuml;r solche asynchrone Verarbeitung w&auml;re etwa folgendes:<\/p>\n<pre>Set oCon = wrk.OpenConnection(&quot;&quot;, _\r\ndbRunAsync , , strConnect)\r\nSet rst = oCon.OpenRecordset( _\r\n&quot;SELECT * FROM tblKunden WHERE &quot; _\r\n&amp; &quot;Kundencode=&apos;ALFKI&apos;&quot;, _\r\ndbOpenDynamic)\r\nDo\r\n    DoEvents\r\n        &apos;Mache ggfls. noch andere Sachen...\r\n    Loop Until oCon.StillExecuting = False\r\n    Debug.Print rst!Kontaktperson<\/pre>\n<p>Der Nachteil fehlender Aktualisierbarkeit des Recordsets ist allerdings nicht so tragisch und f&uuml;hrt lediglich zu ein paar Zeilen mehr Code. Die Connection kann n&auml;mlich weiter verwendet werden, um etwa <b>UPDATE<\/b>&#8211; oder <b>INSERT<\/b>-Anweisungen zum Aktualisieren der Daten abzusetzen:<\/p>\n<pre>    oCon.Execute &quot;UPDATE tblkunden &quot; _\r\n    &amp; &quot;SET Kontaktperson=&apos;Maria Andersen&apos; &quot; _\r\n    &amp; &quot;WHERE Kundencode=&apos;ALFKI&apos;&quot;<\/pre>\n<p>Hier ist also etwas mehr SQL notwendig als bei den &uuml;blichen <b>Recordset<\/b>-Routinen. Daf&uuml;r kann der komplette Sprachumfang des Servers genutzt werden. Sie k&ouml;nnen &uuml;ber ein <b>Execute<\/b>-Statement zum Beispiel auch Funktionen und Stored Procedures ansto&szlig;en.<\/p>\n<p>Bleibt noch ein Wort zu Access 2007, das diese Features nicht mehr unterst&uuml;tzt: Entweder, Sie setzen hier Pass-Through-Abfragen ein, die aus VBA heraus &uuml;ber <b>QueryDef<\/b>-Objekte aufgerufen werden, oder Sie verwenden eben doch ADO. Denn dabei wird der Dialekt des Servers im Gegensatz zu DAO ebenfalls unterst&uuml;tzt:<\/p>\n<pre>    Dim oCon As New ADODB.Connection\r\n    Dim rst As New ADODB.Recordset\r\n    oCon.ConnectionString = &quot;Provider=MSDASQL.1;....\"\r\n    oCon.Open\r\n    rst.Open _\r\n    &quot;SELECT CONCAT(&apos;Frau &apos;, Kontaktperson) &quot; &amp; _\r\n    &quot;FROM tblKunden WHERE Kundencode=&apos;ALFKI&apos;&quot;, _\r\n    oCon, adOpenDynamic, adLockOptimistic, _\r\n    adCmdText\r\n    Debug.Print rst(0)<\/pre>\n<p>Alle Beispiele zu diesem Beitrag finden Sie in der begleitenden Datenbankdatei <b>suedsturm_mysql3.mdb<\/b>.<\/p>\n<p><b>Zugriff loggen<\/b><\/p>\n<p>Vielleicht haben Sie sich gefragt, woher der Autor denn wei&szlig;, was JET beim simplen &Ouml;ffnen einer Tabelle in Datenblattansicht macht Dokumentationen seitens Microsoft gibt es dazu nicht und JET h&auml;lt auch sonst ziemlich geheim, was es genau anstellt.<\/p>\n<p>SQL-Server haben aber im Gegensatz zum File-Backend den Vorteil, dass sie Zugriffe und die empfangenen Statements protokollieren k&ouml;nnen. H&auml;ufig existieren auch Zusatz-Tools wie Query Analyzer, die diese Protokollierung bequem anzeigen und filtern k&ouml;nnen. Solche M&ouml;glichkeiten existieren ebenfalls f&uuml;r MySQL, wenn auch nicht ganz so komfortabel wie beim Microsoft SQL-Server. Im Folgenden werden vier gebr&auml;uchliche Methoden vorgestellt.<\/p>\n<p><b>Das Server-Log<\/b><\/p>\n<p>Der MySQL-Server kann angewiesen werden, ob, wie und wo er Zugriffsprotokolle erstellen soll. Die dazu erforderlichen Einstellungsparameter liest er beim Start aus der Konfigurationsdatei <b>my.cnf <\/b>aus. Diese braucht nicht, wie fr&uuml;her, von Hand mit einem Texteditor modifiziert zu werden, sondern kann &uuml;ber den <b>MySQL Administrator <\/b>gesteuert werden. Starten Sie diesen und nehmen Sie einige &auml;nderungen an den Startvariablen (gleichnamiger Men&uuml;punkt) vor:<\/p>\n<ul>\n<li class=\"aufz-hlung\">Reiter <b>InnoDB Parameters<\/b>: Diverse Optionen im Bereich <b>Logfiles<\/b>. Entnehmen Sie dem MySQL-Handbuch die Bedeutung der einzelnen Optionen. Eine Beschreibung w&uuml;rde hier zu weit f&uuml;hren.<\/li>\n<li class=\"aufz-hlung\">Reiter <b>Logfiles<\/b>: Jeweils H&auml;kchen setzen auf die diversen Optionen unter <b>Aktiviere Logging<\/b>. Die Felder f&uuml;r die Pfadangaben k&ouml;nnen Sie dabei getrost leer lassen.<\/li>\n<\/ul>\n<p>&Uuml;ber die Schaltfl&auml;che<b> &Uuml;bernehmen <\/b>aktivieren Sie die vorgenommenen Einstellungen. Sie wirken sich allerdings erst nach einem Neustart des Servers aus. Den erzwingen Sie &uuml;ber den Men&uuml;punkt <b>Dienstverwaltung <\/b>und den Button <b>Dienst stoppen <\/b>und dann anschlie&szlig;end <b>Dienst starten<\/b>.<\/p>\n<p>Wenn Sie nun die S&uuml;dsturm-Datenbank und Tabellen, Abfragen oder Formulare &ouml;ffnen, dann werden alle Aktionen des Servers in den Protokolldateien festgehalten. Sie k&ouml;nnen diese auch zur Laufzeit im MySQL Administrator direkt einsehen, indem der Men&uuml;punkt <b>Serverprotokolle <\/b>aktiviert und unter <b>Langsames und Allgemeines Query-Log <\/b>nachgesehen wird.<\/p>\n<p>Der Server filtert Abfragen hier nach dem Kriterium <b>Ausf&uuml;hrungszeit<\/b>: Alle Abfragen, deren Berechnung l&auml;nger dauert, als es der eingestellten Zeitspanne entspricht, kommen in das <b>Langsame Query-Log<\/b>. Alle anderen werden im <b>Allgemeinen Query-Log <\/b>gespeichert. Das Langsame Log sollte zumindest f&uuml;r die S&uuml;dsturm-Datenbank irrelevant sein.<\/p>\n<p>Selbst beim kleinsten Wert von einer Sekunde werden Sie hier nie etwas finden, weil die Datenmengen so gering sind, dass die Berechnung auch komplexerer Ergebnisse nie l&auml;nger als wenige Hundertstel Sekunden dauern d&uuml;rfte.<\/p>\n<p>Im <b>Allgemeinen Log <\/b>hingegen werden Sie eine recht lange Liste von Eintr&auml;gen finden. Neben den eigentlichen SQL-Strings ist hier auch eine Vielzahl von Kommunikationsvorg&auml;ngen verzeichnet. Eine Filterung dieser Eintr&auml;ge ist leider nicht m&ouml;glich, sodass man unter Umst&auml;nden erst etwas nach den relevanten Informationen suchen muss.<\/p>\n<p>Vergessen Sie nicht, die <b>Logging<\/b>-Optionen wieder zur&uuml;ckzusetzen, wenn Sie sie nicht mehr ben&ouml;tigen, denn die Protokollierung kostet nat&uuml;rlich Performance.<\/p>\n<p><b>ODBC-Tracing<\/b><\/p>\n<p>Alle Vorg&auml;nge des ODBC-Treibers selbst k&ouml;nnen &uuml;ber den ODBC-Datenquellen-Administrator von Windows protokolliert werden. Dieses ODBC-Tracing (Ablaufverfolgung) k&ouml;nnen Sie wie in Bild 2 aktivieren.<\/p>\n<p><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2008_02\/MySQL_III-web-images\/Bild269_opt.jpeg\" alt=\"missing image file\" \/><\/p>\n<p><b><span style=\"color:darkgrey\">Bild 2: Aktivieren von ODBC-Traces im Datenquellen-Administrator<\/span><\/b><\/p>\n<p>Die Protokollierung beginnt hier erst nach einer neu hergestellten Verbindung &#8211; also etwa nach dem Neu&ouml;ffnen der S&uuml;dsturm-Datenbank.<\/p>\n<p>Durch die Einstellungen in Bild 2 werden die Vorg&auml;nge in der Datei <b>e:\\sql.log <\/b>festgehalten, einer Datei, die Sie sp&auml;ter einfach mit Notepad oder einem anderen Texteditor einsehen k&ouml;nnen. Wahrscheinlich werden Sie dann vom Umfang der Eintr&auml;ge erschlagen sein: Hier wird tats&auml;chlich jede auch noch so kleine Interaktion zwischen JET und dem MySQL-Server auf ODBC-API-Ebene verzeichnet.<\/p>\n<p>Bereits das einfache &Ouml;ffnen einer Tabelle wird zu einer Log-Datei von circa 50 kB Gr&ouml;&szlig;e f&uuml;hren. Es ist ziemlich unsinnig, mit dieser Methode etwa Abfragen optimieren zu wollen.<\/p>\n<p>Wenn Sie gezielt Abfrage-Statements herausfiltern m&ouml;chten, dann suchen Sie in der Datei nach dem Ausdruck <b>SQLExecDirect<\/b>. Hier ein Beispiel, wie dies aussieht:<\/p>\n<pre>    MSACCESS 32c-bac ENTER SQLExecDirect\r\n    HSTMT 021C1A90\r\n    UCHAR * 0x09EE1EDC [ -3]\r\n    &quot;SELECT * FROM tblartikel WHERE [IDArtikel]&gt;10\\ 0&quot;\r\n    SDWORD -3<\/pre>\n<p>Immerhin ist am Log ganz interessant abzulesen, wie eine ODBC-Kommunikation funktioniert.<\/p>\n<pre>    Vergessen Sie auch hier nicht, das Tracing wieder abzuschalten. Wegen des Umfangs der Protokollvorg&auml;nge verlangsamt das Tracing die Zugriffe auf den Server ganz erheblich.<\/pre>\n<p><b>MySQL-Proxy<\/b><\/p>\n<p>Noch im angeblichen Alpha-Stadium befindet sich ein Zusatz-Tool, welches sich MySQL-Proxy nennt [1]. Es waren bisher aber noch keine Instabilit&auml;ten oder Fehlfunktionen festzustellen.<\/p>\n<p>Das Open-Source-Tool besitzt ein unersch&ouml;pfliches Potenzial f&uuml;r die Analyse von Zugriffen, weil es die Filterung der Serverabfragen &uuml;ber eine Programmierschnittstelle erlaubt.<\/p>\n<p>Das Prinzip ist eigentlich ganz einfach: Die gestartete <b>MySQL-Proxy.Exe <\/b>gaukelt ODBC selbst einen MySQL-Server vor und h&ouml;rt auf den TCP-Port 4040.<\/p>\n<p>Erhaltene Anfragen vom ODBC-Treiber leitet es aber dann einfach auf den tats&auml;chlichen Server weiter und nimmt im Gegenzug auch dessen Antworten entgegen, um sie wieder an den ODBC-Treiber zur&uuml;ckzugeben. MySQL-Proxy bekommt auf diese Weise alles mit und kann Ausgaben in einem Konsolenfenster machen, das sich nach seinem Start &uuml;brigens automatisch &ouml;ffnet.<\/p>\n<p>Das geschieht aber nur dann, wenn man dieses Proxy &uuml;ber spezielle Skriptanweisungen dazu auffordert. Hier kommt die Makrosprache <b>LUA <\/b>zum Einsatz [2], deren Interpreter im Tool integriert ist. Das Skript in Textdateiform wird MySQL-Proxy einfach beim Start als Kommandozeilenparameter, etwa in einer Desktop-Verkn&uuml;pfung, &uuml;bergeben:<\/p>\n<pre>    c:\\mysql-proxy.exe --proxy-lua-script=basic.lua<\/pre>\n<p>Die Scriptdatei <b>basic.lua <\/b>hat etwa folgenden einfachen Inhalt:<\/p>\n<pre>    function read_query( packet )\r\n        if string.byte(packet) == proxy.COM_QUERY then\r\n            print(&quot;TIMESTAMP:&quot; .. os.clock())\r\n            print(&quot;SQL: &quot; .. string.sub(packet, 2))\r\n            print()\r\n            end\r\n            end<\/pre>\n<p>Diese Funktion <b>read_query <\/b>des Skripts wird immer dann aufgerufen, wenn MySQL-Proxy eine SQL-Anfrage vom ODBC-Treiber erh&auml;lt. Die Anweisung <b>Print() <\/b>bewirkt eine Ausgabe im Konsolenfenster. Im Beispielskript werden neben dem SQL-Statement zus&auml;tzlich der Systemzeitgeber zum Zeitpunkt des Vorgangs mit Tausendstelsekunden hinter dem Komma sowie eine Leerzeile ausgegeben. <\/p>\n<p>Vorteil der Methode: Sie bekommen wirklich nur die reinen SQL-Statements zu sehen und k&ouml;nnen &uuml;ber die Skriptsprache au&szlig;erdem steuern und programmieren, wie die Ausgabe erfolgen soll.<\/p>\n<p>Statt in das Konsolenfenster kann mit entsprechenden LUA-Anweisungen auch in eine Log-Datei geschrieben werden, es k&ouml;nnen String-Vergleiche angestellt werden, um Filterungen nach bestimmten Kriterien vorzunehmen, oder es k&ouml;nnen gar Betriebssystemfunktionen aufgerufen werden. Der Sprachumfang von LUA ist durchaus m&auml;chtig und kann zudem mit weiteren DLLs erweitert werden. <\/p>\n<pre>            Es w&uuml;rde den Rahmen dieses Beitrags sprengen, Ihnen Details von LUA n&auml;herbringen zu wollen.<\/pre>\n<p>MySQL-Proxy mit allen ben&ouml;tigten Komponenten finden Sie im Ordner <b>MySQLProxy <\/b>auf der Begleit-CD oder im Download, eine Sammlung von LUA-Beispielskripten im Unterorder <b>example_scripts<\/b>. Enthalten ist dort auch eine von mir programmierte ActiveX-Komponente <b>luacapture.exe<\/b>, die die Ausgabe des Konsolenfensters in einem editierbaren Windows-Fenster erm&ouml;glicht. Damit k&ouml;nnen Sie das Logfenster l&ouml;schen, den Inhalt kopieren oder auch Kommentare in das Protokoll schreiben, was mit einem Konsolenfenster schwieriger ist. Weitere Ausf&uuml;hrungen und Erl&auml;uterungen zur Vorgehensweise sind im Dokument <b>mysqlproxy.pdf <\/b>[5] dargelegt.<\/p>\n<p><b>Showplan<\/b><\/p>\n<p>Mit den zuvor beschriebenen Methoden k&ouml;nnen Sie belauschen, was beim MySQL-Server ankommt, wenn Sie Aktionen in Ihrer Access-Datenbank ausl&ouml;sen. Das betrifft aber nur den Teil, der &uuml;ber ODBC abl&auml;uft, und nicht den, der von JET selbst &uuml;bernommen wird. Wie im Beispiel zur Abfrage von sortierten Artikelnamen oben festgestellt, muss JET einen Teil des Abfrageergebnisses aufbereiten, weil eine nicht ganz MySQL-konforme Syntax zur String-Verkn&uuml;pfung gew&auml;hlt wurde. &Uuml;ber einen Schalter in der Registry kann man aber auch JET anweisen, Abfragepl&auml;ne (Query Plan) in eine Log-Datei <b>showplan.out <\/b>ausgeben zu lassen. Am einfachsten geht das mit dem Tool <b>showplan.exe <\/b>[7], welches zus&auml;tzlich imstande ist, das Log zur Laufzeit in einem Fenster auszugeben. Die erw&auml;hnte Artikelabfrage f&uuml;hrt etwa zu folgendem Ablaufplan:<\/p>\n<pre>            --- qry_Artikelnamen ---\r\n            - Inputs to Query -\r\n            ODBC table &apos;tblartikel&apos;\r\n            - End inputs to Query -\r\n453469464) Remote SQL\r\n            453469464) Remote SQL\r\n            01) Sort result of &apos;00)&apos;<\/pre>\n<p>Das, was beim SQL-Server ankommt, spart JET aus und schreibt es lapidar als Remote SQL in den Plan. Das war im obigen Beispiel die Ermittlung der Indizes &uuml;ber ein Kriterium und der anschlie&szlig;ende Erhalt der vollst&auml;ndigen Datens&auml;tze auf die passenden Prim&auml;rschl&uuml;ssel.<\/p>\n<p>Interessant ist dann am Schluss das Sortier-Statement <b>01<\/b>, welches von JET selbst auf die erhaltenen Daten ausgef&uuml;hrt wird.<\/p>\n<p>In der Kombination von Server-Log und Query-Plan bekommen Sie also eine vollst&auml;ndige Dokumentation &uuml;ber Teilabl&auml;ufe in Abfragen oder Formularaktionen.<\/p>\n<p>Diese Informationen sind sehr hilfreich, um zu entscheiden, an welchen Stellen Optimierungsbedarf gegeben ist und etwa JET-Abfragen auf verkn&uuml;pfte Tabellen durch Pass-Through-Abfragen zu ersetzen sind, ODBCDirect-Arbeitsbereiche g&uuml;nstiger sind oder ADO das Mittel der Wahl ist.<\/p>\n<p><b>Ausblick<\/b><\/p>\n<p>Die Reihe <b>Access und MySQL <\/b>wird in der n&auml;chsten Ausgabe mit Techniken zu Benutzern und Berechtigungen enden, einem Thema, das wegen seines Umfangs an dieser Stelle nicht mehr untergebracht werden konnte.<\/p>\n<p class=\"zwischen-berschriftquellen\">Links<\/p>\n<p class=\"quellen\">[1] MySQL-Proxy: http:\/\/dev.mysql.com\/downloads\/mysql-proxy\/index.html<\/p>\n<p class=\"quellen\">[2] LUA: <a href=\"http:\/\/www.lua.org\">http:\/\/www.lua.org<\/a><\/p>\n<p class=\"quellen\"> [3] MySQL-Handbuch 5.1 CHM: http:\/\/dev.mysql.com\/doc\/refman\/5.0\/en\/myodbc-configuration-connection-parameters.html und http:\/\/dev.mysql.com\/doc\/refman\/5.0\/en\/myodbc-usagenotes-apptips.html#myodbc-usagenotes-apptips-microsoft<\/p>\n<p class=\"quellen\">[4] MySQL-Fehlercodes: http:\/\/dev.mysql.com\/doc\/refman\/5.0\/en\/error-messages-server.html<\/p>\n<p class=\"quellen\">[5] MySQL-Proxy.PDF: <a href=\"http:\/\/www.moss-soft.de\/pu\">http:\/\/www.moss-soft.de\/public\/mysqlproxy.pdf<\/a><\/p>\n<p class=\"quellen\">[6] Showplan-Tool: http:\/\/www.access-im-unternehmen.de\/599.0.html<\/p>\n<table>\n<tbody>\n<tr>\n<td>\n<p class=\"kastentabelleheader\">Im Soforteinsatz<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td>\n<p>Um die Beispiele in der Demo-Datenbank nachvollziehen zu k&ouml;nnen, ben&ouml;tigen Sie die entsprechenden Tabellen auf einem MySQL-Server. Dazu muss lediglich das Dump-Skript <b>Suedsturm_Backup2.sql <\/b>&uuml;ber den <b>MySQL-Administrator <\/b>und dessen Funktion <b>Wiederherstellung <\/b>ausgef&uuml;hrt werden. Es erzeugt automatisch die Datenbank und die Tabellen. Eine eventuell bestehende Datenbank gleichen Namens wird aktualisiert.<\/p>\n<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<h3>Downloads zu diesem Beitrag<\/h3>\n<p>Enthaltene Beispieldateien:<\/p>\n<p>MySQLIII.zip<\/p>\n<p><a href=\"..\/fileadmin\/beispiele\/D9B4DC3D-31D6-498A-9928-B9CD4FC8BD85\/aiu_590.zip\">Download<\/a><\/p>\n","protected":false},"excerpt":{"rendered":"<p>Sie haben Ihr Access-Backend auf einen MySQL-Server migriert, die notwendigen Anpassungen vorgenommen und die Tabellen &uuml;ber ODBC in Ihr Frontend verkn&uuml;pft. Mit Unterst&uuml;tzung der beiden vorausgegangenen Beitr&auml;ge dieser Serie (Shortlink 544 und 588) sollte das gelungen sein. Schauen wir nun, was es mit dem Zugriff auf die Tabellen auf sich hat und was es dabei zu beachten gilt.<\/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":[662008,66032008,44000026,44000022],"tags":[],"class_list":["post-55000590","post","type-post","status-publish","format-standard","hentry","category-662008","category-66032008","category-Interaktiv","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>Access, MySQL und Datenzugriff - 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\/Access_MySQL_und_Datenzugriff\/\" \/>\n<meta property=\"og:locale\" content=\"de_DE\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Access, MySQL und Datenzugriff\" \/>\n<meta property=\"og:description\" content=\"Sie haben Ihr Access-Backend auf einen MySQL-Server migriert, die notwendigen Anpassungen vorgenommen und die Tabellen &uuml;ber ODBC in Ihr Frontend verkn&uuml;pft. Mit Unterst&uuml;tzung der beiden vorausgegangenen Beitr&auml;ge dieser Serie (Shortlink 544 und 588) sollte das gelungen sein. Schauen wir nun, was es mit dem Zugriff auf die Tabellen auf sich hat und was es dabei zu beachten gilt.\" \/>\n<meta property=\"og:url\" content=\"https:\/\/access-im-unternehmen.de\/Access_MySQL_und_Datenzugriff\/\" \/>\n<meta property=\"og:site_name\" content=\"Access im Unternehmen\" \/>\n<meta property=\"article:published_time\" content=\"2021-02-11T21:20:36+00:00\" \/>\n<meta property=\"og:image\" content=\"http:\/\/vg09.met.vgwort.de\/na\/bd6f3dd9d2b04ee2890d76a66fe8be87\" \/>\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=\"23\u00a0Minuten\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\\\/\\\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Access_MySQL_und_Datenzugriff\\\/#article\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Access_MySQL_und_Datenzugriff\\\/\"},\"author\":{\"name\":\"Andr\u00e9 Minhorst\",\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/#\\\/schema\\\/person\\\/13395c4bcd7d7963efe33be9c584d93f\"},\"headline\":\"Access, MySQL und Datenzugriff\",\"datePublished\":\"2021-02-11T21:20:36+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Access_MySQL_und_Datenzugriff\\\/\"},\"wordCount\":3943,\"commentCount\":0,\"publisher\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/#organization\"},\"image\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Access_MySQL_und_Datenzugriff\\\/#primaryimage\"},\"thumbnailUrl\":\"http:\\\/\\\/vg09.met.vgwort.de\\\/na\\\/bd6f3dd9d2b04ee2890d76a66fe8be87\",\"articleSection\":[\"2008\",\"3\\\/2008\",\"Interaktiv\",\"SQL Server und Co.\"],\"inLanguage\":\"de\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\\\/\\\/access-im-unternehmen.de\\\/Access_MySQL_und_Datenzugriff\\\/#respond\"]}]},{\"@type\":\"WebPage\",\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Access_MySQL_und_Datenzugriff\\\/\",\"url\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Access_MySQL_und_Datenzugriff\\\/\",\"name\":\"Access, MySQL und Datenzugriff - Access im Unternehmen\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Access_MySQL_und_Datenzugriff\\\/#primaryimage\"},\"image\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Access_MySQL_und_Datenzugriff\\\/#primaryimage\"},\"thumbnailUrl\":\"http:\\\/\\\/vg09.met.vgwort.de\\\/na\\\/bd6f3dd9d2b04ee2890d76a66fe8be87\",\"datePublished\":\"2021-02-11T21:20:36+00:00\",\"breadcrumb\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Access_MySQL_und_Datenzugriff\\\/#breadcrumb\"},\"inLanguage\":\"de\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\\\/\\\/access-im-unternehmen.de\\\/Access_MySQL_und_Datenzugriff\\\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"de\",\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Access_MySQL_und_Datenzugriff\\\/#primaryimage\",\"url\":\"http:\\\/\\\/vg09.met.vgwort.de\\\/na\\\/bd6f3dd9d2b04ee2890d76a66fe8be87\",\"contentUrl\":\"http:\\\/\\\/vg09.met.vgwort.de\\\/na\\\/bd6f3dd9d2b04ee2890d76a66fe8be87\"},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Access_MySQL_und_Datenzugriff\\\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\\\/\\\/access-im-unternehmen.de\\\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Access, MySQL und Datenzugriff\"}]},{\"@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":"Access, MySQL und Datenzugriff - 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\/Access_MySQL_und_Datenzugriff\/","og_locale":"de_DE","og_type":"article","og_title":"Access, MySQL und Datenzugriff","og_description":"Sie haben Ihr Access-Backend auf einen MySQL-Server migriert, die notwendigen Anpassungen vorgenommen und die Tabellen &uuml;ber ODBC in Ihr Frontend verkn&uuml;pft. Mit Unterst&uuml;tzung der beiden vorausgegangenen Beitr&auml;ge dieser Serie (Shortlink 544 und 588) sollte das gelungen sein. Schauen wir nun, was es mit dem Zugriff auf die Tabellen auf sich hat und was es dabei zu beachten gilt.","og_url":"https:\/\/access-im-unternehmen.de\/Access_MySQL_und_Datenzugriff\/","og_site_name":"Access im Unternehmen","article_published_time":"2021-02-11T21:20:36+00:00","og_image":[{"url":"http:\/\/vg09.met.vgwort.de\/na\/bd6f3dd9d2b04ee2890d76a66fe8be87","type":"","width":"","height":""}],"author":"Andr\u00e9 Minhorst","twitter_card":"summary_large_image","twitter_misc":{"Verfasst von":"Andr\u00e9 Minhorst","Gesch\u00e4tzte Lesezeit":"23\u00a0Minuten"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/access-im-unternehmen.de\/Access_MySQL_und_Datenzugriff\/#article","isPartOf":{"@id":"https:\/\/access-im-unternehmen.de\/Access_MySQL_und_Datenzugriff\/"},"author":{"name":"Andr\u00e9 Minhorst","@id":"https:\/\/access-im-unternehmen.de\/#\/schema\/person\/13395c4bcd7d7963efe33be9c584d93f"},"headline":"Access, MySQL und Datenzugriff","datePublished":"2021-02-11T21:20:36+00:00","mainEntityOfPage":{"@id":"https:\/\/access-im-unternehmen.de\/Access_MySQL_und_Datenzugriff\/"},"wordCount":3943,"commentCount":0,"publisher":{"@id":"https:\/\/access-im-unternehmen.de\/#organization"},"image":{"@id":"https:\/\/access-im-unternehmen.de\/Access_MySQL_und_Datenzugriff\/#primaryimage"},"thumbnailUrl":"http:\/\/vg09.met.vgwort.de\/na\/bd6f3dd9d2b04ee2890d76a66fe8be87","articleSection":["2008","3\/2008","Interaktiv","SQL Server und Co."],"inLanguage":"de","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/access-im-unternehmen.de\/Access_MySQL_und_Datenzugriff\/#respond"]}]},{"@type":"WebPage","@id":"https:\/\/access-im-unternehmen.de\/Access_MySQL_und_Datenzugriff\/","url":"https:\/\/access-im-unternehmen.de\/Access_MySQL_und_Datenzugriff\/","name":"Access, MySQL und Datenzugriff - Access im Unternehmen","isPartOf":{"@id":"https:\/\/access-im-unternehmen.de\/#website"},"primaryImageOfPage":{"@id":"https:\/\/access-im-unternehmen.de\/Access_MySQL_und_Datenzugriff\/#primaryimage"},"image":{"@id":"https:\/\/access-im-unternehmen.de\/Access_MySQL_und_Datenzugriff\/#primaryimage"},"thumbnailUrl":"http:\/\/vg09.met.vgwort.de\/na\/bd6f3dd9d2b04ee2890d76a66fe8be87","datePublished":"2021-02-11T21:20:36+00:00","breadcrumb":{"@id":"https:\/\/access-im-unternehmen.de\/Access_MySQL_und_Datenzugriff\/#breadcrumb"},"inLanguage":"de","potentialAction":[{"@type":"ReadAction","target":["https:\/\/access-im-unternehmen.de\/Access_MySQL_und_Datenzugriff\/"]}]},{"@type":"ImageObject","inLanguage":"de","@id":"https:\/\/access-im-unternehmen.de\/Access_MySQL_und_Datenzugriff\/#primaryimage","url":"http:\/\/vg09.met.vgwort.de\/na\/bd6f3dd9d2b04ee2890d76a66fe8be87","contentUrl":"http:\/\/vg09.met.vgwort.de\/na\/bd6f3dd9d2b04ee2890d76a66fe8be87"},{"@type":"BreadcrumbList","@id":"https:\/\/access-im-unternehmen.de\/Access_MySQL_und_Datenzugriff\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/access-im-unternehmen.de\/"},{"@type":"ListItem","position":2,"name":"Access, MySQL und Datenzugriff"}]},{"@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\/55000590","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=55000590"}],"version-history":[{"count":0,"href":"https:\/\/access-im-unternehmen.de\/data\/wp\/v2\/posts\/55000590\/revisions"}],"wp:attachment":[{"href":"https:\/\/access-im-unternehmen.de\/data\/wp\/v2\/media?parent=55000590"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/access-im-unternehmen.de\/data\/wp\/v2\/categories?post=55000590"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/access-im-unternehmen.de\/data\/wp\/v2\/tags?post=55000590"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}