Forbindelsesstrengparametre for gemte specifikationer
Access giver en anden metode til at beskrive tekstfilers skema ved at bruge systemtabeller MSysIMEXSpecs
og MSysIMEXColumns
for at gemme specifikationerne. I den forrige artikel dækkede jeg hvordan schema.ini
kan bruges til at beskrive en tekstfils struktur. schema.ini
involverede en ekstern tekstfil, der implicit refereres til, men med systemtabellerne har vi ingen eksterne afhængigheder. Strukturen er ret anderledes, selvom der er nogle overlapninger.
MSysIMEXSpecs
og MSysIMEXColumns
systemtabel
I stedet for at stole på, at et eksternt schema.ini er til stede i samme mappe som tekstfilen, er det muligt at angive specifikationer for en tekstfil i en hvilken som helst sti ved at henvise til den gemte specifikation i Access-databasen. Når du bruger import- eller eksportguiden, kan du gemme eller indlæse specifikationerne gennem Advanced
knap.
Ved at klikke på knappen Avanceret vises specifikationsdialogen. Ud over at indlæse eller gemme specifikationerne kan du også tilpasse specifikationerne ved hjælp af den viste dialog.
Når en specifikation gemmes, skrives den til både MSysIMEXSpecs
og MSysIMEXColumns
systemtabeller. Tabellerne findes ikke i en ny Access-fil og vil kun blive oprettet ved første gang. Desuden kan du redigere eller endda slette data fra disse tabeller. Alligevel er de stadig systemtabeller, så de er skjult som standard. Hvis du vil se dem i navigationsruden, skal du gå til Navigationsindstillinger og aktivere synlighed for både skjulte objekter og systemobjekter.
Hvis du sammenligner de tilgængelige muligheder i dialogen med de muligheder, du har i schema.ini
, kan du se nogle bemærkelsesværdige forskelle. For et eksempel er schema.ini
giver flere valgmuligheder med hensyn til, hvordan datoerne eller valutabeløbene kan formateres. Med de gemte specifikationer kan vi kun styre datoformatering fra en forudindstillet liste over muligt format. Der er ingen direkte muligheder for valutabeløb, fordi vi bruger datatypen til at angive, at en kolonne skal importeres som valuta uanset formateringen. Systemtabellernes muligheder er således enkle sammenlignet med schema.ini. Vi vil herefter gennemgå tabellernes struktur.
MSysIMEXSpecs
struktur
Tabellen repræsenterer et sæt gemte specifikationer. For hver række beskriver tabellen det overordnede format af filen, svarende til den anden sektion af schema.ini
. Der er dog forskellige muligheder, som skal overvejes.
DateDelim
:Identificerer afgrænsningen for datoerne. Det er typisk/
eller-
. Det kan kun være et eller nul tegn.DateFourDigitYear
:Et Ja/Nej-felt, der angiver, om datoerne er formateret med fire cifre for årstal. Hvis indstillet til ja, værdier som10/10/20
ville ikke blive betragtet som gyldige datoer.DateLeadingZeros
:Endnu et Ja/Nej-felt, der angiver, om datoerne har indledende nuller.DateOrder
:Bestemmer den datoformatering, vi vil bruge. Følgende koder er gyldige:0
:DMY1
:DYM
2
:MDY3
:MYD
4
:YDM5
:YMD
DecimalPoint
:Angiver tegnet, der adskiller integral- og brøkdelen for et decimaltal. Det skal kun være præcis ét tegn.FieldSeparator
:Adskiller felter i tekstfilen. For en CSV-fil ville det være,
(et kommategn). Det skal også kun være præcis ét tegn.FileType
:Svarer tilschema.ini
'sCharacterSet
. Som nævnt i den forrige artikel, kan du finde alle mulige kodesider, der understøttes på din Windows-maskine, se i registreringsdatabasenøglenComputer\HKEY_CLASSES_ROOT\MIME\Database\Codepage\
. Den identificerer tekstfilens kodning. Du kan bruge den samme tegntabel-id. Der er dog et problem.FileType
er defineret som etInteger
. Derfor vil en kodetabel 65000 (f.eks. Unicode) blive rapporteret som -536. For at konvertere enhver tegntabel-id, der er større end 32767, kan du bruge formlenCInt("&H" & Hex(x))
og for at vende operationen,CLng("&H" & Hex(x))
. For eksempel vil konvertering af tegntabel 65000 gå gennemCInt("&H" & Hex(65000))
at give -536. For at vende,CLng("&H" & Hex(-536))
for at få 65.000 tilbage igen.SpecID
:Autonummer til bordet. Bemærk, at dette ikke er den primære nøgle i tabellen. Denne kolonne bruges medMSysIMEXColumns.SpecID
at relatere optegnelser. Der er dog ingen fremmednøgle-begrænsning mellem de to tabeller, så forældreløse sletninger kan forekomme.SpecName
:Tabellens primære nøgle. Det identificerer entydigt specifikationen. Når du gemmer en specifikation, vil det navn, du angiver, blive registreret i dette felt. Når du importerer eller eksporterer ved hjælp af guider, kan Access automatisk oprette en ny specifikation, selvom du ikke brugteAdvanced
og gem det eksplicit.SpecType
:Det kan kun være enten1
for at angive afgrænset fil eller2
for at angive fil med fast bredde.StartRow
:Bestemmer rækken på tekstfilen, der skal starte scanning til import. Det kan være et hvilket som helst tal, så det er muligt at springe flere linjer over i toppen af filen. Det kan være nyttigt for dårligt udformede tekstfiler, der har ikke-overensstemmende overskrifter.TextDelim
:Et enkelt tegn, der afgrænser en tekstværdi. Det kan udelades, hvis tekst ikke er afgrænset. Hvis du kan styre formatet på tekstfilerne, er det normalt en god idé at have tekstafgrænsninger. En tekstfil med tekstskilletegn vil forblive velformet, selvom teksten indeholder feltseparatorer (f.eks. et komma) i teksten.TimeDelim
:Angiver det afgrænsningstegn, der er brugt for tiden. Det kan være et hvilket som helst enkelt tegn eller være tomt og er standard til:
(et kolontegn).
MSysIMEXColumns
struktur
Tabellen beskriver de enkelte kolonner i tekstfilen og eventuelle attributter. Dette svarer nogenlunde til den tredje sektion af schema.ini
. Der er dog yderligere muligheder, såsom indeksering, der ikke findes i schema.ini
.
Attributes
:Ukendt. I mine test fik jeg det aldrig til at være andet end0
. Hvis du ved, hvad det er til, og hvordan det kan bruges, er du velkommen til at lægge en kommentar.DataType
:Kolonnens datatype. Nummeret skal svare til DAO.DataTypeEnum.FieldName
:Kolonnens navn. Bemærk, at Access som standard erFieldN
hvorN
er et positivt heltal.IndexType
:Kan være0
for at angive ingen indekser,1
for at angive almindeligt indeks eller2
for at angive unikt indeks.SkipColumns
:En boolsk værdi angiver, om kolonnen skal springes over. Hvis den springes over, vil den ikke være tilgængelig for forespørgsler eller læsning.SpecID
:Svarer tilMSysIMEXSpecs.SpecID
autonummer. Bemærk, at der ikke er nogen fremmednøgle-begrænsninger mellem de to tabeller. Hvis du har slettet poster, kan der være forældreløse poster fraMSysIMEXSpecs
tabel.Start
:Et heltal, der angiver, hvornår kolonnen starter på tekstfilen. Det er vigtigt for en fil med fast bredde. For afgrænsede filer vil Access stadig bruge kolonnepositionen i den første række, hvor feltet findes, til at bestemme starten. Desuden vil Access bruge kolonnen til at antyde den ordinære rækkefølge af kolonnerne.Width
:Endnu et heltal til at styre størrelsen af kolonnen. På en fil med fast bredde er dette også væsentligt. Vær opmærksom på, at Microsoft Access vil bruge disse oplysninger til datatyper med variabel længde, såsom tekst eller binær, for at tilpasse kolonnen i overensstemmelse hermed, selv på en afgrænset fil.
Forbindelsesstreng ved hjælp af specifikationer:DSN
parameter
I den forrige artikel så du, at der ikke var nogen ændring af forbindelsesstrengen for at bruge en schema.ini-fil. Vi henviste implicit til schema.ini
simpelthen ved at sikre, at den findes i den samme mappe, hvor den tekstfil, vi linker eller åbner, er til stede. For at bruge de gemte specifikationer fra systemet kræver det dog, at vi leverer oplysningerne i forbindelsen. Vi gør dette ved at udfylde DSN
parameter. Værdien skal referere til den gemte specifikations navn, som er registreret i MSysIMEXSpecs.SpecName
kolonne.
Her er et eksempel:
Set db = DBEngine.OpenDatabase(vbNullString, False, False, "Text;DSN=Products Link Specification;IMEX=1;DATABASE=C:\Links")
Adgang vil kræve, at både DSN-parameter og IMEX-parametre leveres i forbindelsesstrengen. Hvis du forsøger at udelade IMEX
parameter, vil du få en fejl om, at Access ikke kan finde specifikationen, selvom specifikationen findes i MSysIMEXSpecs
bord. Det følger også, at tabellen skal indeholde en post med SpecName
indeholdende den samme værdi som angivet i DSN
parameter.
Som nævnt i den tidligere artikel behandles de individuelle tekstfiler som en "tabel" i mappens "database". Så selvom forbindelsesstrengen ikke peger på en specifik tekstfil, vil forbindelsesstrengen bruge de angivne specifikationer på alle tekstfiler, der åbnes gennem forbindelsen.
Selvom det er muligt at bruge andre parametre som beskrevet i samme artikel, skal du være opmærksom på, at når der er konflikt, vil den gemte specifikation have forrang over forbindelsesstrengen. Af den grund er det bedst at bruge et minimalt sæt parametre, der kræves for at oprette forbindelse til en tekstfil og lade de gemte specifikationer gøre arbejdet med at beskrive, hvordan tekstfilen læses.
Konklusion
Du lærte en alternativ måde at beskrive tekstfilens struktur på uden at bruge en ekstern fil. Vi så på, hvordan Access bruger to systemtabeller til at gemme specifikationerne. Til sidst lærte du også, hvordan du angiver de gemte specifikationer ved hjælp af DSN
parameter. På dette tidspunkt har vi dækket alt, hvad vi behøver at vide om at linke eller åbne tekstfiler i Access. I den næste artikel vil vi samle de oplysninger, vi har lært i resten af serien. Vi vil også se på at bruge forbindelsesstrengene i Access-forespørgsler til en kodefri tilgang.