Caminho das pedras Firebird ODBC no Harbour

Projeto [x]Harbour - Compilador de código aberto compatível com o Clipper.

Moderador: Moderadores

Avatar do usuário
Itamar M. Lins Jr.
Administrador
Administrador
Mensagens: 7929
Registrado em: 30 Mai 2007 11:31
Localização: Ilheus Bahia
Curtiu: 1 vez

Caminho das pedras Firebird ODBC no Harbour

Mensagem por Itamar M. Lins Jr. »

Ola!
Precisei usar aqui uma conexão para migrar de gdb -> dbf
a) baixe o drive ODBC do FB. 2.xx e instale!

b) Configure a seu gosto, lembre-se do DSN(Data Source Name)
Não sabe configurar ?, Vá no Painel de controle, ferramentas administrativas, fontes de dados ODBC, fontes de dados do usuário, clicar no botão adicionar,
Se instalou o ODBC do FB, vai encontrar lá: Firebird/InterBase driver. Basta colocar o DSN=teste, depois DataBase=c:\temp\meudb.gdb, DataBase Account=SYSDBA, Password=masterkey, Teste a conexão no botão.

c) Lembre-se do Request... e de adicionar as libs SQLMIX e SDDODBC ao projeto.

Código: Selecionar todos

REQUEST DBFCDX,DBFFPT,DBFDBT,LETO, SQLMIX, SDDODBC
Function Main

cRdd  := RDDSETDEFAULT( "SQLMIX" )
nConn := RDDINFO( RDDI_CONNECT, { "ODBC", "DSN=teste;Driver={Firebird/InterBase(r) driver}" } )

IF nConn == 0
   Msginfo( "Não conectado ao servidor: " + str(RDDINFO( RDDI_ERRORNO )) + HB_EOL() + RDDINFO( RDDI_ERROR ) )
   RDDSETDEFAULT( cRdd )
   RETURN
ENDIF
DBUSEAREA( .T.,"SQLMIX", "select * from cliente", "xx" )
xx->(DbGoTop())

Do While xx->(!eof())
...
xx->(DbSkip())
EndDo
Bem aqui funcionou beleza!
Antes eu estava importando no access e salvando em dbf, agora é transparente.

Saudações,
Itamar M. Lins Jr.
Saudações,
Itamar M. Lins Jr.
Avatar do usuário
Itamar M. Lins Jr.
Administrador
Administrador
Mensagens: 7929
Registrado em: 30 Mai 2007 11:31
Localização: Ilheus Bahia
Curtiu: 1 vez

Caminho das pedras Firebird ODBC no Harbour

Mensagem por Itamar M. Lins Jr. »

Mais fácil ainda!
Esqueça a configuração no painel de controle do DSN.
use:

Código: Selecionar todos

cAttributes:="Server=;Database=127.0.0.1:c:\temp\temp.gdb;User=SYSDBA;Password=masterkey;Driver={Firebird/InterBase(r) driver};"
nConn := RDDINFO( RDDI_CONNECT,{"ODBC",cAttributes} )
Testei e funcionou.

Saudações,
Itamar M. Lins Jr.
Saudações,
Itamar M. Lins Jr.
DLZ
Usuário Nível 3
Usuário Nível 3
Mensagens: 184
Registrado em: 09 Jun 2008 10:09
Localização: Ibirubá - RS - Brasil

Caminho das pedras Firebird ODBC no Harbour

Mensagem por DLZ »

Ola.
Muito bom saber que poderei usar Firebird em aplicaçõs Xharbour.. Trabalho com esse banco com Delphi já a bastante tempo e o considero muito bom.
Só uma dúvida:
Existe alguma documentação dessas funções que podem ser usadas (DBUSEAREA() usada no exemplo do Itamar, por exemplo) ?

Ainda nesse mesmo exemplo, como faria para saber os campos e seus conteudos da tabela "clientes" pesquisada no Select ?
Como fazer commit/Rolback no banco ?
A função DBUSEAREA() serve para executar qualquer instrução SQL ? ou somente Select ?
Como executar Insert, Update, Delete, etc.. ?
Fiquei muito interessado nesse assunto.
Avatar do usuário
Itamar M. Lins Jr.
Administrador
Administrador
Mensagens: 7929
Registrado em: 30 Mai 2007 11:31
Localização: Ilheus Bahia
Curtiu: 1 vez

Caminho das pedras Firebird ODBC no Harbour

Mensagem por Itamar M. Lins Jr. »

Para manipular os dados, usamos os comandos do clipper mesmo.
APPEND, REPLACE etc.

existe outra forma com acesso nativo, ai é via insert, etc...

Código: Selecionar todos

/*
 * $Id: test.prg 16703 2011-05-01 19:44:30Z vszakats $
 */

#include "common.ch"
#include "simpleio.ch"

PROCEDURE Main()

   LOCAL cServer := "localhost:"
   LOCAL cDatabase
   LOCAL cUser := "SYSDBA"
   LOCAL cPass := "masterkey"
   LOCAL nPageSize := 1024
   LOCAL cCharSet := "ASCII"
   LOCAL nDialect := 1
   LOCAL cName

   LOCAL trans, qry

   LOCAL db, x, y
   LOCAL num_cols
   LOCAL columns
   LOCAL fetch_stat
   LOCAL tmp

   hb_FNameSplit( hb_argv( 0 ), NIL, @cName, NIL )
   cDatabase := hb_DirTemp() + cName + ".fdb"

   IF hb_FileExists( cDatabase )
      FErase( cDatabase )
   ENDIF

   ? tmp := FBCreateDB( cServer + cDatabase, cUser, cPass, nPageSize, cCharSet, nDialect ), FBError( tmp )


   /* Connect rdbms */
   db := FBConnect( cServer + cDatabase, cUser, cPass )
   IF ISNUMBER( db )
      ? "Error:", db, FBError( db )
      QUIT
   ENDIF

   ? "Testing invalid request"
   ? tmp := FBExecute( db, "sldjfs;ldjs;djf", nDialect ), FBError( tmp )

   trans := FBStartTransaction( db )
   IF ISNUMBER( trans )
      ? "Error:", trans, FBError( trans )
   ELSE
      ? tmp := FBQuery( db, "create table teste (code smallint)", nDialect, trans ), FBError( tmp )
      ? tmp := FBCommit( trans ), FBError( tmp )
   ENDIF

   ? "==="
   trans := FBStartTransaction( db )
   IF ISNUMBER( trans )
      ? "Error:", trans, FBError( trans )
   ELSE
      ? tmp := FBQuery( db, "CREATE TABLE customer( customer VARCHAR(20) )", nDialect, trans ), FBError( tmp )
      ? tmp := FBCommit( trans ), FBError( tmp )
   ENDIF
   ? "==="

   trans := FBStartTransaction( db )
   IF ISNUMBER( trans )
      ? "Error:", trans, FBError( trans )
   ELSE
      ? "Status Execute: ", tmp := FBExecute( db, 'insert into customer(customer) values ("test 1")', nDialect, trans ), FBError( tmp )
      ? "Status Rollback: ", tmp := FBRollback( trans ), FBError( tmp )
   ENDIF

   trans := FBStartTransaction( db )
   IF ISNUMBER( trans )
      ? "Error:", trans, FBError( trans )
   ELSE
      ? "Status Execute: ", tmp := FBExecute( db, 'insert into customer(customer) values ("test 2")', nDialect, trans ), FBError( tmp )
      ? "Status Commit: ", tmp := FBCommit( trans ), FBError( tmp )
   ENDIF

   ? "Status Execute: ", tmp := FBExecute( db, 'insert into customer(customer) values ("test 3")', nDialect ), FBError( tmp )

   // FIX WINDOWS GPF BELOW

   qry := FBQuery( db, "SELECT * FROM customer", nDialect )
   IF ISNUMBER( qry )
      ? "Error:", qry, FBError( qry )
   ELSE
      num_cols := qry[ 4 ]
      columns := qry[ 6 ]

      FOR x := 1 TO num_cols
         ? x, "> "
         FOR y := 1 TO Len( columns[ x ] )
            ?? columns[ x, y ], " "
         NEXT
      NEXT

      ? "---"

      DO WHILE ( fetch_stat := FBFetch( qry ) ) == 0
         ? fetch_stat
         FOR x := 1 TO num_cols
            ?? FBGetData( qry, x ), ", "
         NEXT
      ENDDO

      ? "Fetch code:", fetch_stat

      ? "Status Free Query: ", FBFree( qry )
   ENDIF

   /* Close connection with rdbms */
   ? "Status Close Database: ", tmp := FBClose( db ), FBError( tmp )

   RETURN
Eu não uso esse banco de dados.

Saudações,
Itamar M. Lins Jr.
Saudações,
Itamar M. Lins Jr.
Responder