Stringhe di connessione ad hoc e query eterogenee per MS Access
Le query eterogenee sono il motivo per cui le stringhe di connessione, in particolare le stringhe di connessione ad hoc, sono importanti. Nei precedenti articoli della serie hai visto come personalizzare i parametri di connessione per la connessione a Excel e file di testo. Nel caso dei file di testo, puoi anche descrivere lo schema della struttura del file di testo utilizzando schema.ini
o specifiche salvate. Nel primo articolo hai anche appreso la differenza tra il collegamento e l'apertura di un'origine dati.
Query eterogenee anziché codice VBA
Negli articoli precedenti hai visto un codice di esempio per l'apertura di tale origine dati utilizzando OpenDatabase
di DAO metodo.
Set db = DBEngine.OpenDatabase(vbNullString, False, False, "Excel 12.0 Xml;HDR=YES;IMEX=2;ACCDB=YES;DATABASE=C:\Links\Products.xlsx")
Questo potrebbe darti l'impressione che l'unico modo per aprire un'origine dati sia tramite codice. Ma non deve essere così! Puoi effettivamente aprire un'origine dati arbitraria utilizzando solo la query di Access. Ecco una sintassi di esempio che puoi eseguire in una query di Access:
SELECT * FROM [Excel 12.0 Xml;HDR=YES;IMEX=2;ACCDB=YES;DATABASE=C:\Links\Products.xlsx].[Sheet1$];
In generale, la stringa di connessione che hai inserito in OpenDatabase
Il 4° parametro è quello con cui avresti preceduto la "tabella". Pertanto la sintassi generale sarebbe:
FROM [<complete connection string>].[<name of the table>]
Puoi usare OpenDatabase
metodo e scorrere su TableDefs
per trovare i nomi validi della tabella. Puoi quindi usarlo per compilare la seconda parte del nome.
Perché aprire invece di collegare?
Un vantaggio dell'apertura rispetto al collegamento è che è possibile modificare la stringa di connessione in fase di esecuzione. Inoltre, non devi occuparti della pulizia richiesta come l'eliminazione degli oggetti collegati non più necessari. È puramente transitorio, il che sarebbe perfetto per spostare i dati da una fonte a un'altra senza scrivere alcun codice VBA.
Ecco un possibile scenario. Supponiamo di voler creare file di testo che siano un output da una vista sul nostro database di SQL Server. Hai visto da articoli precedenti che potremmo scrivere codice VBA per scorrere i recordset DAO e scrivere il contenuto uno per uno. Tuttavia, in alternativa, possiamo semplicemente creare una query di Access con questo SQL:
INSERT INTO [Text;DATABASE=C:\Links\].[products.csv;] (Products, Count) SELECT Products, Count FROM [ODBC;DRIVER=ODBC Driver 17 for SQL Server;SERVER=myServer;DATABASE=myDatabase;].[vwProducts];
Poiché sia la destinazione che l'origine non sono l'origine di Access, questo è ciò che chiamiamo "interrogazione eterogenea". Nota che anche se il vwProducts
fosse una tabella collegata, sarebbe comunque una query "eterogenea". Questo perché stiamo ancora mescolando diverse origini dati in un'unica query.
Ancora più importante, utilizzando una query eterogenea, evitiamo la necessità di creare oggetti temporanei all'interno della nostra applicazione Access. La creazione di un oggetto temporaneo può causare il rigonfiamento dell'applicazione Access. Questo è il caso anche con l'importazione o il collegamento o l'utilizzo di recordset in VBA. Un file gonfio potrebbe a sua volta richiedere la compattazione e la riparazione. Tuttavia, quando si utilizza una query eterogenea per trasferire direttamente i dati da un'origine dati a un'altra, si evita tutto quel rigonfiamento. Di conseguenza, lo rende ideale per gli scenari in cui l'applicazione Access deve generare diversi file senza manutenzione sull'applicazione stessa.
Costruzione della stringa di connessione ad hoc
A questo punto, puoi capire perché è importante comprendere i parametri utilizzati nella stringa di connessione. È particolarmente importante controllare la destinazione (ad es. il percorso per i file di testo o l'intervallo per il foglio Excel). Con tali origini dati non relazionali, ciò che costituisce un "database" e una "tabella" in tale origine dati potrebbe non essere intuitivo. È possibile utilizzare gli ultimi 3 articoli come riferimento per la creazione della stringa di connessione e le informazioni sullo schema per garantire che il layout sia corretto. Detto questo, c'è anche una scorciatoia che puoi usare per aiutarti a trovare la stringa di connessione.
Puoi utilizzare la scheda esterna e "Importa testo" o Importa Excel" e scegliere l'opzione di collegamento. Di solito è la terza opzione della procedura guidata come mostrato.
Dopo aver eseguito la procedura guidata e aver salvato la nuova tabella collegata, puoi quindi controllare la stringa di connessione tramite la finestra immediata di VBA con questo codice:
?CurrentDb.TableDefs("<name of linked table>").Connect
Questo può fornire suggerimenti su come costruire la stringa di connessione e puoi quindi personalizzarla. La maggior parte delle volte ti ritroverai a personalizzare il percorso o il nome della tabella, quindi di solito funziona abbastanza come tecnica durante il tuo sviluppo. È quindi possibile creare una query eterogenea di conseguenza ed eliminare la tabella collegata.
Conclusioni
Nella serie, hai imparato la differenza tra il collegamento e l'apertura. Hai quindi visto come utilizzare Excel e file di testo come se fossero un DAO.Database
oggetti con “tavoli”. Con il 2° articolo, hai appreso i parametri di connessione per una cartella di lavoro di Excel. Nel 3° articolo, hai visto la necessità di avere informazioni sullo schema per descrivere un file di testo. Il 4° articolo descriveva come usare schema.ini
. Nel quinto articolo, hai visto come MSysIMEXSpecs
e MSysIMEXColumns
può essere utilizzato come alternativa a schema.ini
metodo.
Infine, abbiamo messo tutto insieme nella costruzione di una query eterogenea come esempio di una soluzione low-code. Non è necessario scrivere una grande quantità di codice VBA solo per inviare i dati da una fonte a un'altra. Penso che sarai d'accordo sul fatto che è molto più facile modificare una query di Access regolando il percorso o il nome della tabella piuttosto che scrivere routine VBA grandi e complesse per leggere e scrivere dati. Ancora più importante, utilizzando una query eterogenea, diventa molto più semplice gestire le modifiche nella struttura su entrambi i lati. Aggiunta una nuova colonna? Nessun problema, aggiungi la nuova colonna alla query e il gioco è fatto.
Tuttavia, come vedi, ciò richiede una buona comprensione della costruzione della stringa di connessione. Per questo motivo, è stato necessario studiare a fondo le complessità della stringa di connessione come abbiamo fatto dal 2° al 5° articolo. Anche se possiamo usare la procedura guidata della tabella collegata per darci il suggerimento sulle stringhe di connessione. Ma sono solo suggerimenti. Pertanto è bene sapere come controllare con precisione l'output. Spero che tu sia d'accordo sul fatto che investire un po' di impegno nella comprensione del funzionamento delle stringhe di connessione si ripagherà da solo in manodopera risparmiata.