[firebase-br] [C + SQL] Usando 2 bancos ao mesmo tempo.

Jonis Demamann morppheu em gmail.com
Seg Ago 1 18:24:42 -03 2005


Olá pessoal.

Sou novo no mundo de programação em SQL com C/C++. Eu estou fazendo um
programa em C++ que usa uma biblioteca dinâmica para acessar o banco
de dados do Firebird. Tenho um banco de entrada e um de saída e a
biblioteca dinâmica foi feita em C. O programa principal é feito em
C++, e criei uma classe Banco para acesso as bases de dados.

class Banco
{
    public:
        /* Construtor e Destrutor */
        Banco(void);
        ~Banco(void);

        /* Métodos públicos que podem ser usados pelo usuário */
        int conectaBanco(int);
        int desconectaBanco(void);
        int procuraResultado(int);
        stResultado_t *pegaResultado(int, stStatus_t *);
        int gravaResultado(void *, int);
        int apagaResultado(int);


    private:
        /* Métodos para o banco */
        int (*Connect)(const char *, const char *, const char *);
        int (*Disconnect)(void);
        int (*Commit)(void);
        int (*RollBack)(void);

        /* Métodos para pegar/gravas dados do banco */
        int (*SelectMinIdMaxTerm)(int *, char *, int);
        stResultadoLws_t *(*SelectResultadosLws)(int);
        int (*ApagaResultados)(int);
        int (*GravaResultados)(int);

        /* Métodos para quebrar o Resultado em uma Estrutura */
        stResultado_t *quebraResultado(const char *, int, stStatus_t *);

        /* Métodos auxiliares (geração log, ler configuração...) */
        int leConfiguracaoDat(stConfigBanco_t &);
        void printL(const char *fmt, ...);

};

Para fazer a conexão com os Bancos, passo para a classe o parâmetro 0,
se for o banco de entrada, e 1 se for o banco de saída. A classe lê um
arquivo de configuração .dat que contém o caminho, senha e usuário de
cada base de dados.

O problema é que não sei como fazer para diferenciar os bancos de
entrada/saída na biblioteca dinâmica. O código pode ser visto a
seguir:

#include <stdio.h>
#include <stdarg.h>
#include "../includes/utils.h"
#include "../includes/gerenciador.h"

#define LOGSIZE 50
#define LOGFILE "firebird.log"

EXEC SQL SET SQL DIALECT 3;

int ConnectFire(const char *pszUser, const char *pszPass, const char *pszDb) {
    printLFire("Connect <FIREBIRD> BEGIN");

    EXEC SQL WHENEVER SQLERROR GO TO SqlError;
    EXEC SQL CONNECT :pszDb USER :pszUser PASSWORD :pszPass;
    printLFire("Connect <FIREBIRD> END");
    return (1);

SqlError:
    printLFire("Connect <FIREBIRD> ERROR");
    return (0);
}

int DisconnectFire(void) {
    printLFire("Disconnect <FIREBIRD> BEGIN");
    EXEC SQL WHENEVER SQLERROR GO TO SqlError;
    EXEC SQL DISCONNECT;
    printLFire("Disconnect <FIREBIRD> END");
    return (1);

SqlError:
    printLFire("Disconnect <FIREBIRD> ERROR");
    return (0);
}


Sei que vou ter que usar o comando  EXEC SQL SET DATABASE, mas não sei
exatamente como usar.
No meu programa, eu instâncio 2 objetos do tipo Base (dbIn e dbOut) e
inicializo eles:

dbIn.conectaBanco(0); // para conectar no bando de entrada.
dbIn.conectaBanco(1); // para conectar no banco de saída

Quando tento conectar no banco de saída, ocorre um erro dizendo que
não foi possível conectar ao banco (isso porque não estou usando SET
DATABASE...). Se alguém puder me dar uma luz.

Não sei se fui bem claro, mas posso passar os códigos em C++.

Obrigado.
--
Jonis Alves Demamann.
ICQ 53207119
MSN morppheu em hotmail.com




Mais detalhes sobre a lista de discussão lista