Access
 sql >> Base de Dados >  >> RDS >> Access

Como o Access se comunica com fontes de dados ODBC? Parte 1


Esta é uma série de seis partes de artigos sobre rastreamento ODBC para ajudar os desenvolvedores do Access a solucionar problemas e trabalhar com o Access ao desenvolver um aplicativo que usa fontes de dados ODBC, geralmente, mas não exclusivamente, SQL Server. A série tem como objetivo demonstrar como usar o rastreamento ODBC para monitorar instruções SQL ODBC que o Access emite em segundo plano ao trabalhar com objetos como consultas, formulários ou relatórios ou mesmo durante a execução de código VBA em objetos DAO. A série também mostrará como o Access formula as instruções SQL ODBC. Por fim, a série abordará como interpretar o rastreamento e identificar possíveis problemas. Os artigos serão impressos diariamente até a conclusão da série.

ATUALIZAÇÃO: Adicionada uma chave de registro para instalação C2R de 32 bits no Windows de 64 bits. Obrigado, Jack MacDonald!

Quantas vezes você já ouviu “não sei por que, mas balançar a maçaneta simplesmente funciona”? Sempre que recebo esse tipo de resposta, isso me irrita porque é muito insatisfatório. Eu ficaria muito preocupado se meu encanador me dissesse que não sabia que um p-trap é para e continuasse se referindo a ele como “aquela coisa curvilínea debaixo da pia”. Da mesma forma, meus clientes devem ficar muito preocupados se eu disser “Não sei por que essa consulta foi lenta, então tentei algumas coisas aleatórias e, ei, encontrei um truque que funciona. Eu não sei por que, no entanto.” É possivelmente uma das maiores ruínas do desenvolvimento de software – estamos trabalhando com um sistema complexo que equivale a alternar entre 0 e 1 muito rapidamente em uma determinada sequência e espera-se que saibamos por que não fez dessa maneira e não dessa maneira.

Acredito que vale a pena o tempo e o investimento para o desenvolvedor que trabalha com Access e VBA conhecer realmente o que está fazendo, principalmente com um backend ODBC. Tivemos cenários de migração em que podemos não ter acesso às ferramentas de criação de perfil do lado do servidor por diferentes motivos, mas isso não deve ser motivo para encolher os ombros e apenas apertar botões aleatoriamente até que algo funcione. Mais importante, ter uma sólida compreensão do que está acontecendo nos bastidores ajuda você a se tornar muito melhor em prever quais correções de desempenho você precisa aplicar para um determinado cenário. Sugiro que, mesmo que tudo o que você tenha feito tenha sido ler a série e aprender como o Access funciona com fontes de dados ODBC, você estará muito melhor equipado simplesmente porque sabe o que o Access provavelmente fará.

Para cenários mais complicados, o rastreamento geralmente pode fazer maravilhas ao revelar por que as coisas estão tão lentas. Como você pode rastreá-lo no lado do Access e não no servidor, ele não requer permissões elevadas além de ter acesso à chave do Registro para habilitar o rastreamento ODBC. O bônus adicional é que isso funciona para qualquer fonte de dados ODBC, não apenas SQL Server, portanto, se você tiver um cliente que está usando MySQL ou PostgreSQL sobre o qual você não sabe nada, o rastreamento ODBC ainda o ajudará a identificar possíveis problemas que você pode resolver diretamente no Lado de acesso.

A série focará apenas no contexto do Access e DAO. As coisas podem ser diferentes quando usamos ADO em VBA, mas isso não está no escopo por enquanto, porque sempre que usamos DAO, o Access fará várias coisas para satisfazer nossas solicitações impossíveis. Um bom exemplo é uma consulta do Access que faz referência a uma função VBA. Você não pode executar a função VBA no SQL Server, mas o Access não reclama. Então, o que realmente está acontecendo por trás da cortina? Podemos descobrir o que o Access está fazendo rastreando os comandos ODBC SQL que ele emite para as fontes de dados ODBC.

Muitas das informações apresentadas nesta série de artigos são possíveis com a ajuda do antigo whitepaper da Microsoft sobre Jet &ODBC. Embora eu ache que a informação ainda é muito benéfica, ela também é bastante densa e requer alto nível de proficiência técnica. Espera-se que, ao percorrer a série de rastreamentos, ajude a dar sentido e apresentar as informações de maneira mais acessível.

Por que devemos rastrear ODBC? Como isso vai me ajudar?


Se você já experimentou algum desses sintomas:






Ou quaisquer outros erros ao trabalhar com uma tabela vinculada ODBC, é benéfico entender por que você está recebendo essas mensagens e como corrigi-las. Uma correção comum que vários desenvolvedores do Access aplicam é adicionar Requery ou tentar salvar os registros. Embora isso possa resolver alguns dos problemas, não é inédito ver um formulário de acesso complexo sendo generosamente polvilhado com Requery e várias cadeias de eventos em cascata que o desempenho começa a sofrer. Em vez de espalhá-los como se fossem pó mágico de duende, deveríamos ser mais cirúrgicos em nossas abordagens para corrigir problemas com o aplicativo.

Outra razão convincente é poder analisar por que um determinado formulário A leva 10 segundos para abrir, mas um formulário semelhante B apenas 2 segundos para abrir. Em vez de gastar tempo para embaralhar as coisas para encontrar o que torna o formulário A aberto mais rapidamente, você pode começar traçando e comparando a diferença e depois se concentrar na diferença para ajudá-lo a corrigir os problemas de maneira mais direta.

Mesmo que nem sempre acabemos rastreando toda vez que há problemas de desempenho, ter a familiaridade do que o Access deve fazer é de imenso valor. Portanto, mesmo que tudo o que você tenha feito seja ler a série, espero que você tenha uma melhor apreciação de como trabalhar com o Access e não contra.

Acessar dialetos SQL e ODBC SQL


Antes de entrarmos nos detalhes, precisamos reconhecer que sempre que o Access trabalha com uma fonte de dados ODBC, ele deve primeiro traduzir sua instrução SQL em uma instrução SQL ODBC válida. Isso é diferente do dialeto SQL de destino do back-end (por exemplo, SQL Server, Oracle, MySQL, PostgreSQL). A gramática ODBC SQL é descrita aqui. Você também pode ver uma lista de todas as funções suportadas pela camada ODBC. É importante lembrar que, quando estamos usando ODBC, não estamos traduzindo diretamente do Access SQL para o dialeto SQL nativo da fonte de dados. Em vez disso, estamos traduzindo Access SQL em ODBC SQL, que o driver ODBC para a fonte de dados fornecida traduzirá em seu dialeto nativo. Se você pode imaginar um falante de japonês e um falante de francês que não falam o idioma um do outro, mas ambos falam inglês, é basicamente isso que está acontecendo na camada ODBC. Uma consequência adicional é que só porque o dialeto ODBC suporta o recurso X, não significa que qualquer um dos lados o suporte. Ambos os lados devem suportar esse recurso X para que ele seja portátil na camada ODBC. Felizmente, a maioria dos drivers ODBC são bastante amplos e fazem um bom trabalho ao cobrir a maioria dos recursos. Se você encontrar uma situação em que um recurso deveria funcionar, mas não funciona, pode valer a pena consultar a documentação do driver ODBC para verificar se é compatível.

Ativando o rastreamento ODBC SQL


A primeira coisa a fazer para que possamos espiar por trás das cortinas é habilitar o rastreamento ODBC SQL. Embora possamos usar o SQL Server Profiler, observar como o Access formata o SQL ODBC é muito útil. Ele funcionará com qualquer fonte de dados ODBC e não apenas com o SQL Server. Mais importante, isso nos permite ver como o Access está traduzindo suas consultas para ODBC de uma maneira mais direta do que o SQL Server Profiler ou outras ferramentas de criação de perfil do lado do servidor. Você não precisa de permissões especiais para usar o rastreamento ODBC SQL, enquanto as ferramentas de criação de perfil do lado do servidor podem exigir um alto nível de permissão para uso. A habilitação do rastreamento ODBC SQL é uma configuração de registro para que possamos configurá-la acessando a chave de registro apropriada:

Banco de dados Jet ou versões do Office anteriores a 2007


Para Windows de 32 bits:
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Jet\4.0\Engines\ODBC

Para o mecanismo Jet de 32 bits ou Office anterior a 2007 no Windows de 64 bits:
HKEY_LOCAL_MACHINE\SOFTWARE\WOW6432Node\Microsoft\Jet\4.0\Engines\ODBC

Observação:não há versão de 64 bits do mecanismo Jet obsoleto.

Office 2007 a 2016 (instalações MSI)


Para Office de 32 bits no Windows de 32 bits ou Office de 64 bits no Windows de 64 bits:
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Office\X.Y\Access Connectivity Engine\Engines\ODBC

Para o Office de 32 bits no Windows de 64 bits:
HKEY_LOCAL_MACHINE\SOFTWARE\WOW6432Node\Microsoft\Office\X.Y\Access Connectivity Engine\Engines\ODBC

(onde X.Y corresponde à versão do Office que você instalou)

Office 2016 ou Office 365 (clique para executar)


Para Office de 32 bits no Windows de 32 bits ou Office de 64 bits no Windows de 64 bits:
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Office\ClickToRun\REGISTRY\MACHINE\Software\Microsoft\Office\16.0\Access Connectivity Engine\Engines\ODBC

Para o Office de 32 bits no Windows de 64 bits:
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Office\ClickToRun\REGISTRY\MACHINE\Software\Wow6432Node\Microsoft\Office\16.0\Access Connectivity Engine\Engines\ODBC

Sob a chave, localize a chave TraceSQLMode e altere o valor de 0 para 1 .

O acesso precisará ser reiniciado se já estiver aberto. Caso contrário, abra-o e execute algumas consultas. Um arquivo chamado sqlout.txt será criado no diretório atual. Isso geralmente está na mesma pasta que o arquivo do Access OU na pasta de documentos. Alternativamente, você pode executar a função VBA CurDir para determinar o diretório atual.

Eu recomendo usar o Notepad++ ou um editor de texto similar que tenha a capacidade de detectar que foi modificado. Em seguida, ele solicitará que você recarregue o arquivo. Isso permite que você visualize novas atualizações à medida que o Access emite novos comandos para o arquivo de texto sem reabrir constantemente. Ao ativar o arquivo de texto, o Notepad++ mostrará uma caixa de diálogo:

Você pode clicar em Yes para ver os comandos ODBC SQL mais recentes emitidos pelo Access. Como o Access pode emitir vários comandos ODBC SQL, o log pode crescer rapidamente. Acho conveniente chegar ao ponto em que quero rastrear algo (por exemplo, prestes a abrir um formulário ou executar uma consulta), então mudo para o sqlout.txt , recarregue-o, selecione tudo, exclua todo o texto e salve o arquivo agora vazio. Dessa forma, posso executar a ação que quero rastrear e ver apenas os comandos ODBC relevantes sem todos os outros ruídos que não têm nada a ver com a ação que está sendo rastreada.

Aqui está um vídeo rápido para demonstrar:

Conclusões


Você aprendeu como ativar o rastreamento ODBC e visualizar a saída gerada pelo Access. Você pode ver que pode coletar saída até mesmo de ações como simplesmente abrir uma tabela ou executar uma consulta. Isso fornece informações sobre que tipo de consultas SQL o Access está realmente enviando para a fonte de dados ODBC.

Como você pode ver, o rastreamento ODBC SQL captura todos os comandos ODBC SQL emitidos pelo Access, mesmo que você não os tenha emitido diretamente. Portanto, você pode usá-lo em qualquer ponto em que estiver enfrentando lentidão para onde não tiver uma boa explicação. Como exemplo, suponha que você tenha um formulário que demora para abrir e não tem certeza de que é o seu código VBA no Open do formulário ou Load eventos ou a fonte de registro que é o problema. Uma estratégia seria configurar o aplicativo Access para que você esteja prestes a abrir esse formulário, limpe o sqlout.txt arquivo de texto e prossiga para abrir o formulário. Você pode então revisar as instruções SQL ODBC rastreadas e determinar se há alguma que possa ser melhorada.

Isso é particularmente valioso quando você está lidando com um formulário ou relatório complexo que também contém subformulários/sub-relatórios ou contém caixas de combinação ou caixas de listagem que emitem suas próprias consultas para satisfazer a propriedade rowsource.

No próximo artigo, analisaremos a saída ao navegar pelos registros.

Precisa de ajuda com o Microsoft Access? Entre em contato com nossa equipe pelo telefone 773-809-5456 ou envie um email para [email protected].