Parametri della stringa di connessione per le specifiche salvate
Access fornisce un secondo metodo per descrivere lo schema dei file di testo utilizzando le tabelle di sistema MSysIMEXSpecs
e MSysIMEXColumns
per salvare le specifiche. Nell'articolo precedente, ho spiegato come schema.ini
può essere utilizzato per descrivere la struttura di un file di testo. Lo schema.ini
implicava un file di testo esterno referenziato implicitamente ma con le tabelle di sistema non abbiamo dipendenze esterne. La struttura è abbastanza diversa anche se ci sono alcune sovrapposizioni.
MSysIMEXSpecs
e MSysIMEXColumns
tabella di sistema
Invece di fare affidamento su uno schema.ini esterno per essere presente nella stessa cartella del file di testo, è possibile fornire le specifiche per un file di testo in qualsiasi percorso facendo riferimento alla specifica salvata all'interno del database di Access. Quando utilizzi la procedura guidata di importazione o esportazione, puoi salvare o caricare le specifiche tramite Advanced
pulsante.
Facendo clic sul pulsante Avanzate verrà quindi visualizzata la finestra di dialogo delle specifiche. Oltre a caricare o salvare le specifiche, puoi anche personalizzare le specifiche utilizzando la finestra di dialogo mostrata.
Ogni volta che una specifica viene salvata, viene scritta in entrambi i MSysIMEXSpecs
e MSysIMEXColumns
tabelle di sistema. Le tabelle non esistono in un nuovo file di Access e verranno create solo la prima volta. Inoltre, puoi modificare o addirittura eliminare i dati da quelle tabelle. Anche così, sono ancora tabelle di sistema, quindi sono nascoste per impostazione predefinita. Se vuoi vederli nel pannello di navigazione, dovrai andare su Opzioni di navigazione e abilitare la visibilità sia per gli oggetti nascosti che per quelli di sistema.
Se confronti le opzioni disponibili nella finestra di dialogo con le opzioni che hai in schema.ini
, puoi vedere alcune differenze notevoli. Ad esempio, schema.ini
consente più scelte per quanto riguarda la formattazione delle date o degli importi in valuta. Con le specifiche salvate, possiamo controllare la formattazione della data solo da un elenco preimpostato di possibili formati. Non ci sono opzioni dirette per gli importi in valuta perché utilizziamo il tipo di dati per indicare che una colonna deve essere importata come valuta indipendentemente dalla formattazione. Pertanto, le opzioni delle tabelle di sistema sono semplici rispetto a schema.ini. Esamineremo la struttura delle tabelle in seguito.
MSysIMEXSpecs
struttura
La tabella rappresenta un insieme di specifiche salvate. Per ogni riga, la tabella descrive il formato complessivo del file, simile alla 2a sezione dello schema.ini
. Tuttavia, ci sono diverse opzioni che devono essere considerate.
DateDelim
:identifica il delimitatore per le date. Di solito è/
o-
. Può contenere solo uno o zero caratteri.DateFourDigitYear
:Un campo Sì/No che indica se le date sono formattate con quattro cifre per anni. Se impostato su sì, valori come10/10/20
non sarebbero date valide.DateLeadingZeros
:Un altro campo Sì/No che indica se le date hanno zeri iniziali.DateOrder
:determina la formattazione della data che vogliamo utilizzare. Sono validi i seguenti codici:0
:GAMMA1
:DYM
2
:MDY3
:MIA
4
:YDM5
:YMD
DecimalPoint
:indica il carattere per separare la parte integrale e frazionaria di un numero decimale. Deve essere esattamente un solo carattere.FieldSeparator
:Separa i campi nel file di testo. Per un file CSV, sarebbe,
(una virgola). Inoltre, deve essere esattamente un solo carattere.FileType
:Simile aschema.ini
'sCharacterSet
. Come accennato nell'articolo precedente, puoi individuare tutte le possibili codepage supportate sul tuo computer Windows, cercare nella chiave di registroComputer\HKEY_CLASSES_ROOT\MIME\Database\Codepage\
. Identifica la codifica del file di testo. È possibile utilizzare lo stesso identificatore di codepage. Tuttavia, c'è un problema. IlFileType
è definito come unInteger
. Pertanto, una tabella codici 65000 (ad es. Unicode) verrebbe segnalata come -536. Per convertire qualsiasi identificatore di tabella codici maggiore di 32767, puoi utilizzare la formulaCInt("&H" & Hex(x))
e per invertire l'operazione,CLng("&H" & Hex(x))
. Ad esempio, la conversione della tabella codici 65000 passerebbe perCInt("&H" & Hex(65000))
dare -536. Per invertire,CLng("&H" & Hex(-536))
per ottenere di nuovo 65000.SpecID
:Numero automatico per la tabella. Si noti che questa non è la chiave primaria della tabella. Questa colonna viene utilizzata conMSysIMEXColumns.SpecID
per mettere in relazione i record. Tuttavia, non esiste alcun vincolo di chiave esterna tra le due tabelle, quindi possono verificarsi eliminazioni orfane.SpecName
:La chiave primaria della tabella. Identifica in modo univoco la specifica. Ogni volta che salvi una specifica, il nome che fornisci verrà registrato in questo campo. Quando importi o esporti utilizzando procedure guidate, Access potrebbe creare automaticamente una nuova specifica anche se non hai utilizzatoAdvanced
e salvarlo esplicitamente.SpecType
:Può essere solo1
per indicare file delimitato o2
per indicare un file a larghezza fissa.StartRow
:determina la riga del file di testo da cui avviare la scansione per l'importazione. Può essere qualsiasi numero, quindi è possibile saltare diverse righe all'inizio del file. Può essere utile per file di testo di formato errato con intestazioni non conformi.TextDelim
:un singolo carattere che delimita un valore di testo. Può essere omesso se il testo non è delimitato. Se puoi controllare il formato dei file di testo, di solito è una buona idea avere dei delimitatori di testo. Un file di testo con delimitatori di testo rimarrà ben formato anche se il testo contiene separatori di campo (ad esempio una virgola) all'interno del testo.TimeDelim
:Indica il carattere delimitatore utilizzato per l'ora. Può essere qualsiasi singolo carattere o essere vuoto e il valore predefinito è:
(un carattere due punti).
MSysIMEXColumns
struttura
La tabella descrive le singole colonne nel file di testo e gli eventuali attributi. Ciò corrisponde grosso modo alla terza sezione di schema.ini
. Tuttavia, ci sono opzioni aggiuntive come l'indicizzazione che non esiste in schema.ini
.
Attributes
:Sconosciuto. Nei miei test non ho mai ottenuto che fosse qualcosa di diverso da0
. Se sai a cosa serve e come può essere utilizzato, sentiti libero di lasciare un commento.DataType
:il tipo di dati della colonna. Il numero deve corrispondere a DAO.DataTypeEnum.FieldName
:Il nome della colonna. Nota che l'accesso verrà impostato automaticamente suFieldN
doveN
è un numero intero positivo.IndexType
:Può essere0
per non indicare indici,1
per indicare un indice regolare o2
per indicare un indice univoco.SkipColumns
:un valore booleano indica se la colonna deve essere ignorata. Se saltato, non sarà disponibile per l'interrogazione o la lettura.SpecID
:Corrisponde aMSysIMEXSpecs.SpecID
numero automatico. Si noti che non ci sono vincoli di chiave esterna tra le due tabelle. Se hai eliminato record, potrebbero esserci record orfani daMSysIMEXSpecs
tabella.Start
:Un numero intero che indica quando la colonna inizia nel file di testo. È significativo per un file a larghezza fissa. Per i file delimitati, Access utilizzerà comunque la posizione della colonna della prima riga in cui si trova il campo per determinare l'inizio. Inoltre, Access utilizzerà la colonna per implicare l'ordine ordinale delle colonne.Width
:Un altro numero intero per regolare la dimensione della colonna. Su un file a larghezza fissa, anche questo è significativo. Tieni presente che Microsoft Access utilizzerà tali informazioni per tipi di dati a lunghezza variabile come testo o binario per ridimensionare la colonna di conseguenza anche su un file delimitato.
Stringa di connessione che utilizza le specifiche:DSN
parametro
Nell'articolo precedente, hai visto che non sono state apportate modifiche alla stringa di connessione per utilizzare un file schema.ini. Abbiamo implicitamente fatto riferimento a schema.ini
semplicemente assicurandoci che esista nella stessa cartella in cui è presente il file di testo che stiamo collegando o aprendo. Tuttavia, per utilizzare le specifiche salvate dal sistema è necessario fornire le informazioni nella connessione. Lo facciamo popolando il DSN
parametro. Il valore deve fare riferimento al nome della specifica salvata, come registrato in MSysIMEXSpecs.SpecName
colonna.
Ecco un esempio:
Set db = DBEngine.OpenDatabase(vbNullString, False, False, "Text;DSN=Products Link Specification;IMEX=1;DATABASE=C:\Links")
L'accesso richiederà che sia il parametro DSN che i parametri IMEX siano forniti nella stringa di connessione. Se tenti di omettere IMEX
parametro, verrà visualizzato un errore relativo all'impossibilità di Access di trovare la specifica, anche se la specifica esiste in MSysIMEXSpecs
tavolo. Ne consegue inoltre che la tabella deve contenere un record con SpecName
contenente lo stesso valore fornito nel DSN
parametro.
Come notato nell'articolo precedente, i singoli file di testo vengono trattati come una "tabella" all'interno del "database" della cartella. Pertanto, sebbene la stringa di connessione non punti a un file di testo specifico, la stringa di connessione utilizzerà le specifiche specificate su tutti i file di testo aperti tramite la connessione.
Sebbene sia possibile utilizzare altri parametri come discusso nello stesso articolo, è necessario tenere presente che, in caso di conflitto, la specifica salvata avrà la precedenza sulla stringa di connessione. Per questo motivo, è meglio utilizzare un set minimo di parametri richiesti per connettersi correttamente a un file di testo e lasciare che le specifiche salvate svolgano il compito di descrivere come leggere il file di testo.
Conclusione
Hai imparato un modo alternativo per descrivere la struttura del file di testo senza utilizzare un file esterno. Abbiamo esaminato il modo in cui Access utilizza due tabelle di sistema per memorizzare le specifiche. Infine, hai anche imparato a specificare le specifiche salvate utilizzando il DSN
parametro. A questo punto, abbiamo coperto tutto ciò che dobbiamo sapere sul collegamento o sull'apertura di file di testo in Access. Nel prossimo articolo, metteremo insieme le informazioni apprese nel resto della serie. Esamineremo anche l'utilizzo delle stringhe di connessione nelle query di Access per un approccio senza codice.