PostgreSQL - Embutindo comandos SQL no seu código C
Existe uma alternativa ao uso de bibliotecas para acesso ao PostgreSQL, que é a inclusão de comandos SQL dentro do próprio código em C. Veremos neste artigo como fazer esta integração.
Parte 4: Conectando com o servidor de banco de dados
Para conectar-se com o banco de dados, usamos o seguinte comando:
EXEC SQL CONNECT TO destino [AS nome_da_conexão] [USER nome_do_usuário];
Onde destino pode ser definido da seguinte forma:
E nome_do_usuário pode ser definido como:
Para o nosso artigo, iremos passar os parâmetros através de variáveis, que é o penúltimo modo listado lá em cima. Vamos então, ao código fonte:
Os pontos que devem ser observados aqui são:
Este bloco serve para declarar variáveis que serão usadas para passar ou receber valores para o banco de dados. Elas precisam ser declaradas nesta seção em especial para que o pré-processador do PostgreSQL tenha conhecimento delas.
O comando:
realiza a conexão com o banco de dados. Para indicar ao pré-processador que queremos usar variáveis, devemos usar o símbolo dois-pontos (:) seguido pelo nome da variável. Note que estas variáveis devem ter sido declaradas na seção DECLARE SECTION.
Outro ponto a ser observado é a verificação da variável sqlca.sqlcode. O pré-processador declara uma variável global chamada sqlca, que tem a seguinte estrutura:
Esta estrutura permite uma verificação de erros e warnings (aviso, traduzido literalmente) mais detalhada sobre os comandos executados. A variável sqlcode pode assumir os seguintes valores:
Por fim, o comando:
Finaliza todas as conexões abertas pelo programa.
O programa acima simplesmente abre uma conexão com o banco de dados especificado e exibe uma mensagem dizendo se a conexão foi efetuada com sucesso ou não. Como padrão eu costumo salvar os arquivos com SQL embutido com a extensão pgc, mas qualquer outra extensão pode ser usada.
2. Criando o ambiente de testes
3. Iniciando com o ECPG
4. Conectando com o servidor de banco de dados
5. Compilando os programas
6. Inserindo, atualizando e apagando dados de tabelas
7. Retornando dados de tabelas
8. Considerações Finais
#1
Comentário enviado por marcolinux em 07/06/2006 - 17:11h
#2
Comentário enviado por faustojacome em 10/03/2008 - 23:43h
#3
Comentário enviado por benwin em 28/10/2009 - 07:28h
Onde destino pode ser definido da seguinte forma:
- nome do banco[@host][:porta]
- tcp:postgresql://host[:porta][/nome_do_banco]
- unix:postgresql://host[:porta][/nome_do_banco]
- uma string contendo qualquer uma das formas mencionadas acima
- uma variável do tipo char contendo qualquer uma das formas mencionadas acima
- DEFAULT
E nome_do_usuário pode ser definido como:
- username
- username/senha
- username IDENTIFIED BY senha
- username USING senha
Para o nosso artigo, iremos passar os parâmetros através de variáveis, que é o penúltimo modo listado lá em cima. Vamos então, ao código fonte:
/* INCLUDE */
#include <stdio.h>
EXEC SQL include sqlca;
/* MAIN */
int main(int argc, char **argv)
{
EXEC SQL BEGIN DECLARE SECTION;
const char *nome_database = "teste@localhost";
const char *szUser = "teste";
EXEC SQL END DECLARE SECTION;
EXEC SQL CONNECT TO :szDBName USER :szUser;
if(sqlca.sqlcode != 0) {
printf("Conexão com %s falhou. ", nome_database);
return 0;
} else {
printf("Connection ok com %s. ", nome_database);
}
EXEC SQL DISCONNECT ALL;
return 0;
}
#include <stdio.h>
EXEC SQL include sqlca;
/* MAIN */
int main(int argc, char **argv)
{
EXEC SQL BEGIN DECLARE SECTION;
const char *nome_database = "teste@localhost";
const char *szUser = "teste";
EXEC SQL END DECLARE SECTION;
EXEC SQL CONNECT TO :szDBName USER :szUser;
if(sqlca.sqlcode != 0) {
printf("Conexão com %s falhou. ", nome_database);
return 0;
} else {
printf("Connection ok com %s. ", nome_database);
}
EXEC SQL DISCONNECT ALL;
return 0;
}
Os pontos que devem ser observados aqui são:
EXEC SQL BEGIN DECLARE SECTION;
const char *nome_database = "teste@localhost";
const char *szUser = "teste";
EXEC SQL END DECLARE SECTION;
const char *nome_database = "teste@localhost";
const char *szUser = "teste";
EXEC SQL END DECLARE SECTION;
Este bloco serve para declarar variáveis que serão usadas para passar ou receber valores para o banco de dados. Elas precisam ser declaradas nesta seção em especial para que o pré-processador do PostgreSQL tenha conhecimento delas.
O comando:
EXEC SQL CONNECT TO :szDBName USER :szUser;
realiza a conexão com o banco de dados. Para indicar ao pré-processador que queremos usar variáveis, devemos usar o símbolo dois-pontos (:) seguido pelo nome da variável. Note que estas variáveis devem ter sido declaradas na seção DECLARE SECTION.
Outro ponto a ser observado é a verificação da variável sqlca.sqlcode. O pré-processador declara uma variável global chamada sqlca, que tem a seguinte estrutura:
struct {
char sqlcaid[8];
long sqlabc;
long sqlcode;
struct {
int sqlerrml;
char sqlerrmc[70];
} sqlerrm;
char sqlerrp[8];
long sqlerrd[6];
char sqlwarn[8];
char sqlstate[5];
} sqlca;
char sqlcaid[8];
long sqlabc;
long sqlcode;
struct {
int sqlerrml;
char sqlerrmc[70];
} sqlerrm;
char sqlerrp[8];
long sqlerrd[6];
char sqlwarn[8];
char sqlstate[5];
} sqlca;
Esta estrutura permite uma verificação de erros e warnings (aviso, traduzido literalmente) mais detalhada sobre os comandos executados. A variável sqlcode pode assumir os seguintes valores:
- 0 se nenhum erro ocorreu durante a execução;
- negativo, se um warning foi gerado;
- positivo, se uma condição não-fatal ocorreu, como por exemplo uma query que não retorna valores.
Por fim, o comando:
EXEC SQL DISCONNECT ALL;
Finaliza todas as conexões abertas pelo programa.
O programa acima simplesmente abre uma conexão com o banco de dados especificado e exibe uma mensagem dizendo se a conexão foi efetuada com sucesso ou não. Como padrão eu costumo salvar os arquivos com SQL embutido com a extensão pgc, mas qualquer outra extensão pode ser usada.
Páginas do artigo
1. Introdução2. Criando o ambiente de testes
3. Iniciando com o ECPG
4. Conectando com o servidor de banco de dados
5. Compilando os programas
6. Inserindo, atualizando e apagando dados de tabelas
7. Retornando dados de tabelas
8. Considerações Finais
Outros artigos deste autor
Leitura recomendada
Embutindo um banco de dados SQLite em sua aplicação C++
Comentários
Apos quebrar muito a cabeca para funcionar no Debian com o PostgreSQL e o ecpg via apt-get aqui vai a forma que consegui compilar.
gcc -g -I/usr/include/postgresql/ -o saida postgreSQL.c -L/usr/lib/postgresql/8.3/lib/ -lecpg -lpq
gcc -g -I/usr/include/postgresql/ -o saida postgreSQL.c -L/usr/lib/postgresql/8.3/lib/ -lecpg -lpq
Porque eu não posso usar variáveis no campo FROM?
EXEC SQL SELECT usuario, senha INTO :varusuario, :varsenha FROM :tabelabd WHERE usuario = :meunumerodb;
Existe alguma forma de burlar isso?
Abraço!
EXEC SQL SELECT usuario, senha INTO :varusuario, :varsenha FROM :tabelabd WHERE usuario = :meunumerodb;
Existe alguma forma de burlar isso?
Abraço!
Estou justamente sofrendo aqui usando a libpq !
Parabéns pelo material.
MARCOLINUX