18 de junho de 2010

Registrando automaticamente uma fonte de dados para acesso ODBC

Muitas aplicações que trabalham com banco de dados ainda fazem o acesso através de uma fonte de dados ODBC. Isso normalmente exige que se faça uma configuração através das Ferramentas Administrativas do Painel de Controle do Windows em cada estação que fará uso da aplicação em questão.

A ABC71 usa o ADO com OleDB na maioria de suas aplicações para acessar banco de dados. Os poucos módulos que necessitam ter uma configuração ODBC externa são os relacionados à Qualidade (Metrologia e Inspeção da Qualidade), que já estão sendo revistos e também deverão adotar o ADO em breve.

Enquanto isso não acontece, incluimos no projeto desses módulos código para criar automaticamente as configurações, de modo que o usuário não precisa se preocupar com essa criação. Basicamente, configurar uma fonte de dados ODBC é criar algumas entradas no registry do Windows - a localização das chaves variará, dependendo se você quer disponibilizar a fonte só para o usuário atual do Windows ou para todos. Qualquer que seja o caso, a hierarquia de chaves é \\SOFTWARE\\ODBC\\ODBC.INI. Esta chave é onde são armazenados os drivers ODBC instalados no computador. Ai também fica a chave "ODBC Data Sources", que, como diz o nome, é onde o Windows armazena as fontes de dados para conexões ODBC. Veja abaixo um exemplo em C++ Builder para acessar essa chave. Para usar em Delphi, basta adaptar a sintaxe para Pascal.
void TWRegConfig::ConfigODBC (AnsiString ServerName)
{
AnsiString metrologia ("mt305w");
AnsiString sqlServer ("SQL Server");
AnsiString _OdbcIni = "\\SOFTWARE\\ODBC\\ODBC.INI\\";

TRegistry *_Reg = new TRegistry ();
_Reg->RootKey = HKEY_LOCAL_MACHINE;

_Reg->OpenKey (_OdbcIni + "ODBC Data Sources", true);
/* ... */
No código acima, é criada uma instância da classe TRegistry que encapsula o acesso ao registry do Windows. A raiz para o acesso (RootKey) no exemplo é o HKEY_LOCAL_MACHINE, indicando que acessaremos o local de armazenamento das fonte de dados disponíveis para todos os usuários do computador. Use HKEY_CURRENT_USER como RootKey para acessar apenas as fontes do usuário atual do Windows.

O comando OpenKey abre a chave especificada, preparando-a para manutenções (leitura e gravação). O segundo parâmetro da função OpenKey indica se a chave deve ser criada caso ainda não exista. Agora, podemos criar as entradas que configuram a fonte de dados ODBC:
/* ... */
if ( _Reg->KeyExists(_OdbcIni + metrologia) == false)
{
/* cria o nome da fonte de dados, indicando o tipo de banco de dados que será acessado */
_Reg->WriteString (metrologia, sqlServer);

/* efetivamente faz a configuração da fonte de dados */
_Reg->OpenKey (_OdbcIni + metrologia, true);
_Reg->WriteString ("driver", "C:\\WINDOWS\\System32\\SQLSRV32.dll");
_Reg->WriteString ("Description", metrologia);
_Reg->WriteString ("Server", ServerName);
_Reg->WriteString ("LastUser", metrologia);
}
delete _Reg;
Pelo exemplo acima, nota-se que há duas informações distintas a serem gravadas. A primeira é o nome da fonte de dados, isto é, o nome pelo qual referenciaremos a fonte de dados quando formos conectar via ODBC. Veja que é gravado o nome da fonte (Metrologia) e o tipo de banco de dados que desejamos (Sql Server). Os valores válidos para tipo de banco depende do que você tem instalado no computador. Este valor tem que corresponder a uma das entradas existentes na chave ODBCINST.INI.

A segunda informação é uma chave do Registry que deve ser criada como sub-chave do ODBC.INI com o mesmo nome da fonte de dados - no exemplo, este nome é Metrologia. A configuração propriamente dita é feita criando-se entradas dentro dessa nova sub-chave. Algumas informações são comuns a todos os tipos de banco de dados, como é o caso de driver e Description; outras, são específicas de cada tipo de banco. No exemplo aparecem as entradas necessárias para configurar um banco MS SQL Server.

A informação menos óbvia do exemplo é o driver. Essa entrada deve indicar o caminho da biblioteca do próprio fabricante; biblioteca esta que fará, em última análise, todo o acesso ao banco de dados. O valor correto pode ser facilmente encontrado dentro da chave ODBCINST.INI. Como dentro dela há uma chave para cada driver instalado, basta procurar o nome do driver desejado (SQL Server, por exemplo) e copiar o valor da entrada cujo nome é "Driver".

Uma forma de descobrir quais entradas devem ser criadas é criando uma fonte de dados manualmente através do painel de controle do Windows e depois analisar o resultado na hierarquia do ODBC.INI dentro do registry.

Nenhum comentário :

Postar um comentário

OBS: Os comentários enviados a este Blog são submetidos a moderação. Por isso, eles serão publicados somente após aprovação.

Observação: somente um membro deste blog pode postar um comentário.