sql >> Database >  >> RDS >> Access

Hoe praat Access met ODBC-gegevensbronnen? Deel 1

Dit is een zesdelige serie artikelen over ODBC-tracering om Access-ontwikkelaars te helpen bij het oplossen van problemen en het werken met Access bij het ontwikkelen van een toepassing die gebruikmaakt van ODBC-gegevensbron(nen), meestal maar niet uitsluitend SQL Server. De serie is bedoeld om te demonstreren hoe de ODBC-tracering kan worden gebruikt om ODBC SQL-statements te bewaken die Access-problemen op de achtergrond veroorzaken bij het werken met objecten zoals query's, formulieren of rapporten of zelfs tijdens het uitvoeren van VBA-code tegen DAO-objecten. De serie laat ook zien hoe Access de ODBC SQL-statements formuleert. Ten slotte wordt in de serie besproken hoe de tracering moet worden geïnterpreteerd en mogelijke problemen kunnen worden geïdentificeerd. De artikelen worden dagelijks gedrukt totdat de serie is afgelopen.

UPDATE: Een registersleutel toegevoegd voor 32-bits C2R-installatie op 64-bits Windows. Bedankt, Jack MacDonald!

Hoe vaak heb je gehoord:"Ik weet niet waarom, maar schudden met de hendel werkt gewoon"? Telkens als ik dat soort reactie krijg, irriteert het me omdat het zo onbevredigend is. Ik zou me erg zorgen maken als mijn loodgieter me zou vertellen dat hij niet wist dat een p-trap bedoeld is en ernaar zou blijven verwijzen als "dat bochtige dingamijig onder de gootsteen". Evenzo zouden mijn klanten zich grote zorgen moeten maken als ik zei:"Ik weet niet waarom die zoekopdracht traag was, dus ik probeerde een paar willekeurige dingen en hey, ik vond een truc die werkt. Ik weet echter niet waarom.” Het is misschien wel een van de grootste problemen van softwareontwikkeling:we werken met een complex systeem dat in een bepaalde volgorde heel snel tussen 0 en 1 schakelt en er wordt verwacht dat we weten waarom het niet op die manier deed in plaats van op deze manier.

Ik geloof dat het de tijd en investering waard is voor de ontwikkelaar die met Access en VBA werkt om echt te weten wat het doet, vooral met een ODBC-backend. We hebben migratiescenario's gehad waarbij we om verschillende redenen mogelijk geen toegang hadden tot de profileringstools aan de serverzijde, maar dat zou geen reden moeten zijn om onze schouders op te halen en willekeurig knoppen te gebruiken totdat iets werkt. Wat nog belangrijker is, is dat een goed begrip van wat er onder de motorkap gebeurt, u helpt veel beter te voorspellen welke prestatieverbeteringen u voor een bepaald scenario moet toepassen. Ik beweer dat zelfs als je alleen de serie hebt gelezen en leert hoe Access werkt met ODBC-gegevensbronnen, je veel beter uitgerust zult zijn, simpelweg omdat je weet wat Access waarschijnlijk zal doen.

Voor meer gecompliceerde scenario's kan tracering meestal wonderen doen door te onthullen waarom dingen zo langzaam gaan. Omdat u het aan de Access-zijde kunt traceren in plaats van op de server, zijn er geen verhoogde machtigingen vereist, behalve dat u toegang hebt tot de registersleutel om ODBC-tracering in te schakelen. De toegevoegde bonus is dat dit werkt voor alle ODBC-gegevensbronnen, niet alleen voor SQL Server, dus als u een client heeft die MySQL of PostgreSQL gebruikt waar u niets vanaf weet, zal ODBC-tracering u nog steeds helpen potentiële problemen te identificeren die u vervolgens direct kunt aanpakken Toegangszijde.

De serie zal zich alleen richten op de context van Access en DAO. Dingen kunnen anders zijn wanneer we ADO in VBA gebruiken, maar dat is voorlopig niet binnen het bereik, want wanneer we DAO gebruiken, zal Access verschillende dingen doen om aan onze anders onmogelijke verzoeken te voldoen. Een goed voorbeeld is een Access-query die verwijst naar een VBA-functie. U kunt de VBA-functie niet uitvoeren op SQL Server, maar Access klaagt niet. Dus wat gebeurt er echt achter het gordijn? We kunnen ontdekken wat Access doet door de ODBC SQL-opdrachten te traceren die het geeft aan de ODBC-gegevensbronnen.

Veel van de informatie die in deze serie artikelen wordt gepresenteerd, is mogelijk gemaakt met behulp van de oude whitepaper van Microsoft over Jet &ODBC. Hoewel ik denk dat de informatie nog steeds erg nuttig is, is het ook vrij compact en vereist het een hoog niveau van technische vaardigheid. Het is te hopen dat door de traceerreeks te doorlopen, het zal helpen om de informatie logisch te maken en de informatie op een meer toegankelijke manier te presenteren.

Waarom moeten we ODBC traceren? Hoe kan het mij helpen?

Als u ooit een van deze symptomen heeft gehad:

Of andere fouten bij het werken met een ODBC-gekoppelde tabel, dan is het nuttig om te begrijpen waarom u deze berichten ontvangt en hoe u ze kunt oplossen. Een veelvoorkomende oplossing die verschillende Access-ontwikkelaars toepassen, is om Requery toe te voegen of te proberen de records op te slaan. Hoewel dat enkele van de problemen zou kunnen oplossen, is het niet ongehoord om te zien dat een complex Access-formulier rijkelijk wordt besprenkeld met Requery en verschillende trapsgewijze gebeurtenisketens die de prestaties beginnen te lijden. In plaats van ze te besprenkelen alsof ze magisch elfenstof zijn, zouden we meer chirurgisch moeten zijn in onze aanpak om problemen met de toepassing op te lossen.

Een andere dwingende reden is om te kunnen analyseren waarom een ​​bepaalde vorm A 10 seconden nodig heeft om te openen, maar een vergelijkbare vorm B slechts 2 seconden om te openen. In plaats van de tijd te nemen om dingen heen en weer te schuiven om te ontdekken waardoor formulier A sneller opengaat, kunt u beginnen met het opsporen en vergelijken van het verschil en u vervolgens concentreren op het verschil om u te helpen de problemen op een directere manier op te lossen.

Zelfs als we niet altijd elke keer traceren als er prestatieproblemen zijn, is het van onschatbare waarde om bekend te zijn met wat Access zou moeten doen. Dus zelfs als je alleen de serie hebt gelezen, zul je hopelijk beter begrijpen hoe je met Access kunt werken in plaats van ertegen.

Toegang tot SQL- en ODBC SQL-dialecten

Voordat we ingaan op de details, moeten we erkennen dat wanneer Access werkt met een ODBC-gegevensbron, het eerst de SQL-instructie moet vertalen in een geldige ODBC SQL-instructie. Dit verschilt van het doel-SQL-dialect van de backend (bijv. SQL Server, Oracle, MySQL, PostgreSQL). De ODBC SQL-grammatica wordt hier beschreven. U kunt ook een lijst zien van alle functies die door de ODBC-laag worden ondersteund. Het is belangrijk om te onthouden dat wanneer we ODBC gebruiken, we niet echt rechtstreeks vertalen van Access SQL naar het native SQL-dialect van de gegevensbron. In plaats daarvan vertalen we Access SQL naar ODBC SQL, die het ODBC-stuurprogramma voor de gegeven gegevensbron vervolgens in het oorspronkelijke dialect vertaalt. Als je je een Japanse spreker en een Franse spreker kunt voorstellen die elkaars taal niet spreken, maar beiden wel Engels, dan is dat in feite wat er gebeurt over de ODBC-laag. Een ander gevolg is dat het feit dat het ODBC-dialect feature X ondersteunt, niet betekent dat beide partijen het ondersteunen. Beide zijden moeten die functie X ondersteunen om over de ODBC-laag te kunnen worden overgedragen. Gelukkig zijn de meeste ODBC-stuurprogramma's vrij breed en kunnen ze de meeste functies goed dekken. Als u een situatie tegenkomt waarin een functie zou moeten werken maar niet werkt, kan het de moeite waard zijn om de documentatie van het ODBC-stuurprogramma te raadplegen om te controleren of deze wordt ondersteund.

ODBC SQL-tracering inschakelen

Het eerste dat we moeten doen, zodat we achter de gordijnen kunnen kijken, is de ODBC SQL-tracing inschakelen. Hoewel we SQL Server Profiler kunnen gebruiken, is het erg nuttig om te kijken hoe Access de ODBC SQL opmaakt. Het werkt met alle ODBC-gegevensbronnen en niet alleen met SQL Server. Belangrijker is dat dit ons laat zien hoe Access zijn zoekopdrachten op een directere manier naar ODBC vertaalt dan de SQL Server Profiler of andere server-side profileringstools. U hebt geen speciale machtigingen nodig om ODBC SQL-tracering te gebruiken, terwijl profilingtools aan de serverzijde mogelijk een hoog machtigingsniveau vereisen. Het inschakelen van ODBC SQL-tracering is een registerinstelling, dus we kunnen dit configureren door naar de juiste registersleutel te gaan:

Jet-database of Office-versies vóór 2007

Voor 32-bits Windows:

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

Voor 32-bits Jet-engine of pre-2007 Office op 64-bits Windows:

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

Opmerking:er is geen 64-bits versie van de verouderde straalmotor.

Office 2007 tot 2016 (MSI-installaties)

Voor 32-bits Office op 32-bits Windows, of 64-bits Office op 64-bits Windows:

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

Voor 32-bits Office op 64-bits Windows:

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

(waar X.Y komt overeen met de versie van Office die u hebt geïnstalleerd)

Office 2016 of Office 365 (klik om uit te voeren)

Voor 32-bits Office op 32-bits Windows, of 64-bits Office op 64-bits Windows:

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

Voor 32-bits Office op 64-bits Windows:

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

Zoek onder de sleutel de sleutel TraceSQLMode en verander de waarde van 0 naar 1 .

De toegang moet opnieuw worden gestart als deze al is geopend. Open het anders en voer een aantal query's uit. Een bestand met de naam sqlout.txt wordt aangemaakt in de huidige directory. Dat bevindt zich meestal in dezelfde map als het Access-bestand OF in de documentenmap. Als alternatief kunt u de VBA-functie CurDir . uitvoeren om de huidige map te bepalen.

Ik raad aan om Notepad++ of een vergelijkbare teksteditor te gebruiken die kan detecteren dat deze is gewijzigd. Het zal dan vragen om het bestand opnieuw te laden. Dat stelt u in staat om nieuwe updates te bekijken terwijl Access nieuwe opdrachten naar het tekstbestand verzendt zonder constant opnieuw te openen. Wanneer u het tekstbestand activeert, zal Notepad++ een dialoogvenster tonen:

U kunt vervolgens op Yes klikken om de nieuwste ODBC SQL-opdrachten te zien die zijn uitgegeven door Access. Omdat Access verschillende ODBC SQL-opdrachten kan geven, kan het logboek snel groeien. Ik vind het handig om op het punt te komen waar ik iets wil traceren (bijvoorbeeld op het punt een formulier te openen of een query uit te voeren), dan schakel ik over naar de sqlout.txt , laad het opnieuw, selecteer vervolgens alles, verwijder alle tekst en sla het nu lege bestand op. Op die manier kan ik de actie uitvoeren die ik wil traceren, en dan alleen de relevante ODBC-commando's zien zonder alle andere geluiden die niets te maken hebben met de actie die wordt getraceerd.

Hier is een korte video om te demonstreren:

Conclusies

U hebt geleerd hoe u ODBC-tracering inschakelt en de door Access gegenereerde uitvoer bekijkt. U kunt zien dat u zelfs uitvoer kunt verzamelen van acties zoals het eenvoudig openen van een tabel of het uitvoeren van een query. Dat geeft u inzicht in wat voor soort SQL-query's Access daadwerkelijk naar de ODBC-gegevensbron verzendt.

Zoals u kunt zien, legt ODBC SQL-tracering alle ODBC SQL-opdrachten vast die zijn uitgegeven door Access, zelfs als u deze niet rechtstreeks hebt uitgegeven. Daarom kunt u het op elk punt gebruiken waar u vertragingen ervaart waarvoor u geen goede verklaring hebt. Stel dat u een formulier heeft dat traag opent en u niet zeker weet of het uw VBA-code is in de Open van het formulier. of Load gebeurtenissen of de recordbron die het probleem is. Een strategie zou zijn om de Access-toepassing zo in te stellen dat u op het punt staat dat formulier te openen, de sqlout.txt leeg te maken tekstbestand en ga vervolgens verder met het openen van het formulier. U kunt dan de getraceerde ODBC SQL-instructies bekijken en bepalen of er verbeteringen zijn.

Dat is vooral waardevol als je te maken hebt met een complex formulier of rapport dat ook subformulieren/subrapporten bevat of comboboxen of keuzelijsten bevat die hun eigen query's uitvoeren om te voldoen aan de rowsource-eigenschap.

In het volgende artikel zullen we de output analyseren wanneer we door records bladeren.

Hulp nodig bij Microsoft Access? Neem contact op met ons team op 773-809-5456 of e-mail ons op [email protected].


  1. MySQL 'user_id' in waar clausule dubbelzinnig probleem is

  2. Geen SPU meer

  3. Hoe een bestaande Postgres-tabel zo transparant mogelijk naar een gepartitioneerde tabel migreren?

  4. Algemene instructies voor het bouwen en implementeren van databaseservers