Nota
O acesso a esta página requer autorização. Podes tentar iniciar sessão ou mudar de diretório.
O acesso a esta página requer autorização. Podes tentar mudar de diretório.
A questão, então, é: como é que o ODBC padroniza o acesso à base de dados? Existem dois requisitos arquitetónicos:
As aplicações devem ser capazes de aceder a múltiplos SGBD usando o mesmo código-fonte sem a necessidade de recompilar ou religar.
As aplicações devem ser capazes de aceder a múltiplos SGBD simultaneamente.
E há mais uma questão, devido à realidade do mercado:
- Que funcionalidades do SGBD deve expor o ODBC? Apenas funcionalidades comuns a todos os SGBD ou qualquer funcionalidade disponível em qualquer SGBD?
O ODBC resolve estes problemas da seguinte forma:
O ODBC é uma interface ao nível da chamada. Para resolver o problema de como as aplicações acedem a múltiplos SGBD usando o mesmo código-fonte, o ODBC define uma CLI padrão. Este contém todas as funções das especificações CLI do Open Group e ISO/IEC e fornece funções adicionais comumente exigidas pelas aplicações.
É necessária uma biblioteca ou driver diferente para cada SGBD que suporte ODBC. O driver implementa as funções na API ODBC. Para usar um driver diferente, a aplicação não necessita ser recompilada ou religada. Em vez disso, a aplicação simplesmente carrega o novo driver e chama as funções nele. Para aceder a múltiplos SGBDs em simultâneo, a aplicação carrega múltiplos controladores. A forma como os drivers são suportados depende de cada sistema operativo. Por exemplo, no sistema operativo Microsoft Windows, os drivers são bibliotecas de ligação dinâmica (DLLs).
ODBC define uma gramática SQL padrão. Para além de uma interface padrão ao nível da chamada, o ODBC define uma gramática SQL padrão. Esta gramática baseia-se na especificação Open Group SQL CAE. As diferenças entre as duas gramáticas são menores e devem-se principalmente às diferenças entre a gramática SQL exigida pelo SQL embutido (Open Group) e uma CLI (ODBC). Existem também algumas extensões da gramática para expor características linguísticas geralmente disponíveis que não são cobertas pela gramática do Open Group.
As aplicações podem submeter declarações usando ODBC ou gramática própria do SGBD. Se uma instrução utilizar uma gramática ODBC diferente da gramática específica do SGBD, o driver realiza a conversão antes de enviar para a origem de dados. No entanto, tais conversões são raras porque a maioria dos SGBD já utiliza gramática SQL padrão.
O ODBC fornece um Gestor de Drivers para gerir o acesso simultâneo a múltiplos SGBD. Embora o uso de drivers resolva o problema de aceder a múltiplos SGBD simultaneamente, o código para tal pode ser complexo. Aplicações concebidas para funcionar com todos os drivers não podem ser ligadas estaticamente a nenhum driver. Em vez disso, devem carregar os drivers em tempo de execução e usar uma tabela de ponteiros de função para chamar as funções neles. A situação torna-se mais complexa se a aplicação usar múltiplos drivers em simultâneo.
Em vez de forçar cada aplicação a fazer isto, o ODBC fornece um Gestor de Drivers. O Gestor de Drivers implementa todas as funções ODBC, principalmente como chamadas diretas para funções ODBC nos drivers, e é estaticamente ligado à aplicação ou carregado por ela em tempo de execução. Assim, a aplicação chama as funções ODBC pelo nome no Gestor de Drivers, em vez de pelo ponteiro em cada driver.
Quando uma aplicação precisa de um determinado driver, primeiro solicita um handle de ligação para identificar o driver e depois pede ao Driver Manager que o carregue. O Gestor de Drivers carrega o driver e armazena o endereço de cada função no driver. Para chamar uma função ODBC no driver, a aplicação chama essa função no Driver Manager e passa o identificador de ligação para o driver. O Gestor de Drivers chama então a função usando o endereço que ela armazenou anteriormente.
O ODBC expõe um número significativo de funcionalidades do SGBD, mas não exige que os drivers suportem todas. Se o ODBC expusesse apenas funcionalidades comuns a todos os SGBD, seria de pouca utilidade; afinal, a razão pela qual existem tantos SGBDs diferentes hoje em dia é que têm funcionalidades distintas. Se o ODBC expusesse todas as funcionalidades disponíveis em qualquer SGBD, seria impossível para os drivers implementarem.
Em vez disso, o ODBC expõe um número significativo de funcionalidades – mais do que as suportadas pela maioria dos SGBD – mas exige que os drivers implementem apenas um subconjunto dessas funcionalidades. Os drivers implementam as funcionalidades restantes apenas se forem suportadas pelo SGBD subjacente ou se optarem por as emular. Assim, podem ser escritas aplicações para explorar as funcionalidades de um único SGBD expostas pelo driver desse SGBD, para usar apenas as funcionalidades usadas por todos os SGBD, ou para verificar o suporte de uma determinada funcionalidade e reagir em conformidade.
Para que uma aplicação possa determinar que funcionalidades um driver e um SGBD suportam, o ODBC fornece duas funções (SQLGetInfo e SQLGetFunctions) que retornam informações gerais sobre as capacidades do driver e do SGBD, bem como uma lista de funções suportadas pelo driver. O ODBC também define níveis de conformidade com a API e a gramática SQL, que especificam amplas gamas de funcionalidades suportadas pelo driver. Para mais informações, consulte Níveis de Conformidade.
É importante lembrar que o ODBC define uma interface comum para todas as funcionalidades que expõe. Dessa forma, as aplicações contêm código específico de funcionalidades, não código específico de SGBD, e podem usar quaisquer drivers que disponibilizem essas funcionalidades. Uma vantagem disto é que as aplicações não precisam de ser atualizadas quando as funcionalidades suportadas por um SGBD são melhoradas; em vez disso, quando um driver atualizado é instalado, a aplicação utiliza automaticamente as funcionalidades porque o seu código é específico de uma funcionalidade, não do driver ou do SGBD.