O PostgreSQL é um sistema de gerenciamento de banco de dados lançado sob a licença BSD e que em breve, com o lançamento da versão 8.0 (que inclui uma versão nativa para Windows, sem necessidade de se utilizar o CygWin, e atualmente encontra-se em fase de testes), deve se tornar uma opção ainda mais atraente em termo de banco de dados livre. O desenvolvedor interessado em acessar um banco PostgreSQL no .NET já deve saber que nem o .NET nem o Delphi vem com algum Data Provider nativo para conexão com o PostgreSQL (exceto por uma versão Trial de um Data Priovider BDP.NET, da CoreLab, que vem em um dos CDs do Delphi). Neste artigo demonstraremos alternativas gratuitas para acesso a um banco de dados Postgres através de uma aplicação ASP.NET no Delphi.

ODBC.NET

O ODBC.NET é um add-on para o framework. NET, que permite acesso a bancos de dados através de seus respectivos drivers ODBC, do mesmo modo que o OLEDB.NET (disponível no namespace system.data.oledb) trabalha com os drivers OLE DB. Para checar se ele está instalado, verifique se o assembly microsoft.data.odbc está listado no GAC - Global Assembly Cache (veja o quadro “o que é o GAC?”).

O que é o GAC?

Um assembly pode ser colocado em dois locais: no mesmo diretório da aplicação que o utiliza (o assembly fica visível apenas para esta aplicação) ou pode ser colocado no GAC - Global Assembly Cache, que é um repositório que torna o assembly disponível para todos os aplicativos do sistema. Para visualizar os assemblies instalados no GAC, abra uma janela do Windows Explorer, digite “%windir%\assembly” sem aspas na barra de endereço e pressione ENTER.

Caso o assembly microsoft.data.odbc não esteja listado, você deverá baixar o arquivo de instalação do ODBC.NET na página de downloads da Microsoft (ver links). Verifique se seu sistema preenche os pré-requisitos para a instalação do add-on (caso não os possua, os dois últimos também estão disponíveis na página de downloads da Microsoft):

  • Windows 98/Me/NT/XP/2000;
  • .NET framework instalado;
  • MDAC (Microsoft Data Access Components) 2.7 ou superior.

Após baixar e instalar o ODBC.NET, precisaremos ter o driver ODBC para conexão com o PostgreSQL instalado. Repare que o ODBC.NET pode ser utilizado para conexão com qualquer banco que possua um driver ODBC, não apenas o PostgreSQL. No nosso caso, utilizaremos o psqlODBC (ver Links). Para verificar se ele já está instalado, vá ao Painel de Controle e Clique em Fontes de Dados ODBC (Windows 98/Me) ou em Ferramentas Administrativas\ Fontes de Dados ODBC (Windows NT/2000/XP), clique na aba Drivers e veja se ele aparece na relação de drivers instalados.

Caso não esteja instalado, baixe o arquivo de instalação na página do psqlODBC (ver Links) e instale-o. Agora podemos nos conectar ao banco. Como exemplo, criaremos uma tabela simples no PostgreSQL, um cadastro básico de contatos com nome, dois telefones e email (ver Tabela 1).

Campo Tipo Tamanho Observações
cod_contato serial - PRIMARY KEY
nome varchar 100 NOT NULL
telefone1 varchar 15 -
telefone2 varchar 15 -
email varchar 50 -

Tabela 1. Campos da tabela contatos

Iremos criar uma aplicação simples, para acessar e alterar os dados da tabela “contatos” (para baixar o código completo, veja na seção links). Inicialmente, inclua o namespace System.Data.Odbc na cláusula Uses da unit. Caso o Delphi não reconheça o namespace system.data.odbc, adicione uma referência ao assembly microsoft.data.odbc ao projeto (veja o quadro “Adicionando uma referência a um assembly”).

Adicionando uma referência a um assembly

Para que seu projeto faça referência a um assembly .NET, abra o Project Manager, clique com o botão direiro em References e clique em “Add Reference...”. Quando aparecer o formulário, você poderá selecioná-lo da lista e clicar em “Add Reference”, caso ele esteja instalado no GAC, ou selecioná-lo manualmente, clicando em “Browse...”.

Para efetuar a conexão com o banco utilizaremos a classe OdbcConnection, que recebe como parâmetro a string de conexão contendo os parâmetros necessários para que possamos nos conectar ao banco. Podemos efetuar a conexão de dois modos:

  1. Informar todos os parâmetros na string de conexão (Tabela 2). Exemplo:
    ‘DRIVER={PostgreSQL};SERVER=10.1.0.20;DATABASE=meubanco;UID=rodrigo;PWD=Pwd97x’;
  2. Criar um datasource ODBC e informar apenas seu nome. Exemplo:
    ‘DSN=dsnMeuBanco’
Parâmetro
DRIVER Nome do Driver para conexão, entre chaves (no nosso caso, {PostgreSQL})
SERVER Nome ou IP do servidor
DATABASE Nome do banco de dados
UID Nome do usuário
PWD Senha do usuário
DNS Nome do Data Source ODBC utilizado para conexão

Tabela 2. Parâmetros da string de conexão do OdbcConnection

A Listagem 1 mostra um exemplo de código que conecta ao banco e retorna todos os registros da tabela em um Datagrid.

Listagem 1. Conectando ao banco e retornando registros.

procedure TWebForm1.Page_Load(sender: System.Object; e: System.EventArgs);
var 
  conn: OdbcConnection;
  adapter: OdbcDataAdapter;
  commBuilder: OdbcCommandBuilder;
  ds: DataSet; // Adicione o namespace System.Data na cláusula uses
begin
   // Cria e abre a conexão.
  conn := OdbcConnection.Create('DRIVER={PostgreSQL};SERVER=servidor;' +
                                'DATABASE=banco;UID=rpc;PWD=PwDPd8');
  conn.Open;
  // Cria o Data Adapter.
  adapter := OdbcDataAdapter.Create('SELECT * FROM contatos', conn);
  // A linha abaixo cria SQLs de alteração e inclusão para o Data Adapter,
  // desde que ele só retorne dados de uma tabela.
  commBuilder := OdbcCommandBuilder.Create(adapter);
  // Cria e preenche o DataSet
  ds := DataSet.Create;
  adapter.Fill(ds, 'contatos');
  // Vincula o DataSet ao DataGrid
  DataGrid1.DataSource := ds;
  DataGrid1.DataBind;
  // Informa o total de registros
  lblTotal.Text := 'Total de contatos: ' + ds.Tables['contatos'].Rows.Count.ToString;
end;
npgsql - .Net Data Provider for PostgreSQL

Outra alternativa que pode ser levada em consideração é o uso do npgsql, um .NET Data Provider implementado em C# e lançado sob a licença LGPL, e que na época da produção deste artigo encontrava-se na versão 0.7beta3, que é a versão que iremos utilizar. Como ele ainda encontra-se em desenvolvimento, consulte o site do projeto (ver links) e avalie se as features já suportadas são suficientes, e se algum bug pode comprometer seu sistema. Para utilizá-lo, verifique no GAC se os assemblies Mono.Security.Protocol.Tls e Npgsql estão instalados (veja quadro “O que é o GAC?”), caso não estejam baixe o arquivo com os arquivos e manuais na página do npgsql. Descompacte o arquivo e procure pela pasta npgsql\bin\ms, dentro dela estão os assemblies que deverão ser instalados. Abra uma janela de terminal (vá em Iniciar\Executar e digite cmd), vá para a pasta onde estão os assemblies e execute a linha abaixo para registrar o npgsql.dll:

"c:\Arquivos de programas\Microsoft.NET\SDK\v1.1\Bin\gacutil.exe" –i Npgsql.dll

Repita a operação para o arquivo Mono.Security.Protocol.Tls.

Verifique se os assemblies estão agora listados corretamente no GAC. Para utilizarmos o npgsql, adicionamos o namespace npgsql à cláusula uses da unit. Caso o namespace não seja reconhecido, adicione a referência ao assembly npgsql (veja box Adicionando uma referência a um assembly). Os nomes das classes utilizadas pelo npgsql são bastante semelhantes aos das classes utilizadas pelos demais ADO.NET Data Providers, como por exemplo a classe OdbcCommandBuilder do ODBC.NET e a classe npgsqlCommandBuilder para o npgsql, o que facilita bastante a sua utilização. A Listagem 2 mostra uma rotina de exemplo, que insere um novo registro na tabela contatos.

Listagem 2. Procedure para inserir novo contato.

procedure TWebForm1.InserirContato(Nome, Telefone1, Telefone2,
  Email: String);
var 
  Conn: NpgsqlConnection;
  Comm: NpgsqlCommand;
  SQL: string;
begin
  // Cria e abre a conexão
  Conn := pgsqlConnection.Create('SERVER=servidor;DATABASE=banco;UID=rpc;PWD=PwdXc9');  
  Conn.Open;
  // SQL de inserção
  SQL := 'INSERT INTO contatos (nome, telefone1, telefone2, email) ' +
       'VALUES (''' + Nome + ''',''' + Telefone1 + ''','''  + Telefone2 + ''','''  + EMail + ''')'
  // Cria o command e o executa
  Comm := NpgsqlCommand.Create(SQL, Conn);
  Comm.ExecuteNonQuery;
  // Fecha a conexão
  Conn.Close;
end;

A Tabela 3 contém uma relação dos principais parâmetros que podem ser passados pela string de conexão do npgsqlConnection.

Parâmetro
SERVER Nome ou IP do servidor
DATABASE Nome do banco de dados
USER ID, USER, UID Nome do usuário
PASSWORD, PWD Senha do usuário
PORT Porta TCP utilizada pelo servidor. O default é a 5432
TIMEOUT Tempo que se deve aguardar conexão (em segundos)

Tabela 3. Parâmetros da string de conexão do npgsqlConnection

Conclusões

Dependendo das necessidades do sistema sendo desenvolvido, ele pode ser perfeitamente atendido por um Provider como o npgsql (que, lembrando, ainda encontra-se em desenvolvimento) ou pode necessitar de um Provider pago, como o da CoreLab. O desenvolvedor possui diversas alternativas para o acesso ao PostgreSQL no Delphi, tanto gratuitas quanto pagas. Cabe a ele avaliar os prós e contras de cada uma delas, e verificar se elas atendem os requisitos desejados, como velocidade, disponibilidade, segurança, etc, que variam bastante de projeto para projeto.

Links

www.microsoft.com/downloads
Página de downloads da Microsoft

http://www.postgresql.org
Página do PostgreSQL

http://www.postgresql.org.br
Página do PostgreSQL (em portugês)

gborg.postgresql.org/project/psqlodbc/projdisplay.php
Página do psqlODBC

gborg.postgresql.org/project/npgsql/projdisplay.php
Página do npgsql - .NET Data Provider for PostgreSQL

http://crlab.com/bdp/
Relação dos Borland Data Providers disponibilizados pela CoreLab