Access
 sql >> Datenbank >  >> RDS >> Access

Wie kommuniziert Access mit ODBC-Datenquellen? Teil 1

Dies ist eine sechsteilige Serie von Artikeln zur ODBC-Ablaufverfolgung, um Access-Entwicklern bei der Fehlerbehebung und Arbeit mit Access zu helfen, wenn sie eine Anwendung entwickeln, die ODBC-Datenquelle(n) verwendet, normalerweise, aber nicht ausschließlich, SQL Server. Die Serie soll zeigen, wie die ODBC-Ablaufverfolgung verwendet wird, um ODBC-SQL-Anweisungen zu überwachen, die Access im Hintergrund ausgibt, wenn mit Objekten wie Abfragen, Formularen oder Berichten gearbeitet wird oder sogar während der Ausführung von VBA-Code für DAO-Objekte. Die Serie zeigt auch, wie Access die ODBC-SQL-Anweisungen formuliert. Schließlich befasst sich die Serie mit der Interpretation der Ablaufverfolgung und der Identifizierung potenzieller Probleme. Die Artikel werden bis zum Abschluss der Serie täglich gedruckt.

AKTUALISIERUNG: Registrierungsschlüssel für die 32-Bit-C2R-Installation unter 64-Bit-Windows hinzugefügt. Danke, Jack MacDonald!

Wie oft haben Sie schon gehört „Ich weiß nicht warum, aber mit dem Griff zu wackeln funktioniert einfach“? Immer wenn ich so eine Antwort bekomme, irritiert es mich, weil es so unbefriedigend ist. Ich wäre sehr besorgt, wenn mein Klempner mir sagen würde, dass er nicht wüsste, wofür eine P-Falle ist, und es weiterhin als „das kurvige Dingamijig unter der Spüle“ bezeichnen würde. Ebenso sollten meine Kunden sehr besorgt sein, wenn ich sagte:„Ich weiß nicht, warum diese Abfrage langsam war, also habe ich ein paar zufällige Dinge ausprobiert und hey, ich habe einen Trick gefunden, der funktioniert. Ich weiß aber nicht warum.“ Es ist möglicherweise einer der größten Fehler in der Softwareentwicklung – wir arbeiten mit einem komplexen System, das darauf hinausläuft, sehr schnell in einer bestimmten Reihenfolge zwischen 0 und 1 hin- und herzuwechseln, und wir müssen wissen, warum es nicht auf diese Weise statt auf diese Weise vorgegangen ist.

Ich glaube, dass es die Zeit und Investition für den Entwickler wert ist, der mit Access und VBA arbeitet, um wirklich zu wissen, was es tut, insbesondere mit einem ODBC-Backend. Wir hatten Migrationsszenarien, in denen wir aus verschiedenen Gründen möglicherweise keinen Zugriff auf die serverseitigen Profilerstellungstools hatten, aber das sollte kein Grund sein, mit den Schultern zu zucken und einfach wahllos auf Knöpfe zu drücken, bis etwas funktioniert. Noch wichtiger ist, dass Sie mit einem soliden Verständnis dessen, was unter der Haube vor sich geht, viel besser vorhersagen können, welche Leistungskorrekturen Sie für ein bestimmtes Szenario anwenden müssen. Ich behaupte, dass Sie, selbst wenn Sie nur die Serie gelesen und erfahren haben, wie Access mit ODBC-Datenquellen funktioniert, viel besser gerüstet sind, einfach weil Sie wissen, was Access wahrscheinlich tun wird.

Bei komplizierteren Szenarien kann die Ablaufverfolgung normalerweise Wunder bewirken, indem sie aufdeckt, warum die Dinge so langsam laufen. Da Sie es auf der Zugriffsseite und nicht auf dem Server nachverfolgen können, sind keine erhöhten Berechtigungen erforderlich, die über den Zugriff auf den Registrierungsschlüssel hinausgehen, um die ODBC-Nachverfolgung zu aktivieren. Der zusätzliche Bonus ist, dass dies für alle ODBC-Datenquellen funktioniert, nicht nur für SQL Server. Wenn Sie also einen Client haben, der MySQL oder PostgreSQL verwendet, von dem Sie nichts wissen, hilft Ihnen die ODBC-Ablaufverfolgung trotzdem dabei, potenzielle Probleme zu identifizieren, die Sie dann direkt angehen können Zugriffsseite.

Die Serie konzentriert sich nur auf den Kontext von Access und DAO. Die Dinge können anders sein, wenn wir ADO in VBA verwenden, aber das ist derzeit nicht im Rahmen, denn wann immer wir DAO verwenden, wird Access verschiedene Dinge tun, um unsere ansonsten unmöglichen Anforderungen zu erfüllen. Ein gutes Beispiel ist eine Access-Abfrage, die auf eine VBA-Funktion verweist. Sie können keine VBA-Funktion auf SQL Server ausführen, aber Access beschwert sich nicht. Was passiert also wirklich hinter den Kulissen? Wir können herausfinden, was Access tut, indem wir die ODBC-SQL-Befehle verfolgen, die es an die ODBC-Datenquellen ausgibt.

Viele der in dieser Artikelserie präsentierten Informationen werden mit Hilfe des alten Whitepapers von Microsoft zu Jet &ODBC ermöglicht. Obwohl ich denke, dass die Informationen immer noch sehr nützlich sind, sind sie auch ziemlich dicht und erfordern ein hohes Maß an technischer Kompetenz. Es ist zu hoffen, dass das Durchgehen der Nachverfolgungsserie dazu beiträgt, die Informationen sinnvoller zu machen und zugänglicher zu machen.

Warum sollten wir ODBC nachverfolgen? Wie wird es mir helfen?

Wenn Sie jemals eines dieser Symptome erlebt haben:

Oder andere Fehler beim Arbeiten mit einer ODBC-verknüpften Tabelle, dann ist es hilfreich zu verstehen, warum Sie diese Meldungen erhalten und wie Sie sie beheben können. Eine gängige Lösung, die mehrere Access-Entwickler anwenden, besteht darin, entweder Requery hinzuzufügen oder zu versuchen, die Datensätze zu speichern. Während dies einige der Probleme lösen könnte, ist es nicht ungewöhnlich, dass ein komplexes Access-Formular großzügig mit Requery besprenkelt wird und mehrere kaskadierende Ereignisketten, unter denen die Leistung zu leiden beginnt. Anstatt sie wie magischen Elfenstaub zu verstreuen, sollten wir bei der Behebung von Problemen mit der Anwendung chirurgischer vorgehen.

Ein weiterer zwingender Grund ist, analysieren zu können, warum ein bestimmtes Formular A 10 Sekunden zum Öffnen benötigt, aber ein ähnliches Formular B nur 2 Sekunden zum Öffnen. Anstatt sich die Zeit zu nehmen, Dinge herumzumischen, um herauszufinden, was Formular A schneller öffnet, können Sie damit beginnen, den Unterschied nachzuverfolgen und zu vergleichen, und sich dann auf den Unterschied konzentrieren, um die Probleme direkter zu beheben.

Auch wenn wir nicht jedes Mal nachverfolgen müssen, wenn es zu Leistungsproblemen kommt, ist es von immensem Wert, wenn Sie wissen, was Access tun sollte. Selbst wenn Sie also nur die Serie gelesen haben, werden Sie hoffentlich besser verstehen, wie man mit Access arbeitet als dagegen.

Zugriff auf SQL- und ODBC-SQL-Dialekte

Bevor wir ins Detail gehen, müssen wir erkennen, dass Access immer dann, wenn es mit einer ODBC-Datenquelle arbeitet, zuerst seine SQL-Anweisung in eine gültige ODBC-SQL-Anweisung übersetzen muss. Dies unterscheidet sich vom Ziel-SQL-Dialekt des Backends (z. B. SQL Server, Oracle, MySQL, PostgreSQL). Die ODBC-SQL-Grammatik wird hier beschrieben. Sie können auch eine Liste aller Funktionen sehen, die von der ODBC-Schicht unterstützt werden. Es ist wichtig, sich daran zu erinnern, dass wir bei der Verwendung von ODBC nicht direkt von Access SQL in den nativen SQL-Dialekt der Datenquelle übersetzen. Vielmehr übersetzen wir Access SQL in ODBC SQL, das der ODBC-Treiber für die angegebene Datenquelle dann in seinen nativen Dialekt übersetzt. Wenn Sie sich einen japanischsprachigen und einen französischsprachigen Menschen vorstellen können, die nicht die Sprache des anderen sprechen, aber beide Englisch sprechen, ist das im Grunde das, was über die ODBC-Schicht passiert. Eine weitere Konsequenz ist, dass nur weil der ODBC-Dialekt Feature X unterstützt, dies nicht bedeutet, dass beide Seiten ihn unterstützen. Beide Seiten müssen dieses Feature X unterstützen, damit es über die ODBC-Schicht portierbar ist. Glücklicherweise sind die meisten ODBC-Treiber ziemlich breit aufgestellt und decken die meisten Funktionen gut ab. Wenn Sie auf eine Situation stoßen sollten, in der eine Funktion funktionieren sollte, aber nicht funktioniert, kann es sich lohnen, die Dokumentation des ODBC-Treibers zu konsultieren, um zu überprüfen, ob sie unterstützt wird.

Aktivieren der ODBC-SQL-Ablaufverfolgung

Damit wir hinter die Kulissen blicken können, müssen wir zunächst die ODBC-SQL-Ablaufverfolgung aktivieren. Obwohl wir SQL Server Profiler verwenden können, ist es sehr hilfreich, sich anzusehen, wie Access das ODBC-SQL formatiert. Es funktioniert mit allen ODBC-Datenquellen und nicht nur mit SQL Server. Noch wichtiger ist, dass wir dadurch sehen können, wie Access seine Abfragen direkter in ODBC übersetzt als der SQL Server Profiler oder andere serverseitige Profilerstellungstools. Sie benötigen keine besonderen Berechtigungen, um die ODBC-SQL-Ablaufverfolgung zu verwenden, wohingegen serverseitige Profilerstellungstools möglicherweise eine hohe Berechtigungsstufe erfordern. Die Aktivierung der ODBC-SQL-Ablaufverfolgung ist eine Registrierungseinstellung, sodass wir dies konfigurieren können, indem wir zum entsprechenden Registrierungsschlüssel wechseln:

Jet-Datenbank oder Office-Versionen vor 2007

Für 32-Bit-Windows:

HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Jet\4.0\Engines\ODBC

Für 32-Bit-Jet-Engine oder Office vor 2007 unter 64-Bit-Windows:

HKEY_LOCAL_MACHINE\SOFTWARE\WOW6432Node\Microsoft\Jet\4.0\Engines\ODBC

Hinweis:Es gibt keine 64-Bit-Version der veralteten Jet-Engine.

Office 2007 bis 2016 (MSI-Installationen)

Für 32-Bit-Office unter 32-Bit-Windows oder 64-Bit-Office unter 64-Bit-Windows:

HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Office\X.Y\Access Connectivity Engine\Engines\ODBC

Für 32-Bit-Office unter 64-Bit-Windows:

HKEY_LOCAL_MACHINE\SOFTWARE\WOW6432Node\Microsoft\Office\X.Y\Access Connectivity Engine\Engines\ODBC

(wobei X.Y entspricht der von Ihnen installierten Office-Version)

Office 2016 oder Office 365 (Click-to-Run)

Für 32-Bit-Office unter 32-Bit-Windows oder 64-Bit-Office unter 64-Bit-Windows:

HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Office\ClickToRun\REGISTRY\MACHINE\Software\Microsoft\Office\16.0\Access Connectivity Engine\Engines\ODBC

Für 32-Bit-Office unter 64-Bit-Windows:

HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Office\ClickToRun\REGISTRY\MACHINE\Software\Wow6432Node\Microsoft\Office\16.0\Access Connectivity Engine\Engines\ODBC

Suchen Sie unter dem Schlüssel den Schlüssel TraceSQLMode und ändern Sie den Wert von 0 zu 1 .

Access muss neu gestartet werden, wenn es bereits geöffnet ist. Andernfalls öffnen Sie es und führen Sie einige Abfragen aus. Eine Datei namens sqlout.txt wird im aktuellen Verzeichnis erstellt. Das befindet sich normalerweise entweder im selben Ordner wie die Access-Datei ODER im Dokumentenordner. Alternativ können Sie die VBA-Funktion CurDir ausführen um das aktuelle Verzeichnis zu ermitteln.

Ich empfehle die Verwendung von Notepad ++ oder einem ähnlichen Texteditor, der Änderungen erkennen kann. Es wird dann aufgefordert, die Datei neu zu laden. Dadurch können Sie neue Updates anzeigen, wenn Access neue Befehle an die Textdatei ausgibt, ohne sie ständig erneut öffnen zu müssen. Wenn Sie die Textdatei aktivieren, zeigt Notepad++ einen Dialog:

Sie können dann auf Yes klicken , um die neuesten von Access ausgegebenen ODBC-SQL-Befehle anzuzeigen. Da Access mehrere ODBC-SQL-Befehle ausgeben kann, kann das Protokoll schnell anwachsen. Ich finde es bequem, an den Punkt zu kommen, an dem ich etwas nachverfolgen möchte (z. B. um ein Formular zu öffnen oder eine Abfrage auszuführen), dann wechsle ich zur sqlout.txt , laden Sie es neu, wählen Sie dann alles aus, löschen Sie den gesamten Text und speichern Sie dann die jetzt leere Datei. Auf diese Weise kann ich die Aktion ausführen, die ich verfolgen möchte, und sehe dann nur die relevanten ODBC-Befehle ohne alle anderen Geräusche, die nichts mit der verfolgten Aktion zu tun haben.

Hier ist ein kurzes Video zur Demonstration:

Schlussfolgerungen

Sie haben gelernt, wie Sie die ODBC-Ablaufverfolgung aktivieren und die von Access generierte Ausgabe anzeigen. Sie können sehen, dass Sie sogar Ausgaben von Aktionen wie dem einfachen Öffnen einer Tabelle oder dem Ausführen einer Abfrage erfassen können. Dadurch erhalten Sie Einblicke in die Art von SQL-Abfragen, die Access tatsächlich an die ODBC-Datenquelle sendet.

Wie Sie sehen können, erfasst die ODBC-SQL-Ablaufverfolgung alle von Access ausgegebenen ODBC-SQL-Befehle, selbst wenn Sie sie nicht direkt ausgegeben haben. Daher können Sie es an jedem Punkt verwenden, an dem Sie Verlangsamungen feststellen, wenn Sie keine gute Erklärung haben. Angenommen, Sie haben ein Formular, das sich nur langsam öffnet, und Sie sind sich nicht sicher, ob es Ihr VBA-Code in Open des Formulars ist oder Load Ereignisse oder die Datensatzquelle, das ist das Problem. Eine Strategie wäre, die Access-Anwendung so einzurichten, dass Sie im Begriff sind, dieses Formular zu öffnen und die sqlout.txt zu löschen Textdatei und fahren Sie dann mit dem Öffnen des Formulars fort. Anschließend können Sie die verfolgten ODBC-SQL-Anweisungen überprüfen und feststellen, ob es Verbesserungen gibt.

Das ist besonders wertvoll, wenn Sie es mit einem komplexen Formular oder Bericht zu tun haben, das auch Unterformulare/Unterberichte oder Kombinations- oder Listenfelder enthält, die ihre eigenen Abfragen ausgeben, um die rowsource-Eigenschaft zu erfüllen.

Im nächsten Artikel werden wir die Ausgabe analysieren, wenn wir Datensätze durchsuchen.

Benötigen Sie Hilfe mit Microsoft Access? Kontaktieren Sie unser Team unter 773-809-5456 oder senden Sie uns eine E-Mail an [email protected].