Åbning eller sammenkædning af tekst eller Excel som datakilder i Microsoft Access
Access er et fænomenalt værktøj til at arbejde med mange datakilder. Du har måske længe vidst, at du nemt kan importere eller eksportere data i en bred vifte af formater. Men vi havde et scenarie, hvor vi skulle behandle data fra eksterne datakilder. Behandlingen kører ofte, så import af data ville hurtigt blæse front-end-filen op. Desuden var det i denne situation ikke en holdbar mulighed at oprette en anden kopi af Access-filen som en midlertidig database for at undgå oppustethed. Hvilke valg havde vi? Det var her, vi bemærkede en mangel på information om åbning eller linkning til ikke-relationelle datakilder. Så lad os tage et dybt dyk i dette emne.
Denne blogserie har til formål at udfylde et hul i Microsofts dokumentation om at åbne eller linke til tekst eller Excel som datakilde i Access-applikationer. Connectionstrings.com og andre websteder giver nogle brødkrummer. Du kan normalt også opdage noget af adfærden ved at bruge Access' guider og derefter undersøge objekterne. Udstationering-gætning er dog ikke særlig nyttigt. Derfor vil denne serie af artikler diskutere, hvordan man bruger Excel- og tekstfiler som datakilder uden nødvendigvis at importere eller eksportere dataene.
Bemærk venligst, at serien ikke ville være mulig uden hjælp fra Dan Haught og Jim Ferguson, som var medforfatter til Microsoft Jet Database Engine Programmer's Guide. Selvom bogen for længst er udsolgt, er den stadig en værdifuld bog, hvis du arbejder meget med DAO.
Adgang til og ikke-relationelle datakilder
Access har altid understøttet brugen af Indexed Sequential Access Method (ISAM) som en potentiel datakilde, som gør det muligt at importere, linke eller eksportere til ikke-relationelle datakilder såsom tekstfiler eller Excel-regneark og endda andre filformater såsom Exchange, dBASE eller FoxPro. DAO gør det muligt, fordi det har ISAM-driverne, der kan arbejde med disse formater. Jeg vil dog fokusere på tekstfiler og Excel-regneark, da de er mere almindelige kilder, hvor vi har brug for Access til at arbejde med. Hvis alt, hvad du nogensinde har gjort, er at importere data ved hjælp af fanen Eksterne data via Access, kan det virke magisk, men i virkeligheden er alle Access' funktioner tilgængelige for os som programmører på DAO-niveau.
Så lad os glemme, at der findes troldmænd. Lad os glemme de skinnende ikoner på båndet. Lad os glemme, at der er linkede tabeller. Lad os bare bruge VBA-kode til at arbejde med datakilder ud af den blå luft. Kan vi? Absolut. Først vil vi se på forskellen mellem at linke og åbne en datakilde.
Linking vs. åbning
For at hjælpe med terminologien er vi nødt til at skelne mellem linkning kontra åbning . Linking betyder, at vi opretter en sammenkædet tabel, som nu er en Access "tabel", som vi kan bruge ligesom enhver anden Access-tabel. Som sådan er det et permanent objekt, der er defineret i Access-applikationen. I modsætning hertil er åbning, når vi tilgår datakilden direkte ved at bruge DAOs OpenDatabase
metode. I sagens natur vil åbning af en datakilde normalt ske via VBA-kode, som du snart vil se.
Opsætning af prøverne og koden
Fordi serien handler om at forstå de små detaljer om, hvordan Access interagerer med disse datakilder, vil vi først fokusere på at åbne i stedet for at linke her. Så hvordan åbner vi et Excel-regneark? Det er vel ikke en database? Lad os opsætte et minimumseksempel til at starte med. I en mappe, C:\Links
, opretter vi et Excel-regneark og en Access-databasefil med navnet Products.xlsx
og Sample.accdb
, henholdsvis:
Products.xlsx er et simpelt regneark med kun ét ark med dette indhold:
Lad os med dette tilføje VBA-kode i Sample.accdb
. I et standardmodul:
Public Sub OpenExcel() Dim db As DAO.Database Set db = DBEngine.OpenDatabase(vbNullString, False, False, "Excel 12.0 Xml;HDR=YES;IMEX=2;ACCDB=YES;DATABASE=C:\Links\Products.xlsx") Dim tdf As DAO.TableDef For Each tdf In db.TableDefs Debug.Print tdf.Name Dim fld As DAO.Field For Each fld In tdf.Fields Debug.Print fld.Name, Next Debug.Print Dim rs As DAO.Recordset Set rs = tdf.OpenRecordset Do Until rs.EOF For Each fld In rs.Fields Debug.Print fld.Value, Next Debug.Print rs.MoveNext Loop Next End Sub
Hvis vi kører koden, skulle vi få følgende output i vores umiddelbare vindue:
Products Count Apples 3 Bananas 5 Figs 8
Så selvom Excel ikke er en "database" (og hvis du bruger Excel som en database, skam dig 😉 ), kan vi stadig lade som om det er en "database" og gentage dens "tabeller" og "poster" ved hjælp af velkendte DAO-objekter. Al magien kommer fra denne forbindelsesstreng:
Excel 12.0 Xml;HDR=YES;IMEX=2;ACCDB=YES;DATABASE=C:\Links\Products.xlsx
Men det behøver ikke at være magisk. Serien vil dissekere delene af forbindelsesstrengene til Excel- og tekstfildrivere. Så lad os starte med at sammenligne med ODBC-forbindelsesstrengen, som du måske er mere bekendt med.
Datakildetyper
Hvis du har linket til ODBC-datakilder, har du sikkert bemærket, at ODBC-forbindelsesstrenge normalt ser sådan ud:
ODBC;DRIVER=...;SERVER=...;DATABASE=...;
Gad vide hvorfor det altid startede med ODBC
? Den første del er, hvad DAO bruger til at identificere typen af kilde. Men fordi Excel ikke er en ODBC-database, skal vi bruge Excel 12.0 Xml
for at angive, at DAO skal bruge en bestemt Excel-driver. Resten af forbindelsesstrengens syntaks er så påvirket af, hvilken driver vi bruger i den første del af forbindelsesstrengen.
Her er en delvis liste over mulige datakildetyper, som MS Access genkender:
Excel 8.0
:97-2003 xls-filerExcel 12.0
:xlsb-filerExcel 12.0 Xml
:xlsx-filerText
:Alle tekstfiler
Der er flere datakilder, inklusive SharePoint, Exchange eller FoxPro, men jeg vil ikke dække dem. Alligevel viser det, at Access er i stand til at arbejde med disse kilder ligesom en database, og det kan gøre det muligt for os at bruge DAO til at læse indholdet. Bemærk, at når vi bruger ikke-relationelle datakilder, er det muligvis ikke alle operationer, der understøttes fuldt ud. For eksempel kan du muligvis ikke redigere en eksisterende række, selvom du kan indsætte en række.
En udfordring med at åbne eller linke til en datakilde betyder dog, at du ikke bare kan importere dataene ind og derefter redigere skemaet, så det passer til dine behov. Derfor kan du opleve, at standardskemaet, du får, mens du linker, ikke vil være det, du ønsker. Af den grund vil en dybdegående forståelse af forbindelsesstrengen være vigtig. Derfor vil du lære mere om detaljerne i forbindelsesstrengene for både Excel og tekstfiler i de næste par artikler.
Konklusioner
Du så, at vi som et alternativ til at importere de eksterne data kan vælge at linke eller endda åbne en ekstern datakilde ved hjælp af DAO. Evnen til at linke eller åbne en ekstern datakilde er stærkt underudnyttet. Men muligheden for at linke eller åbne bør ikke udelukkes, da dette kan åbne op for nye scenarier, såsom at undgå oppustethed som en effekt af import, især i et aflåst miljø. I den næste artikel vil jeg diskutere de forskellige parametre, der bruges af Excel-driveren til at konstruere en gyldig forbindelsesstreng. I de følgende artikler vil jeg se på tekstfildriveren og forbindelsesparametrene. I den sidste artikel samler vi det hele.