Firebird

Forum sobre SQL.

Moderador: Moderadores

Avatar do usuário
Vlademiro
Usuário Nível 4
Usuário Nível 4
Mensagens: 752
Registrado em: 11 Jul 2005 02:46

Firebird

Mensagem por Vlademiro »

Na verdade o banco já era UTF8

Vou deixar aqui a solução para registro :

Código: Selecionar todos

    LOCAL cString := 'DRIVER=Firebird/InterBase(r) driver;UID='+cLogin+';PWD='+cPwd+';DBNAME='+cDataBase+';'
    cString += "Dialect=3;Charset=UTF8;"
Precisa informar que é UTF8 na string de conexão
leandrolinauer
Usuário Nível 3
Usuário Nível 3
Mensagens: 413
Registrado em: 16 Out 2006 10:59
Localização: Paranaíba-MS

Firebird

Mensagem por leandrolinauer »

Bom dia a todos
Eu estou usando ao criar

Código: Selecionar todos

      FBCreateDB( oSQL_DataBase, oSQL_Login, oSQL_Pwd, oSQL_nPageSize, oSQL_cCharSet, oSQL_nDialect ) // precisa hbfbird.lib
Onde oSQL_cCharSet eu passo "win1252", não testei com acentos, vou fazer.

Quanto a gravar dados que antes estava com problemas, consegui resolver com exemplos obtidos dos colegas e adaptei para meu uso.
Segue o codigo abaixo

Código: Selecionar todos

Procedure ImportaDBF_SQL(o_TableDBF,o_TableSQL)
Local _erro:=""
ShowWait(,,"Importando dados da tabela DBF: ( "+o_TableDBF+" ), para a tabela SQL: ( "+o_TableSQL+" )...")
w_vTXT:=""

   &o_TableDBF.->(DbGoTop())
   e_TableDBF := &o_TableDBF.->(DbStruct()) //pega a estrutura dbf
   o_LastRec  := AllTrim(Str(&o_TableDBF.->(LastRec()),10))
   wSaida:=.F.
   While &o_TableDBF.->(!Eof()) .And. wSaida=.F.
         w_vTXT  := "Registro ( "+AllTrim(Str(&o_TableDBF.->(RecNo()),10))+" ) de ( "+o_LastRec+" )..."
         ShowWaitProc()
         wSaida := ExitSeek()
         StrSql := MyImport_DBF_SQL(o_TableDBF,e_TableDBF,o_TableSQL)
         If !Empty(oSQL_CnnDB) .And. Empty( _erro:= FB_executa())
            //se nao deu erro, apaga o registro na tabela dbf
            While &o_TableDBF.->(!RLock())
                Showmessage(,,"Registro em uso, solicite liberação do mesmo...",1)
            End
            &o_TableDBF.->(DbDelete())
            &o_TableDBF.->(DbCommit())
            &o_TableDBF.->(DbUnLock())
         Else
            //gerar uym log do sql erro
   Exit
         EndIf
         &o_TableDBF.->(DbSkip(1))
   End

CloseWindow()
Return .T.

Static Function MyImport_DBF_SQL(o_TableDBF,e_TableDBF,o_TableSQL) //monta o strsql
Local iS,o_Field,oStrSql:="insert into "+o_TableSQL,oStrSqlF:="(",oStrSqlV:="("
For iS:= 1 To Len(e_TableDBF)
    ShowWaitProc()
    o_Field := e_TableDBF[iS,1]
    oStrSqlF += e_TableDBF[iS,1] + If(iS=Len(e_TableDBF),")",",")
    oStrSqlV += DB_SQLValue(&o_TableDBF.->&o_Field.) + If(iS=Len(e_TableDBF),")",",")
Next
Return oStrSql+=oStrSqlF + " values "+oStrSqlV

Static Function DB_SQLValue(oSQL) //modifica os dados de acordo com o sql validando o retorno, colaboração dos colegas
Do Case
   Case ValType(oSQL)=="N"
        oSQL:=LTrim(Str(oSQL))
   Case ValType(oSQL)=="L"
        If( oSQL , oSQL:= "1" , oSQL:= "0")
   Case ValType(oSQL)=="D"
        If(Empty( oSQL ) , oSQL:= "NULL", oSQL:= ['] + Transform(DtoS(oSQL),"@R 9999-99-99" ) + ['])
   Case ValType(oSQL)=="C"
        If(Empty( oSQL ) , oSQL:= "NULL", oSQL:= ['] + StrTran(upper(oSQL),"'"," ") + ['])
   Otherwise
        oSQL:= "NULL"
EndCase
Return oSQL
com estas funções eu consigo importar minha tabela DBF para SQL sem dor de cabeça, agora pretendo fazer algo para importar de tabelas diferentes de terceiros, as quais serão os nomes dos campos diferentes e nem tudo seria importado, bora quebrar a cabeça.

Grato a todos.
Obs: estou usando HBFibird até agora sem problemas, em algum momento ela poderia me deixar na mão?
Harbour 3.2 + GtWVW + QT + SQLite3 + DBF + SQL (Firebird)
Avatar do usuário
RamonXHB
Usuário Nível 3
Usuário Nível 3
Mensagens: 159
Registrado em: 03 Mar 2007 14:55

Firebird

Mensagem por RamonXHB »

Entendo que, com as alterações que o banco está sofrendo, inclusive em termos de estrutura interna, poderia ocorrer um momento em que essa lib pare de funcionar, por falta de adequação às modificações introduzidas no banco.

E como aparentemente ninguém está mantendo essa biblioteca, para que possamos conversar com um mantenedor, para nos dar apoio e direcionamentos em caso de necessidade, poderia chegar em um ponto onde ela não atenda a necessidade, e aí estaríamos em um beco sem saida.

Seria interessante ter no Harbour algo como o componente Zeos, do Delphi/Lazarus, onde você informa ao componente o banco de dados usado, a biblioteca do banco, no nosso caso a fbclient.dll, e o componente cuida do resto.

No caso do Zeos, mudou o banco, você troca a biblioteca e o banco no componente, e tudo pronto, salvo alguma alteração ou outra na escrita dos comandos sql.

Infelizmente no nosso caso, usar libs como essa do firebird, do mysql ou do postgresql, nos deixam presos ao banco, posteriormente.

O que nos aproxima do comportamento do Zeos, seria o uso do ODBC/ADODB/SQLMIX.

Imagine um cliente novo, depois de uma bela demonstração de nosso sistema, lhe perguntar:

Achamos ótimo seu sistema, atende nossas necessidades, mas ele roda em SQLSERVER ???

Se foi feito em libs específicas como em nosso tópico, qual seria a nossa resposta ?

Entendo isso como algo a se pensar, se estamos desenvolvendo algo do zero, migrando de DBF.
Ramon A. Körber Jr.
Harbour 3.2 MiniGUI Extended Edition
xDevStudio v0.70 - BCC 5.82 - Lazarus FreePascal
Firebird
AdoDB - ODBC
Windows - Linux
Linux User Number 404280
MSN - ramon15061959@hotmail.com
Skype - ramon15061959
ICQ - UIN 82580595
leandrolinauer
Usuário Nível 3
Usuário Nível 3
Mensagens: 413
Registrado em: 16 Out 2006 10:59
Localização: Paranaíba-MS

Firebird

Mensagem por leandrolinauer »

Realmente o bom é termos como optar por varios tipos sem dor de cabeça, mas como não consegui funcionar ADO, e tbem nem tentei outra coisa, acabei optando pelo HBFbird por ter dado resultados imediatos e até agora esta funcionando para o que eu preciso, claro, não sei nada de SQL, estou aprendendo agora.
Como este projeto apenas estou migrando de DBF para SQL, pretendo seguir com ele fixo, mas já estou iniciando um projeto novo do zero com HBQT e nele já pretendo de cara somente SQL, aí já entra a possibilidade de ficar com algo flexivel para poder usar qualquer banco.
Quando eu terminar de migrar este atual sistema o qual darei descontinuidade a ele, vou estudar mais a fundo o mundo SQL, e tbem já iniciei estudo em JAVAWEB fulstack, e de cara já me apaixonei por este mundo, não estou nem 6% do que é o curso, mas assim que sobrar tempo irei de vez para javaweb.

Grato a todos
Harbour 3.2 + GtWVW + QT + SQLite3 + DBF + SQL (Firebird)
Avatar do usuário
Vlademiro
Usuário Nível 4
Usuário Nível 4
Mensagens: 752
Registrado em: 11 Jul 2005 02:46

Firebird

Mensagem por Vlademiro »

Segue alguns exemplos de uso com ADO (Serve para outros bancos também)

Para que eles funcionem precisa do Driver de ODBC instalado.

Percorrendo a tabela (tem que criar dois objetos, o oCn (Para se conectar ao banco) e o oRs (RecordSet que armazena o retorno do select)

Código: Selecionar todos

#include "adodb.ch"
    
Function Main

   LOCAL oRs , oCn, cSql
   LOCAL cUsername := "SYSDBA"
   LOCAL cPassWord := "masterkey"
   LOCAL cDatabase := hb_Dirbase() + "sistemas33.fdb"
   LOCAL cDb := "Driver=Firebird/InterBase(r) driver;Uid=" + cUserName + ";Pwd=" + cPassword + ";DbName=" + cDataBase + ";" 

   //oCn := TOleauto():New('ADODB.Connection') // Classe usada por xHarbour. Exige xhb.hbc para compilar
   oCn := win_oleCreateObject( "ADODB.Connection" ) 
   oCn:ConnectionString := cDb
   oCn:Open()


	oRs := win_oleCreateObject( "ADODB.Recordset" ) 
	//oRs := TOleAuto():New('ADODB.Recordset') // Classe usada por xHarbour. Exige xhb.hbc para compilar
	oRs:CursorLocation = adUseClient
	oRs:Open( "SELECT * FROM emp", oCn , adOpenDynamic, adLockOptimistic )
	if oCn:State = adStateClose
		? ('Failed open table EMP')
		Return
	Endif
	if oRs:recordcount > 0
		oRs:Movefirst()
		do while !oRs:eof()
			? oRs:fields("ename"):value
			oRs:movenext()
		enddo
		oRs:Movefirst() // Opcional, retorna para o primeiro registro
	endif

    RETURN NIL
Agora realizando uma inserção (poderia ser alteração ou qualquer outro comando)

Código: Selecionar todos


#define adOpenForwardOnly 0
#define adOpenKeyset 1
#define adOpenDynamic 2
#define adOpenStatic 3
#define adLockReadOnly 1
#define adLockPessimistic 2
#define adLockOptimistic 3
#define adLockBatchOptimistic 4
#define adUseNone 1
#define adUseServer 2
#define adUseClient 3

PROCEDURE MAIN()


   LOCAL oRs , oCn, cSql
   LOCAL cUsername := "SYSDBA"
   LOCAL cPassWord := "masterkey"
   LOCAL cDatabase := hb_Dirbase() + "sistemas33.fdb"
   LOCAL cDb := "Driver=Firebird/InterBase(r) driver;Uid=" + cUserName + ";Pwd=" + cPassword + ";DbName=" + cDataBase + ";" 

   oCn := win_oleCreateObject( "ADODB.Connection" )
   oCn:ConnectionString := cDb
   oCn:Open()

   
   //oRs := win_oleCreateObject("ADODB.RecordSet")
   cSql := "INSERT INTO emp ( empno, ename ) VALUES ( 122 , 'NOVO NOME' )"
   
   ? "Execute : " , oCn:Execute( cSql )
   oCn:Close()
   
   RETURN
O arquivo adodb.ch usado está no anexo junto com os exemplos
adofirebird.zip
(53.38 KiB) Baixado 364 vezes
leandrolinauer
Usuário Nível 3
Usuário Nível 3
Mensagens: 413
Registrado em: 16 Out 2006 10:59
Localização: Paranaíba-MS

Firebird

Mensagem por leandrolinauer »

Bom dia
Preciso de uma informação sobre o erro abaixo:
"
Error HY000 - [ODBC Firebird Driver][Firebird]Dynamic SQL Error
SQL error code = -842
Precision must be from 1 to 18 String SQL: alter table TB_COLABORADOR add CRED_MD5 numeric(032,0)
"
O firebird não aceita campo numerico maior que 18?

Grato
Harbour 3.2 + GtWVW + QT + SQLite3 + DBF + SQL (Firebird)
Avatar do usuário
Vlademiro
Usuário Nível 4
Usuário Nível 4
Mensagens: 752
Registrado em: 11 Jul 2005 02:46

Firebird

Mensagem por Vlademiro »

Troca por integer, vc não está usando casas decimais.
Avatar do usuário
Vlademiro
Usuário Nível 4
Usuário Nível 4
Mensagens: 752
Registrado em: 11 Jul 2005 02:46

Firebird

Mensagem por Vlademiro »

Nas versões mais atuais do banco aceita até 34 dígitos nesse tipo de dado.
leandrolinauer
Usuário Nível 3
Usuário Nível 3
Mensagens: 413
Registrado em: 16 Out 2006 10:59
Localização: Paranaíba-MS

Firebird

Mensagem por leandrolinauer »

Boa tarde, estou usando a versao 2.5, creio que seja bem atual.
vou trocar por string, visto que será melhor para formar uma chave md5
Valeu
Harbour 3.2 + GtWVW + QT + SQLite3 + DBF + SQL (Firebird)
Avatar do usuário
Poka
Usuário Nível 4
Usuário Nível 4
Mensagens: 563
Registrado em: 25 Out 2004 21:26
Localização: Leme/SP

Firebird

Mensagem por Poka »

Olá

Leandro escreveu
Onde oSQL_cCharSet eu passo "win1252", não testei com acentos, vou fazer.
acho que não vai dar certo, terá que colocar COLLATE WIN_PTBR em todos os selects.

já uso o firebird normal criando o banco no sistema sem problemas. mas não queria ficar colocando collate em todas as rotinas.
Me parece que se criar o banco com esse collate fica automático.

crio o banco com hbfbird.lib

minha pergunta, tem como criar com esse comando o incluindo esse collate?
minhas tentativas:
FBCreateDB( cServer + xBanco, cUser, cPass, nPageSize, cCharSet, nDialect )
já uso , mas tem que colcoar esse collate em todas as pesquisas


FBCreateDB( cServer + xBanco, cUser, cPass, nPageSize, cCollate, nDialect )
cria o banco mas nao consigo criar as tabelas
FBCreateDB( cServer + xBanco, cUser, cPass, nPageSize,cCharset, cCollate, nDialect )
não cria o banco

Alguém tem alguma solução?

Poka
Avatar do usuário
Vlademiro
Usuário Nível 4
Usuário Nível 4
Mensagens: 752
Registrado em: 11 Jul 2005 02:46

Firebird

Mensagem por Vlademiro »

Sou novo em Firebird, mas vi que dá pra fazer muita coisa configurando o colate nas colunas. Por exemplo: criei um banco usando o utf8, depois senti a necessidade de pesquisar sem fazer distinção entre maiúscula e minúscula, daí alterei a nível de campo para colate unicodeci (ci de case ibsensitive), a partir daí as pesquisas ignoram. No seu caso, já tentou alterar a nível de coluna ? Como seu banco está configurado ?
Avatar do usuário
momente
Usuário Nível 3
Usuário Nível 3
Mensagens: 496
Registrado em: 03 Mar 2005 11:53
Localização: São Carlos-SP
Contato:

Firebird

Mensagem por momente »

Amigos,

Eu precisaria utilizar com Paradox, alguém teria a string pra ele com o password padrão (cupcdvum)

Por gentileza

Obrigado!
Rogerio L. Momenté
Nada é tão perfeito que não possamos melhorar.
Nunca se explique. Seus amigos não precisam e seus inimigos não vão acreditar.
www.looksystem.com.br
alxsts
Colaborador
Colaborador
Mensagens: 3092
Registrado em: 12 Ago 2008 15:50
Localização: São Paulo-SP-Brasil

Firebird

Mensagem por alxsts »

Olá!

No site connectionstrings.com tem conexão para quase tudo. Faça uma pesquisa lá, na página do Paradox. Boa sorte.
[]´s
Alexandre Santos (AlxSts)
Avatar do usuário
JoséQuintas
Administrador
Administrador
Mensagens: 20267
Registrado em: 26 Fev 2007 11:59
Localização: São Paulo-SP

Firebird

Mensagem por JoséQuintas »

Vlademiro escreveu:Percorrendo a tabela (tem que criar dois objetos, o oCn (Para se conectar ao banco) e o oRs (RecordSet que armazena o retorno do select)
Pequena correção:
No Visual Basic 6 precisa dos dois, porque precisa definir o tipo de variável.
No Harbour basta a conexao.

O que mostrou:

Código: Selecionar todos

   oRs := win_oleCreateObject( "ADODB.Recordset" ) 
   oRs:CursorLocation = adUseClient
   oRs:Open( "SELECT * FROM emp", oCn , adOpenDynamic, adLockOptimistic )
   if oCn:State = adStateClose
      ? ('Failed open table EMP')
      Return
   Endif
o que uso desde o começo:

Código: Selecionar todos

   oRs := oCn:Execute( "SELECT * FROM emp" )
Vai poder fazer uma boa limpeza nos fontes.

Nota:
do jeito que fez, seria pra poder alterar a consulta, continuando vinculado ao servidor e até permitindo LOCK.
Se o recordset for somente leitura, basta este último.
A conexão continua livre pra enviar qualquer comando de leitura/gravação.
José M. C. Quintas
Harbour 3.2, mingw, gtwvg mt, fivewin 25.04, multithread, dbfcdx, MySQL, ADOClass, PDFClass, SefazClass, (hwgui mt), (hmg3), (hmg extended), (oohg), PNotepad, ASP, stored procedure, stored function, Linux (Flagship/harbour 3.2)
"The world is full of kings and queens, who blind our eyes and steal our dreams Its Heaven and Hell"

https://github.com/JoseQuintas/
Responder