Página 5 de 6
Iniciante xHarbour - Como acessar .Fdb .Gdb
Enviado: 10 Out 2016 10:16
por Itamar M. Lins Jr.
Ola!
Peguei seu código e só comentei as duas linhas abaixo.
//#include "hbrddsql.ch"
//#include "firebird.ch" // PARA FIREBIRD
Aqui o resultado.
Código: Selecionar todos
C:\fontes\teste>hbmk2 fdb.prg sddodbc.hbc sddfb.hbc
hbmk2: Processando script local make: hbmk.hbm
Harbour 3.4.0dev (bde5c0c) (2016-09-28 18:12)
Copyright (c) 1999-2016, https://github.com/vszakats/harbour-core/
Compiling 'fdb.prg'...
Lines 678, Functions/Procedures 2
Generating C source output to 'C:\Users\Itamar\AppData\Local\Temp\hbmk_8xmai4.di
r\fdb.c'... Done.
Código: Selecionar todos
RDD's instaladas: >> SQLBASE SQLMIX DBF DBFCDX
-----------------------------------------------------
Connecetion=> 0
-----------------------------------------------------
Connecetion=> 0
-----------------------------------------------------
Connecetion=> 0
-----------------------------------------------------
C:\fontes\teste>
Saudações,
Itamar M. Lins Jr.
Iniciante xHarbour - Como acessar .Fdb .Gdb
Enviado: 10 Out 2016 10:37
por Itamar M. Lins Jr.
E com a linha #include "hbrddsql.ch" não comentada.
Código: Selecionar todos
RDD's instaladas: >> SQLBASE SQLMIX DBF DBFCDX
-----------------------------------------------------
Retornou ARRAY para nConn1
1 ODBC
2 Server=localhost;Driver={Firebird/InterBase(r) driver 2.00.04.155};ds
n=;User=SYSDBA;Password=masterkey;database=G:\Dev2\DentalOff\Small.gdb;
-----------------------------------------------------
Retornou ARRAY para nConn5
1 ODBC
2 Server=localhost;Database=G:\Dev2\DentalOff\Small.gdb;User=SYSDBA;Pas
sword=masterkey;Driver={Firebird/InterBase(r) driver};
-----------------------------------------------------
Retornou ARRAY para nConn6
1 ODBC
2 Server=localhost;Database=127.0.0.1:G:\Dev2\DentalOff\Small.gdb;User=
SYSDBA;Password=masterkey;Driver={Firebird/InterBase(r) driver};
-----------------------------------------------------
C:\fontes\teste>
Vamos ver no forum internacional...
Saudações,
Itamar M. Lins Jr.
Iniciante xHarbour - Como acessar .Fdb .Gdb
Enviado: 10 Out 2016 10:57
por Itamar M. Lins Jr.
Ola!
Não precisou.
Seu arquivo dbinfo.ch está com problema, ou não tem essa parte.
Código: Selecionar todos
*
#include "dbinfo.ch"
#require "rddsql"
#require "sddodbc"
*
REQUEST SQLMIX, DBFCDX, SDDODBC
*
ANNOUNCE RDDSYS
*
PROCEDURE Main()
*
SETMODE( 25, 80 )
rddSetDefault( "SQLMIX" )
Set( _SET_DATEFORMAT, "yyyy-mm-dd" )
*
clear
*
? "RDD's install: >>"
?? AEval( rddList(), {| x | QQOut( "", x ) } )
? "-----------------------------------------------------"
*
nConn1 := rddInfo( RDDI_CONNECT, { "ODBC", "Server=localhost;Driver={Firebird/InterBase(r) driver};dsn=;User=SYSDBA;Password=masterkey;database=G:\Dev2\DentalOff\Small.gdb;" } )
IF ValType( nConn1 ) = "N"
? "Connection=>", nConn1
ELSEIF ValType( nConn1 ) = "A"
? "Return ARRAY of nConn1"
For x1 = 1 TO Len( nConn1 )
? x1, nConn1[x1]
Next x1
ELSE
Alert( 'connection fault nConn1' )
ENDIF
Dentro do meu dbinfo.ch do 3.4
Código: Selecionar todos
/* SQL */
#define RDDI_CONNECT 61 /* connect to database */
#define RDDI_DISCONNECT 62 /* disconnect from database */
#define RDDI_EXECUTE 63 /* execute SQL statement */
#define RDDI_ERROR 64 /* error number */
#define RDDI_ERRORNO 65 /* error description */
#define RDDI_INSERTID 66 /* last auto insert ID */
#define RDDI_AFFECTEDROWS 67 /* number of affected rows after UPDATE */
#define RDDI_QUERY 68 /* last executed query */
e se colocar a hbrddsql.ch
Código: Selecionar todos
/* NOTE: This file is also used by C code. */
#ifndef HB_RDDSQL_CH_
#define HB_RDDSQL_CH_
/* New ...INFO_ constants */
#define DBI_QUERY 1001
#define RDDI_CONNECT 1001
#define RDDI_DISCONNECT 1002
#define RDDI_EXECUTE 1003
#define RDDI_ERROR 1004
#define RDDI_ERRORNO 1005
#define RDDI_NEWID 1006
#define RDDI_AFFECTEDROWS 1007
#define RDDI_QUERY 1008
#endif
Muito diferente. O problema deve ser a salada de versões ai...
Saudações,
Itamar M. Lins Jr.
Iniciante xHarbour - Como acessar .Fdb .Gdb
Enviado: 10 Out 2016 12:58
por Hasse
Oi Itamar.
Você matou a charada. O problema estava no dbinfo.ch.
Eu havia copiado ele da pasta do MiniGui 3.4.1
Fui na pasta do HB32 recém instalado e usei aquele.
A Compilação passou e a conexão retorna um número, iniciando com 1. A cada nova conexão este número incrementa em 1.
Um pequeno detalhe, mas fundamental. Estou curioso para saber como você chegou a esta conclusão. Foi uma sacada genial.
Valeu mesmo Itamar. Mais uma vez obrigado pela tua valiosa e prestimosa colaboração. Sinceramente, eu nunca chegaria lá.
Iniciante xHarbour - Como acessar .Fdb .Gdb
Enviado: 10 Out 2016 14:27
por Itamar M. Lins Jr.
Ola!
A Compilação passou e a conexão retorna um número, iniciando com 1. A cada nova conexão este número incrementa em 1.
Esta correto, vc pode ter múltiplas conexões MySQL = nConn1, Firebird = nConn2...
Use
RDDI_DISCONNECT para desconectar.
Código: Selecionar todos
RDDINFO(RDDI_DISCONNECT,,"SQLMIX",nConn1) //tem que colocar o tipo de RDD
RDDINFO(RDDI_DISCONNECT,,"SQLMIX",nConn2)
Saudações,
Itamar M. Lins Jr.
Iniciante xHarbour - Como acessar .Fdb .Gdb
Enviado: 10 Out 2016 14:35
por Itamar M. Lins Jr.
Ola!
Estou curioso para saber como você chegou a esta conclusão.
Porque aqui funciona, quando copiei o seu código deixou de funcionar, ai fui eliminando as linhas desnecessárias.
Eu ia colocar seu código no forum internacional, e lá eles pedem o menor código possível.
Saudações,
Itamar M. Lins Jr.
Iniciante xHarbour - Como acessar .Fdb .Gdb
Enviado: 14 Out 2016 11:16
por Hasse
Bom dia Itamar.
Estou testando e brincando com as Funções, Comandos do Firebird direto ou nativo: FBCreateDB(), FBConnect(), etc.
Consigo criar o BANCO, criar uma Tabela, e inserir dados (em parte).
Veja os PRG's abaixo:
Código: Selecionar todos
? "Create Tabela Teste_2=======>>", tmp := FBQuery( db, "CREATE TABLE Teste_Dbas( COD smallint, CLIENTE char(20), CIDADE char(25) )", nDialect, trans )
O campo COD é smallint.
Código: Selecionar todos
FOR xx1 = 1 TO 5
? "Exec Insert Teste_Dbas======>>", tmp := FBExecute( db, 'insert into Teste_Dbas(COD) values(1)', nDialect, trans )
NEXT xx1
Funciona corretamente inserindo o valor 1 em todos os registros.
Código: Selecionar todos
? "Exec Insert Teste_Dbas======>>", tmp := FBExecute( db, 'insert into Teste_Dbas(COD) values(xx1)', nDialect, trans )
? "Exec Insert Teste_Dbas======>>", tmp := FBExecute( db, 'insert into Teste_Dbas(COD) values(&xx1)', nDialect, trans )
? "Exec Insert Teste_Dbas======>>", tmp := FBExecute( db, 'insert into Teste_Dbas(COD) values("xx1")', nDialect, trans )
? "Exec Insert Teste_Dbas======>>", tmp := FBExecute( db, 'insert into Teste_Dbas(COD) values("&xx1")', nDialect, trans )
NÃO funciona se quero inserir o valor crescente de contido na variável xx1 incrementada em FOR xx1.
Já testei usar xx1 (erro -206), &xx1 (erro -104), "xx1" (erro -413) e "&xx1" (erro -413)
Como fazer ?
Iniciante xHarbour - Como acessar .Fdb .Gdb
Enviado: 15 Out 2016 11:49
por Hasse
A mesma coisa acontece com o ODBC RDDINFO - NÃO grava valores numéricos:
Código: Selecionar todos
RDDINFO(RDDI_EXECUTE, "CREATE TABLE Teste_ODBC ( COD int, CLIENTE char(10), CIDADE char(20)) " )
FOR xx1 = 1 TO 05
cd1 := StrZero( xx1, 10 )
cd2 := StrZero( xx1, 20 )
? RDDINFO(RDDI_EXECUTE, "insert into Teste_ODBC ( CLIENTE, CIDADE ) values( '&cd1', '&cd2' )" ) && OK - grava a string da variável.
*
? RDDINFO(RDDI_EXECUTE, "insert into Teste_ODBC (COD) values( xx1 )" ) && erro.
? RDDINFO(RDDI_EXECUTE, "insert into Teste_ODBC (COD) values( &xx1 )" ) && erro.
? RDDINFO(RDDI_EXECUTE, "insert into Teste_ODBC (COD) values( 'xx1' )" ) && erro.
? RDDINFO(RDDI_EXECUTE, "insert into Teste_ODBC (COD) values( '&xx1' )" ) && erro.
NEXT xx1
Nenhuma das 4 opções grava o valor da variável numérica XX1.
Variáveis char e varchar gravam corretamente.
Como contornar este problema ?
Iniciante xHarbour - Como acessar .Fdb .Gdb
Enviado: 15 Out 2016 12:59
por Hasse
Interessante que funciona gravando se NULL
Código: Selecionar todos
? RDDINFO(RDDI_EXECUTE, "insert into Teste_ODBC ( COD, CLIENTE, CIDADE ) values( null, '&cd1', '&cd2' )" ) && OK - retorna .T.
Iniciante xHarbour - Como acessar .Fdb .Gdb
Enviado: 15 Out 2016 14:04
por Hasse
Outro detalhe que me chamou a atenção !!!!!!!!!!!!!!
A velocidade de gravação.
Para gravar 10.000 registros com insert, tempos em segundos.
Vejam a EXTREMA diferença dos números. É inacreditável.
Somando ainda a grande instabilidade de desempenho entre uma medição e outra do ODBC !!!
ODBC-----------------FB
10.000----------------10.000 registros gravados
59,242----------------1,706 segundos
80,548----------------1,538 segundos
43,343----------------1,715 segundos
26,399----------------1,741 segundos
37,992----------------1,581 segundos
33,513----------------1,733 segundos
47,371----------------1,741 segundos
39,009----------------1,714 segundos
37,503----------------1,592 segundos
28,865----------------1,692 segundos
Concluindo:
Quem precisa de velocidade DEVE usar a FB direto, SEM ODBC. Aos meus Gurus de SGDB's, tem algum erro nesta minha conclusão

?
Detalhes: Não encontrei qualquer referência à possibilidade de uso do ROLLBACK com o ODBC.
Parece que não há necessidade de "commitar" os dados gravados com ODBC.
No FB exige, pois sem o COMMIT os dados não são gravados.
Abaixo o PRG usado para o caso do ODBC:
Código: Selecionar todos
RDDINFO(RDDI_EXECUTE, "CREATE TABLE Teste_ODBC ( CLIENTE char(10), CIDADE char(20) )" )
c_Time1 := Subs( HB_ValToStr( DateTime() ), 12 )
c_Tm1 := DateTime()
? "Time Inicial..:>"
?? c_Time1
*
FOR xx1 = 1 TO 10000
cd1 := "1" + StrZero( xx1, 09 )
cd2 := "2" + StrZero( xx1, 19 )
RDDINFO(RDDI_EXECUTE, "insert into Teste_ODBC ( CLIENTE, CIDADE ) values( '&cd1', '&cd2' )" )
NEXT xx1
c_Time2 := Subs( HB_ValToStr( DateTime() ), 12 )
c_Tm2 := DateTime()
? "Time Inicial...:>" + c_Time1,
? "Time Final.....:>" + c_Time2,
? "Total....:>"
?? c_Tm2 - c_Tm1, " dias == ", ( c_Tm2 - c_Tm1 ) * 86400, " segundos"
E abaixo o código para o FB sem ODBC:
Código: Selecionar todos
trans := FBStartTransaction( db )
FBQuery( db, "CREATE TABLE Teste_Dbas( COD int, CLIENTE char(20), CIDADE char(25) )", nDialect, trans )
FBCommit( trans )
*
c_Time1 := Subs( HB_ValToStr( DateTime() ), 12 )
c_Tm1 := DateTime()
? "Time Inicial..:>"
?? c_Time1
*
trans := FBStartTransaction( db )
FOR xx1 = 1 TO 10000
cd1 := "1" + strzero( xx1, 09 )
cd2 := "2" + strzero( xx1, 19 )
FBExecute( db, 'insert into Teste_Dbas(COD, CLIENTE, CIDADE) values( "&xx1" as integer, "&cd1", "&cd2")', nDialect, trans )
NEXT xx1
FBCommit( trans )
c_Time2 := Subs( HB_ValToStr( DateTime() ), 12 )
c_Tm2 := DateTime()
? "Time Inicial...:>" + c_Time1,
? "Time Final.....:>" + c_Time2,
? "Total....:>"
?? c_Tm2 - c_Tm1, " dias == ", ( c_Tm2 - c_Tm1 ) * 86400, " segundos"
Iniciante xHarbour - Como acessar .Fdb .Gdb
Enviado: 16 Out 2016 21:49
por Hasse
Assunto da gravação de número resolvido.
Consultar o link abaixo:
https://pctoledo.org/forum/viewto ... 0&start=30
Obrigado a todos que contribuíram.
Iniciante xHarbour - Como acessar .Fdb .Gdb
Enviado: 16 Out 2016 21:53
por Hasse
Para o passo seguinte preciso:
1)-Listas das Funções e Comandos da biblioteca FB;
2)-Lista com os significados dos erros retornados.
Já pesquisei no site do Firebird e nada encontrei que mencionasse essa biblioteca FB.
Onde posso conseguir isso ?
Iniciante xHarbour - Como acessar .Fdb .Gdb
Enviado: 15 Set 2022 16:10
por thekey
Olá a todos.
A exatos 6 anos atrás o usuário "Hasse" estava com dificuldades em acessar um .FDB de terceiros retornando erro de coneccao e supostamente algo relacionado a SYSDBA ou masterkey.
O tópico se desenvolveu arduamente na busca da coneccao via harbour, que acabou tomando outras direcoes para contornar o problema.
Hoje em 2022, nao sei se alguem ainda procura por isto, mas por acaso vi esta duvida e gostaria de postar minha contribuicao que acredito que possa ser a chave deste emaranhado de postagens.
Uma vez eu estava tentando acessar um banco de dados de terceiros, e nao conseguia via Ibexpert ou flameRobin, mito menos via comando convencionais do harbour.
Ate que descobri que a empresa detentora do .FDB havia propositalmente protegido seu FDB contra acessos sem usar o aplicativo proprio da empresa.
Sabemos que este acesso externo via ibexpert, dbconsole ou flamerobin, sempre foi um problema de seguranca do firebird, haja vista seu usuario e senha universal (SYSDBA/masterkey).
Ate eu descobrir, que a empresa utilizou um "massete" para proteger o acesso direto ao FDB, criando uma "Rule" no banco de dados com o mesmo nome do usuario SYSDBA. Causando assim um "bug" de coneccao.
Alguns donos de software house, vão comer meu figado, mas a solucao para "destravar" o FDB da coneccao é a seguinte:
Basta usar um editor de texto binario, ou acessar o arquivo.FDB atraves de fopen etc.
O Objetivo é trocar a primeira ocorrencia da string "SYSDBA" diretamente no arquivo e colocar qualquer coisa no lugar como DBASYS por exemplo (string tem que ser do mesmo tamanho de SYSDBA, ou seja, 6 caracteres).
Ao fazer isto, voce estara alterando diretamente no arquivo.FDB suposto nome ou regra criado com intencao de conflitar com o SYSDBA.
Salve a alteracao, e vera que podera acessar normalmente atraves de qualquer coisa Harbour, flamerobin, ibexpert, etc.
Apos seu acesso atraves do seu "programinha bisbilhoteiro" bastar, voltar sua alteracao ao normal, senao o programa da empresa detentora pode nao conseguir abrir.
Esta pode nao ser a solucao do tema aqui, (apesar de ter quase certeza) que foi este a raiz do problema), mas fica dica de como muitas softwares houses protegem seus FDBs.
Abracos.
Iniciante xHarbour - Como acessar .Fdb .Gdb
Enviado: 15 Set 2022 20:54
por Hasse
Bom dia THEKEY.
Valeu pela tua contribuição.
Não estou mais tratando deste assunto e portanto aquele item está superado.
Contudo, meu caro, esta contribuição é muito importante para o post e o grupo.
Bom trabalho e sucesso para você e o grupo.
Iniciante xHarbour - Como acessar .Fdb .Gdb
Enviado: 08 Mai 2023 17:30
por Mario Mesquita
Boa tarde, pessoal.
Alguém testou essa dica do colega Thekey pra abrir uma db Firebird?
Um colega está com esse pepino de não conseguir abrir a base de dados. Qualquer dica ajuda.
Desde já, agradeço a todos.
Saudações,
Mario.