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 | - |
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:
- 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’;
- 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