Verbindingsreeksparameters voor opgeslagen specificaties
Access biedt een tweede methode om het schema van tekstbestanden te beschrijven met behulp van systeemtabellen MSysIMEXSpecs
en MSysIMEXColumns
om de specificaties op te slaan. In het vorige artikel heb ik besproken hoe schema.ini
kan worden gebruikt om de structuur van een tekstbestand te beschrijven. De schema.ini
betrof een extern tekstbestand waarnaar impliciet wordt verwezen, maar met de systeemtabellen hebben we geen externe afhankelijkheden. De structuur is behoorlijk anders, hoewel er enkele overlappingen zijn.
MSysIMEXSpecs
en MSysIMEXColumns
systeemtabel
In plaats van erop te vertrouwen dat een extern schema.ini aanwezig is in dezelfde map als het tekstbestand, is het mogelijk om specificaties voor een tekstbestand in een willekeurig pad op te geven door te verwijzen naar de opgeslagen specificatie in de Access-database. Wanneer u de wizard Importeren of Exporteren gebruikt, kunt u de specificaties opslaan of laden via de Advanced
knop.
Als u op de geavanceerde knop klikt, wordt het specificatievenster weergegeven. Naast het laden of opslaan van de specificaties, kunt u de specificaties ook aanpassen met behulp van het weergegeven dialoogvenster.
Telkens wanneer een specificatie wordt opgeslagen, wordt deze geschreven naar zowel de MSysIMEXSpecs
en MSysIMEXColumns
systeem tabellen. De tabellen bestaan niet in een nieuw Access-bestand en worden alleen bij de eerste keer gemaakt. Bovendien kunt u gegevens uit die tabellen bewerken of zelfs verwijderen. Toch zijn het nog steeds systeemtabellen, dus ze zijn standaard verborgen. Als je ze in het navigatievenster wilt zien, moet je naar de navigatieopties gaan en zichtbaarheid inschakelen voor zowel verborgen als systeemobjecten.
Als je de beschikbare opties in het dialoogvenster vergelijkt met de opties die je hebt in de schema.ini
, kunt u enkele opmerkelijke verschillen zien. Bijvoorbeeld de schema.ini
biedt meer keuzes met betrekking tot hoe de datums of valutabedragen kunnen worden opgemaakt. Met de opgeslagen specificaties kunnen we alleen de datumnotatie controleren vanuit een vooraf ingestelde lijst met mogelijke formaten. Er zijn geen directe opties voor valutabedragen omdat we het gegevenstype gebruiken om aan te geven dat een kolom ongeacht de opmaak als valuta moet worden geïmporteerd. De opties van de systeemtabellen zijn dus eenvoudig in vergelijking met schema.ini. We zullen hierna de structuur van de tabellen bekijken.
MSysIMEXSpecs
structuur
De tabel vertegenwoordigt een set opgeslagen specificaties. Voor elke rij beschrijft de tabel de algemene indeling van het bestand, vergelijkbaar met de 2e sectie van de schema.ini
. Er zijn echter verschillende opties die overwogen moeten worden.
DateDelim
:Identificeert het scheidingsteken voor de datums. Het is meestal/
of-
. Het kan maar één of nul karakter zijn.DateFourDigitYear
:Een Ja/Nee-veld dat aangeeft of de datums jarenlang met vier cijfers zijn opgemaakt. Indien ingesteld op ja, waarden zoals10/10/20
worden niet als geldige datums beschouwd.DateLeadingZeros
:Nog een Ja/Nee-veld dat aangeeft of de datums voorloopnullen hebben.DateOrder
:Bepaalt de datumnotatie die we willen gebruiken. De volgende codes zijn geldig:0
:DMY1
:DYM
2
:MDY3
:MYD
4
:YDM5
:YMD
DecimalPoint
:Geeft het teken aan om het integrale en fractionele deel van een decimaal getal te scheiden. Het mag slechts uit één teken bestaan.FieldSeparator
:Scheidt velden in het tekstbestand. Voor een CSV-bestand is dit,
(een komma). Het mag ook maar één teken zijn.FileType
:gelijk aanschema.ini
'sCharacterSet
. Zoals vermeld in het vorige artikel, kunt u alle mogelijke codepagina's vinden die op uw Windows-machine worden ondersteund, kijk in de registersleutelComputer\HKEY_CLASSES_ROOT\MIME\Database\Codepage\
. Het identificeert de codering van het tekstbestand. U kunt dezelfde codepagina-ID gebruiken. Er is echter één probleem. HetFileType
wordt gedefinieerd als eenInteger
. Daarom zou een codetabel 65000 (bijvoorbeeld Unicode) worden gerapporteerd als -536. Om een codetabel-ID groter dan 32767 om te zetten, kunt u de formuleCInt("&H" & Hex(x))
gebruiken en om de bewerking om te keren,CLng("&H" & Hex(x))
. Het converteren van codetabel 65000 gaat bijvoorbeeld viaCInt("&H" & Hex(65000))
-536 opleveren. Om om te keren,CLng("&H" & Hex(-536))
om 65000 weer terug te krijgen.SpecID
:Autonummering voor de tafel. Merk op dat dit niet de primaire sleutel van de tabel is. Deze kolom wordt gebruikt metMSysIMEXColumns.SpecID
records te relateren. Er is echter geen externe sleutelbeperking tussen de twee tabellen, dus verweesde verwijderingen kunnen optreden.SpecName
:De primaire sleutel van de tabel. Het identificeert de specificatie op unieke wijze. Telkens wanneer u een specificatie opslaat, wordt de naam die u opgeeft in dit veld opgenomen. Wanneer u importeert of exporteert met behulp van wizards, kan Access automatisch een nieuwe specificatie maken, zelfs als u deAdvanced
niet hebt gebruikt en sla het expliciet op.SpecType
:Het kan alleen1
. zijn om een gescheiden bestand of2
. aan te duiden om een bestand met vaste breedte aan te duiden.StartRow
:bepaalt de rij in het tekstbestand om te beginnen met scannen voor import. Dat kan een willekeurig aantal zijn, dus het is mogelijk om meerdere regels bovenaan het bestand over te slaan. Het kan handig zijn voor slecht gevormde tekstbestanden met niet-conforme headers.TextDelim
:Een enkel teken dat een tekstwaarde begrenst. Het kan worden weggelaten als tekst niet wordt gescheiden. Als u het formaat van de tekstbestanden kunt bepalen, is het meestal een goed idee om tekstscheidingstekens te gebruiken. Een tekstbestand met tekstscheidingstekens blijft goed opgemaakt, zelfs als de tekst veldscheidingstekens (bijvoorbeeld een komma) in de tekst bevat.TimeDelim
:Geeft het scheidingsteken aan dat voor de tijd wordt gebruikt. Het kan elk enkel teken zijn of leeg zijn en is standaard:
(een dubbele punt).
MSysIMEXColumns
structuur
De tabel beschrijft de afzonderlijke kolommen in het tekstbestand en eventuele attributen. Dit komt ruwweg overeen met het derde deel van de schema.ini
. Er zijn echter extra opties zoals indexering die niet bestaat in schema.ini
.
Attributes
:Onbekend. In mijn tests kreeg ik nooit iets anders dan0
. Als je weet waar het voor is en hoe het kan worden gebruikt, laat dan gerust een reactie achter.DataType
:het gegevenstype van de kolom. Het nummer moet overeenkomen met de DAO.DataTypeEnum.FieldName
:de naam van de kolom. Houd er rekening mee dat toegang standaard is ingesteld opFieldN
waarN
is een positief geheel getal.IndexType
:Mogelijk0
om geen indices aan te geven,1
om een reguliere index of2
aan te geven om een unieke index aan te geven.SkipColumns
:Een Booleaanse waarde geeft aan of de kolom moet worden overgeslagen. Als het wordt overgeslagen, is het niet beschikbaar voor opvragen of lezen.SpecID
:Komt overeen met deMSysIMEXSpecs.SpecID
auto nummer. Let op:er zijn geen beperkingen voor externe sleutels tussen de twee tabellen. Als u records heeft verwijderd, kunnen er verweesde records zijn uit deMSysIMEXSpecs
tafel.Start
:Een geheel getal dat aangeeft wanneer de kolom in het tekstbestand begint. Het is belangrijk voor een bestand met een vaste breedte. Voor bestanden met scheidingstekens gebruikt Access nog steeds de kolompositie van de eerste rij waar het veld wordt gevonden om het begin te bepalen. Bovendien zal Access de kolom gebruiken om de ordinale volgorde van de kolommen te impliceren.Width
:Nog een geheel getal om de grootte van de kolom te bepalen. Op een bestand met vaste breedte is dit ook significant. Houd er rekening mee dat Microsoft Access die informatie gebruikt voor gegevenstypen met variabele lengte, zoals tekst of binair, om de kolom dienovereenkomstig te vergroten, zelfs in een bestand met scheidingstekens.
Verbindingsreeks met specificaties:DSN
parameter
In het vorige artikel zag je dat er geen wijziging was in de verbindingsreeks om een schema.ini-bestand te gebruiken. We hebben impliciet verwezen naar de schema.ini
gewoon door ervoor te zorgen dat het in dezelfde map staat als het tekstbestand dat we koppelen of openen. Om de opgeslagen specificaties uit het systeem te gebruiken, moeten we echter de informatie in de verbinding aanleveren. We doen dit door de DSN
. in te vullen parameter. De waarde moet verwijzen naar de naam van de opgeslagen specificatie, zoals vastgelegd in de MSysIMEXSpecs.SpecName
kolom.
Hier is een voorbeeld:
Set db = DBEngine.OpenDatabase(vbNullString, False, False, "Text;DSN=Products Link Specification;IMEX=1;DATABASE=C:\Links")
Toegang vereist dat zowel de DSN-parameter als de IMEX-parameters worden opgegeven in de verbindingsreeks. Als u probeert de IMEX
. weg te laten parameter, krijgt u een foutmelding dat Access de specificatie niet kan vinden, ook al bestaat de specificatie in de MSysIMEXSpecs
tafel. Hieruit volgt ook dat de tabel een record moet bevatten met SpecName
met dezelfde waarde die is opgegeven in de DSN
parameter.
Zoals opgemerkt in het eerdere artikel, worden de afzonderlijke tekstbestanden behandeld als een "tabel" in de "database" van de map. Dus hoewel de verbindingsreeks niet naar een specifiek tekstbestand verwijst, gebruikt de verbindingsreeks de gespecificeerde specificaties voor alle tekstbestanden die via de verbinding worden geopend.
Hoewel het mogelijk is om andere parameters te gebruiken, zoals besproken in hetzelfde artikel, moet u zich ervan bewust zijn dat bij conflicten de opgeslagen specificatie voorrang heeft op de verbindingsreeks. Om die reden is het het beste om een minimale set parameters te gebruiken die nodig is om met succes verbinding te maken met een tekstbestand en de opgeslagen specificaties het werk te laten doen om te beschrijven hoe het tekstbestand moet worden gelezen.
Conclusie
Je hebt een alternatieve manier geleerd om de structuur van het tekstbestand te beschrijven zonder een extern bestand te gebruiken. We hebben gekeken hoe Access twee systeemtabellen gebruikt om de specificaties op te slaan. Ten slotte hebt u ook geleerd hoe u de opgeslagen specificaties specificeert met behulp van de DSN
parameter. Op dit punt hebben we alles besproken wat we moeten weten over het koppelen of openen van tekstbestanden in Access. In het volgende artikel zullen we de informatie die we in de rest van de serie hebben geleerd, bij elkaar voegen. We zullen ook kijken naar het gebruik van de verbindingsreeksen in Access-query's voor een aanpak zonder code.