Strings de conexão ad-hoc e consultas heterogêneas para MS Access
As consultas heterogêneas são a razão pela qual as cadeias de conexão, especialmente as cadeias de conexão ad-hoc, são importantes. Nos artigos anteriores da série, você viu como personalizar os parâmetros de conexão para conectar-se ao Excel e a arquivos de texto. No caso dos arquivos de texto, você também pode descrever o esquema da estrutura do arquivo de texto usando
schema.ini
ou especificações salvas. No primeiro artigo, você também aprendeu a diferença entre vincular e abrir uma fonte de dados. Consultas heterogêneas em vez de código VBA
Você viu nos artigos anteriores um código de exemplo de como abrir essa fonte de dados usando o
OpenDatabase
do DAO método. Set db = DBEngine.OpenDatabase(vbNullString, False, False, "Excel 12.0 Xml;HDR=YES;IMEX=2;ACCDB=YES;DATABASE=C:\Links\Products.xlsx")
Isso pode deixar você com a impressão de que a única maneira de abrir uma fonte de dados é via código. Mas não precisa ser assim! Na verdade, você pode abrir uma fonte de dados arbitrária usando apenas a consulta do Access. Aqui está um exemplo de sintaxe que você pode executar em uma consulta do Access:
SELECT * FROM [Excel 12.0 Xml;HDR=YES;IMEX=2;ACCDB=YES;DATABASE=C:\Links\Products.xlsx].[Sheet1$];
De um modo geral, a string de conexão que você coloca no
OpenDatabase
O 4º parâmetro é aquele com o qual você prefixaria a “tabela”. Portanto, a sintaxe geral seria:FROM [<complete connection string>].[<name of the table>]
Você pode usar o
OpenDatabase
e iterar sobre TableDefs
para encontrar os nomes válidos da tabela. Você pode usar isso para preencher a segunda parte do nome. Por que abrir em vez de link?
Uma vantagem de abrir em vez de vincular é que você pode alterar a cadeia de conexão em tempo de execução. Você também não precisa lidar com a limpeza necessária, como excluir os objetos vinculados não mais necessários. É puramente transitório, o que seria perfeito para mover dados de uma fonte para outra sem escrever nenhum código VBA.
Aqui está um cenário possível. Suponha que queremos criar arquivos de texto que são uma saída de uma exibição em nosso banco de dados SQL Server. Você viu nos artigos anteriores que poderíamos escrever código VBA para fazer um loop sobre os conjuntos de registros DAO e escrever o conteúdo um por um. No entanto, como alternativa, podemos apenas criar uma consulta do Access com este 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];
Como tanto o destino quanto a origem não são a origem do Access, isso é o que chamamos de “consulta heterogênea”. Observe que, mesmo que o
vwProducts
fosse uma tabela vinculada, ainda seria uma consulta “heterogênea”. Isso porque ainda estamos misturando diferentes fontes de dados em uma única consulta. Mais importante, usando uma consulta heterogênea, evitamos a necessidade de criar objetos temporários em nosso aplicativo Access. A criação de um objeto temporário pode fazer com que o aplicativo do Access fique inchado. Este é o caso mesmo com importação ou vinculação ou uso de conjuntos de registros no VBA. Um arquivo inchado pode, por sua vez, exigir compactação e reparo. No entanto, quando você usa uma consulta heterogênea para transferir dados diretamente de uma fonte de dados para outra, evita todo esse inchaço. Consequentemente, torna-o ideal para cenários em que seu aplicativo Access precisa gerar vários arquivos sem manutenção no próprio aplicativo.
Construindo a string de conexão ad-hoc
Até agora, você pode ver por que é importante entender os parâmetros usados na string de conexão. É especialmente importante controlar o destino (por exemplo, caminho para arquivos de texto ou intervalo para planilha do Excel). Com essas fontes de dados não relacionais, o que constitui um “banco de dados” e “tabelas” em tal fonte de dados pode não ser intuitivo. Você pode usar os 3 últimos artigos como referência para obter ajuda na construção da cadeia de conexão e das informações do esquema para garantir que o layout fique correto. Dito isso, há também um atalho que você pode usar para ajudá-lo a encontrar a string de conexão.
Você pode usar a guia externa e "Importar texto" ou Importar Excel" e escolher a opção de link. Geralmente é a terceira opção no assistente, conforme mostrado.
Depois de passar pelo assistente e salvar a nova tabela vinculada, você pode inspecionar a string de conexão por meio da janela imediata do VBA com este código:
?CurrentDb.TableDefs("<name of linked table>").Connect
Isso pode fornecer dicas sobre como construir a cadeia de conexão e você pode personalizar. Na maioria das vezes, você se verá personalizando o caminho ou o nome da tabela para que geralmente funcione o suficiente como uma técnica durante o desenvolvimento. Você pode então criar uma consulta heterogênea de acordo e excluir a tabela vinculada.
Conclusões
Na série, você aprendeu a diferença entre vincular e abrir. Você então viu como Excel e arquivos de texto podem ser usados como se fossem um
DAO.Database
objetos com “mesas”. Com o segundo artigo, você aprendeu sobre parâmetros de conexão para uma pasta de trabalho do Excel. No 3º artigo, você viu a necessidade de ter informações de esquema para descrever um arquivo de texto. O quarto artigo descreveu como usar schema.ini
. No 5º artigo, você viu como o MSysIMEXSpecs
e MSysIMEXColumns
pode ser usado como uma alternativa ao schema.ini
método. Por fim, juntamos tudo na construção de uma consulta heterogênea como um exemplo de solução low-code. Não precisamos escrever uma grande quantidade de código VBA apenas para enviar dados de uma fonte para outra. Acho que você concordará que é muito mais fácil modificar uma consulta do Access ajustando o caminho ou o nome da tabela do que escrever uma rotina VBA grande e complexa para ler e gravar dados. Mais importante, usando uma consulta heterogênea, fica muito mais fácil lidar com as alterações na estrutura em ambos os lados. Uma nova coluna adicionada? Sem problemas, basta adicionar a nova coluna à consulta e pronto.
No entanto, como você vê, isso requer um bom entendimento da construção da cadeia de conexão. Por essa razão, foi necessário estudar a fundo os meandros da cadeia de conexão, como fizemos do 2º ao 5º artigos. Embora possamos usar o assistente de tabela vinculada para nos dar a dica sobre as strings de conexão. Mas são apenas dicas. Portanto, é bom saber como controlar com precisão a saída. Espero que você concorde que investir algum esforço na compreensão de como as cadeias de conexão funcionam se pagará em trabalho economizado.