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.