Primeiro declaramos uma variável *conn, do tipo PGconn com o valor inicial NULL, em seguida, chamamos a função PQconnectdb passando como parâmetros o host, que será o localhost e o banco será o TESTE, que criamos acima.
A função PQconnectdb irá retornar NULL somente se houver falha na alocação de memória para o objeto de conexão. Mesmo que o retorno seja não-NULL, precisamos verificar se a conexão foi bem sucedida. Podemos fazer isso com a função PQstatus, que tem o protótipo:
ConnStatusType PQstatus(PGconn *conn);
Esta função recebe como parâmetro um objeto PGconn e retorna um tipo enumerado, que pode ter dois valores: CONNECTION_OK ou CONNECTION_BAD (os significados são bem óbvios).
Continuando o nosso exemplo, após chamar a função PQconnectdb, verificamos se a conexão foi bem sucedida:
if(PQstatus(conn) == CONNECTION_OK)
{
printf("Conexão com efetuada com sucesso.");
}
else
{
printf("Falha na conexão.");
PQfinish(conn);
return -1;
}
Não há muito o que se comentar sobre o código acima. Chamamos a função PQstatus passando como parâmetro o nosso objeto de conexão (conn) e verificamos o retorno. Se CONNECTION_OK, a conexão com o banco foi efetuada com sucesso, do contrário, mostramos a mensagem que nossa conexão falhou, e chamamos a função PQfinish que tem o seguinte protótipo:
void PQfinish(PGconn *conn);
Esta função encerra a conexão com o banco de dados e também libera a memória usada pelo objeto de conexão, e deve ser chamada mesmo que a conexão não tenha ocorrido com sucesso. Vale dizer que uma vez chamada esta função, não se deve tentar usar o objeto conn novamente.
Além de saber que a nossa conexão falhou, podemos querer saber qual foi a mensagem de erro retornada pelo PostgreSQL, podemos fazer isso com a função PQerrorMessage, que tem o seguinte protótipo:
char *PQerrorMessage(PGconn *conn);
Esta função retorna um ponteiro char, e recebe como parâmetro um objeto de conexão.
Vamos agora ver a listagem do código:
#include <libpq-fe.h>
/*Objeto de conexão*/
PGconn *conn = NULL;
int main()
{
/*realiza a conexão*/
conn = PQconnectdb("host=localhost dbname=TESTE");
if(PQstatus(conn) == CONNECTION_OK)
{
printf("Conexão com efetuada com sucesso.
");
}
else
{
printf("Falha na conexão.
Erro: %s", PQerrorMessage(conn));
PQfinish(conn);
return -1;
}
/*Verifica se a conexão está aberta e a encerra*/
if(conn != NULL)
PQfinish(conn);
}
Pronto, agora, se a conexão falhar, podemos ter uma descrição melhor.
[1] Comentário enviado por cbov em 08/12/2005 - 04:16h
muito bom artigo.
eu imaginava ser mais complicado, pelo fato do unico banco que acessei usando C foi o oracle, qual tinha que dar algumas voltas ate gerar o binario
[6] Comentário enviado por rjesus em 13/03/2007 - 11:19h
Olá, sou novo no linux, utilizoo o SUSE versão 10.1, tentei executar o exemplo que foi passado acima e obtive o seguinte resultado :
suse:/usr/include/pgsql # gcc $(pkg-config --libs --cflags gtk+-2.0) -g teste1.c
/tmp/ccc0dzwL.o: In function `main':
/usr/include/pgsql/teste1.c:13: undefined reference to `PQconnectdb'
/usr/include/pgsql/teste1.c:15: undefined reference to `PQstatus'
/usr/include/pgsql/teste1.c:28: undefined reference to `PQexec'
/usr/include/pgsql/teste1.c:21: undefined reference to `PQerrorMessage'
/usr/include/pgsql/teste1.c:22: undefined reference to `PQfinish'
/usr/include/pgsql/teste1.c:36: undefined reference to `PQresultStatus'
/usr/include/pgsql/teste1.c:42: undefined reference to `PQresultErrorMessage'
/usr/include/pgsql/teste1.c:45: undefined reference to `PQcmdTuples'
/usr/include/pgsql/teste1.c:53: undefined reference to `PQclear'
/usr/include/pgsql/teste1.c:59: undefined reference to `PQfinish'
collect2: ld returned 1 exit status
Alguêm poderia me ajudar ???
Obigado!
[7] Comentário enviado por seferzohar em 06/11/2007 - 16:13h
rjesus
Vc esta compilando o exemplo com as flags erradas para o linker (ld)
pkg-config --libs --cflags gtk+-2.0 gera as flags necessarias para compilacao de programas gráficos utilizando a biblioteca gtk, desnecessária neste exemplo. Para compilar-lo vc precisa que o linker ligue o seu programa a biblioteca libpq, que implementa as funcoes acima.
O seu teste provavelmente irá compilar com o seguinte comando:
[9] Comentário enviado por netmorais em 30/06/2008 - 16:04h
Poleto
Voce sabe se existe a biblioteca estática libpq para windows (libpq.a ...).
Instalei o Postgres 8.3 num xp e na pasta .../lib só encontro .dll.
Grato
Sergio.
netmorais@bol.com.br
[10] Comentário enviado por poleto em 30/06/2008 - 18:13h
netmorais,
Nunca tentei utilizar a libpq a partir do windows.
Mas, acredito que não seja muito diferente, só que, ao invés de usar uma biblioteca com extensão .so, você vai usar uma dll. Se o nome não for o mesmo (libpq.dll, tente pq.dll). De resto, use o procedimento normal do desenvolvimento sobre windows para carregar a dll.