[firebase-br] [C + SQL] Usando 2 bancos ao mesmo tempo.
Euler Jr.
euler em siginformatica.com.br
Ter Ago 2 09:26:28 -03 2005
Vc pode criar um identificador unico, dependendo do tipo do argumento de
entrada. Por ex. SET DATABASE DB1 e SET DATABASE DB2. Depois vc utiliza
o handle para estabelecer a conexao CONNECT DB1 ou CONNECT DB2,
dependendo da situacao (IN ou OUT).
[]s
Euler Jr.
Jonis Demamann escreveu:
> 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
>
> ______________________________________________
> FireBase-BR (www.firebase.com.br) - Hospedado em www.bavs.com.br
> Para editar sua configuração na lista, use o endereço http://mail.firebase.com.br/mailman/listinfo/lista_firebase.com.br
> Para consultar mensagens antigas: http://firebase.com.br/pesquisa
>
Mais detalhes sobre a lista de discussão lista