iGames V2.0
Recuperando dados Final010


Participe do fórum, é rápido e fácil

iGames V2.0
Recuperando dados Final010
iGames V2.0
Gostaria de reagir a esta mensagem? Crie uma conta em poucos cliques ou inicie sessão para continuar.
Últimos assuntos
» Reativação iGames V2.0 2016
Recuperando dados EmptyQua Out 19 2016, 22:04 por teilor

» MUDANÇAS iGAMES V2.0 Free & Vip
Recuperando dados EmptyQua Jun 10 2015, 18:11 por marcela

» Lançamento Lineage 2 Empire
Recuperando dados EmptyQua Dez 17 2014, 14:35 por teilor

» Reativação Staff
Recuperando dados EmptyDom Dez 14 2014, 18:42 por Viking

» Lineage 2 Empire
Recuperando dados EmptySáb Dez 13 2014, 17:39 por Viking

» GAME - Ultra Street Fighter IV ganha detalhes de lançamento
Recuperando dados EmptySex Dez 06 2013, 02:59 por teilor

» GAME - Ajude a Konami a fazer o PES da próxima geração
Recuperando dados EmptySex Dez 06 2013, 02:58 por teilor

» GAME - Abertura de Gran Turismo 6 é homenagem a Senna
Recuperando dados EmptySex Dez 06 2013, 02:55 por teilor

» CINEMA - Equipe de Velozes faz vídeo para Paul Walker
Recuperando dados EmptySex Dez 06 2013, 02:51 por teilor

» CINEMA - Eva Green em destaque no novo trailer de 300
Recuperando dados EmptySex Dez 06 2013, 02:48 por teilor

» MUSICA - Ben Foster será o protagonista do filme Warcraft
Recuperando dados EmptySex Dez 06 2013, 02:45 por teilor

» CINEMA - Diane Keaton receberá prêmio em nome de Woody Allen
Recuperando dados EmptySex Dez 06 2013, 02:44 por teilor

» MUSICA - Daft Punk divulgou a prévia de seu novo clipe
Recuperando dados EmptySex Dez 06 2013, 02:41 por teilor

» MUSICA - DJ Cassidy lança música com Jessie J e Robin Thicke
Recuperando dados EmptySex Dez 06 2013, 02:40 por teilor

» Samsung inicia produção em massa de memórias DDR4
Recuperando dados EmptyDom Set 01 2013, 10:09 por teilor

» Archos cita dispositivos que deverão ser apresentados nesta IFA
Recuperando dados EmptyDom Set 01 2013, 10:07 por teilor

» CityNext: Microsoft lança programa para cidades inteligentes
Recuperando dados EmptyDom Set 01 2013, 10:05 por teilor

» Unity anuncia programa para desenvolvimento de jogos próprios
Recuperando dados EmptyDom Set 01 2013, 10:04 por teilor

» Como instalar addons em World of Warcraf
Recuperando dados EmptySáb Ago 31 2013, 06:29 por marcela

» Como criar macros em World of Warcraft
Recuperando dados EmptySáb Ago 31 2013, 06:25 por marcela

» [ Dicas ] de como jogar Real Racing 3 sem gastar nenhum dinheiro real
Recuperando dados EmptySáb Ago 31 2013, 06:13 por joaopaulo

» [dica] Como assistir arquivos de vídeo do computador na sua Apple TV
Recuperando dados EmptySáb Ago 31 2013, 06:10 por joaopaulo

» Steam Greenlight oferece promoção em seu aniversário
Recuperando dados EmptySáb Ago 31 2013, 06:05 por Leonardo

» Microsoft e Google juntam forças para processar governo dos EUA
Recuperando dados EmptySáb Ago 31 2013, 05:55 por Leonardo

» Pesquisadores do MIT desenvolvem processador com 110 núcleos
Recuperando dados EmptySáb Ago 31 2013, 05:53 por Leonardo

» Vai ao cinema? Apps para iPhone ajudam a escolher filme e comprar ingresso
Recuperando dados EmptyQui Ago 29 2013, 22:58 por 

» Serviço de videoclipes Vevo terá aplicativo para Apple TV, diz WSJ
Recuperando dados EmptyQui Ago 29 2013, 22:31 por 

» Como a Apple está transformando seu computador em um smartphone
Recuperando dados EmptyQui Ago 29 2013, 22:17 por 

» Os 11 melhores apps para iPhone, iPad e Mac, segundo a Apple
Recuperando dados EmptyQui Ago 29 2013, 13:56 por teilor

» iPhone 5S pode ter botão Home curvado para fora e leitor de digitais
Recuperando dados EmptyQui Ago 29 2013, 13:48 por teilor

» iPhone 5S e iPhone 5C serão lançados no dia 20 de setembro
Recuperando dados EmptyQui Ago 29 2013, 13:45 por teilor

» Crytek dedica esforços na melhoria da IA de Ryse: Son of Rome
Recuperando dados EmptyQui Ago 29 2013, 04:20 por teilor

» Atualização gratuita de The Last of Us traz novo modo ao multiplayer
Recuperando dados EmptyQui Ago 29 2013, 04:15 por teilor

» Novo trailer de GTA V amanhã ao meio-dia
Recuperando dados EmptyQui Ago 29 2013, 04:14 por teilor

» Killzone: Mercenary
Recuperando dados EmptyQui Ago 29 2013, 04:13 por teilor

Doação
Donation

Recuperando dados

Ir para baixo

Recuperando dados Empty Recuperando dados

Mensagem por Barbosa Qui Ago 22 2013, 19:19

Chegamos na parte mais usada, e também a mais complexa da libpq, que é a recuperação de dados.

O que torna essa parte da API mais complexa é o fato de não sabermos sempre quantas linhas o nosso comando irá retornar, ou mesmo a quantidade de campos. Porém, podemos fazer chamadas adicionais a funções da API que ajudam a contornar este problema. Para executar um comando SELECT continuamos a usar a função PQexec exatamente como antes.

Primeiro, vamos descobrir quantas linhas o nosso comando retorna. Para isso, usamos a função PQntuples, que tem o seguinte protótipo:

int PQntuples(PGresult *result);

Onde result é o retorno da chamada a função PQexec.

Tudo bem, isso na verdade não ajuda muito, pois o que queremos é ver o que temos dentro da tabela. Para isso, vamos usar uma maneira rápida e simples da libpq que gera a saída em um arquivo. Esta função é a PQprint, que tem o protótipo:

void PQprint(FILE *stream, PGresult *result, PQprintOpt *options);

Esta função vai receber como parâmetros um ponteiro para o nosso arquivo, um ponteiro de resultado retornado pela função PQexec e uma estrutura de opções. Esta estrutura vai definir algumas opções para gerar o arquivo, como por exemplo o caractere que vai delimitar os dados.

Código:
typedef struct PQprintOpt
{
    pqbool header;    /*imprime o cabeçalho*/
    pqbool align;    /*alinha e preenche os campos*/
    pqbool standard;  /*formato antigo não mais utilizado*/
    pqbool html3;    /*gera saída das tabelas em HTML*/
    pqbool expanded;  /*expande tabelas*/
    pqbool pager;    /*usa o paginador para saída caso necessário*/
    char *fieldSep;  /*caractere que será o separador de campos*/
    char *tableOpt;  /*inserção na <table ...> HTML*/
    char *legenda;    /*legenda HTML*/
    char **fieldname; /*array terminado com null contendo o nome de campos para substituição*/
}
Vamos agora alterar o nosso programa anterior para recuperar os dados da nossa tabela de testes.

Código:
#include <stdio.h>
#include <stdlib.h>
#include <libpq-fe.h>

/*Objeto de conexão*/
PGconn *conn = NULL;

/*Ponteiro de resultado*/
PGresult *result;

/*Arquivo que irá conter o fluxo de saída*/
FILE *output_stream;

/*Estrutura de opções*/
PQprintOpt print_options;

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;
    }

    /*Executa o comando*/
    result = PQexec(conn, "SELECT * FROM contatos");
   
    if(!result)
    {
        printf("Erro executando comando. ");
    }
    else
    {
        switch(PQresultStatus(result))
        {
            case PGRES_EMPTY_QUERY:
                printf("Nada aconteceu. ");
                break;
            case PGRES_TUPLES_OK:
                printf("A query retornou %d linhas. ", PQntuples(result));
                break;
            case PGRES_FATAL_ERROR:
                printf("Error in query: %s ", PQresultErrorMessage(result));
                break;
            case PGRES_COMMAND_OK:
                printf("%s linhas afetadas. ", PQcmdTuples(result));
                break;
            default:
                printf("Algum outro resultado ocorreu. ");
                break;
        }
       
        /*Define o nosso arquivo de saída*/
        output_stream = fopen("/dev/tty", "w");

        if(output_stream == NULL)
            printf("Erro abrindo o arquivo. ");
        else
        {
           
            memset(&print_options, '\0', sizeof(print_options));
           
            print_options.header = 1;
            print_options.align = 1;
            print_options.html3 = 0;
            print_options.fieldSep = "|";
            print_options.fieldName = NULL;
           
            PQprint(output_stream, result, &print_options);
        }
               
        /*Libera o nosso objeto*/
        PQclear(result);
    }

 
    /*Verifica se a conexão está aberta e a encerra*/
    if(conn != NULL)
        PQfinish(conn);
}
Percebam que apesar de ser relativamente simples de usar, esta solução está longe de ser a melhor solução para recuperar dados. Quando temos um volume pequeno de dados esta solução é aceitável, mas que torna-se inutilizável quando temos tabelas maiores. Para piorar, é muito complicado se quisermos manipular os valores retornados.

Existe uma outra alternativa muito mais eficiente para retornarmos dados que é o uso de cursores. Este assunto porém é material suficiente para um novo artigo, devido ao tamanho e complexidade envolvida.
Barbosa
Barbosa
Fundador
Fundador

Respeito Respeito :
Recuperando dados 11101010100 / 100100 / 100Recuperando dados 22101010

Mensagens : 1028
Idade : 33
Localização : sao paulo

https://www.facebook.com/pages/Forum-IGames/246709752102045

Ir para o topo Ir para baixo

Ir para o topo


 
Permissões neste sub-fórum
Não podes responder a tópicos