Clipper On Line • Ver Tópico - Firebird

Firebird

Discussão sobre SQL

Moderador: Moderadores

 

Firebird

Mensagempor Vlademiro » 18 Jul 2020 02:44

Na verdade o banco já era UTF8

Vou deixar aqui a solução para registro :

    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
Avatar de usuário

Vlademiro
Usuário Nível 4

Usuário Nível 4
 
Mensagens: 749
Data de registro: 11 Jul 2005 02:46
Curtiu: 22 vezes
Mens.Curtidas: 62 vezes

Firebird

Mensagempor leandrolinauer » 18 Jul 2020 10:03

Bom dia a todos
Eu estou usando ao criar
      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
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)
leandrolinauer
Usuário Nível 3

Usuário Nível 3
 
Mensagens: 375
Data de registro: 16 Out 2006 10:59
Cidade/Estado: Paranaíba-MS
Curtiu: 0 vez
Mens.Curtidas: 12 vezes

Firebird

Mensagempor RamonXHB » 18 Jul 2020 11:11

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
Avatar de usuário

RamonXHB
Usuário Nível 3

Usuário Nível 3
 
Mensagens: 152
Data de registro: 03 Mar 2007 14:55
Curtiu: 10 vezes
Mens.Curtidas: 3 vezes

Firebird

Mensagempor leandrolinauer » 20 Jul 2020 09:40

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)
leandrolinauer
Usuário Nível 3

Usuário Nível 3
 
Mensagens: 375
Data de registro: 16 Out 2006 10:59
Cidade/Estado: Paranaíba-MS
Curtiu: 0 vez
Mens.Curtidas: 12 vezes

Firebird

Mensagempor Vlademiro » 20 Jul 2020 11:43

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)
#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)

#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 69 vezes
Avatar de usuário

Vlademiro
Usuário Nível 4

Usuário Nível 4
 
Mensagens: 749
Data de registro: 11 Jul 2005 02:46
Curtiu: 22 vezes
Mens.Curtidas: 62 vezes

Firebird

Mensagempor leandrolinauer » 20 Jul 2020 11:52

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)
leandrolinauer
Usuário Nível 3

Usuário Nível 3
 
Mensagens: 375
Data de registro: 16 Out 2006 10:59
Cidade/Estado: Paranaíba-MS
Curtiu: 0 vez
Mens.Curtidas: 12 vezes

Firebird

Mensagempor Vlademiro » 20 Jul 2020 12:31

Troca por integer, vc não está usando casas decimais.
Avatar de usuário

Vlademiro
Usuário Nível 4

Usuário Nível 4
 
Mensagens: 749
Data de registro: 11 Jul 2005 02:46
Curtiu: 22 vezes
Mens.Curtidas: 62 vezes

Firebird

Mensagempor Vlademiro » 20 Jul 2020 12:34

Nas versões mais atuais do banco aceita até 34 dígitos nesse tipo de dado.
Avatar de usuário

Vlademiro
Usuário Nível 4

Usuário Nível 4
 
Mensagens: 749
Data de registro: 11 Jul 2005 02:46
Curtiu: 22 vezes
Mens.Curtidas: 62 vezes

Firebird

Mensagempor leandrolinauer » 20 Jul 2020 15:55

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)
leandrolinauer
Usuário Nível 3

Usuário Nível 3
 
Mensagens: 375
Data de registro: 16 Out 2006 10:59
Cidade/Estado: Paranaíba-MS
Curtiu: 0 vez
Mens.Curtidas: 12 vezes

Firebird

Mensagempor Poka » 29 Jul 2020 11:11

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 de usuário

Poka
Usuário Nível 4

Usuário Nível 4
 
Mensagens: 513
Data de registro: 25 Out 2004 21:26
Cidade/Estado: Leme/SP
Curtiu: 0 vez
Mens.Curtidas: 23 vezes

Firebird

Mensagempor Vlademiro » 29 Jul 2020 14:06

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 de usuário

Vlademiro
Usuário Nível 4

Usuário Nível 4
 
Mensagens: 749
Data de registro: 11 Jul 2005 02:46
Curtiu: 22 vezes
Mens.Curtidas: 62 vezes

Firebird

Mensagempor momente » 07 Mai 2021 17:10

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
Avatar de usuário

momente
Usuário Nível 3

Usuário Nível 3
 
Mensagens: 496
Data de registro: 03 Mar 2005 11:53
Cidade/Estado: São Carlos-SP
Curtiu: 0 vez
Mens.Curtidas: 0 vez

Firebird

Mensagempor alxsts » 08 Mai 2021 00:09

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)
alxsts
Colaborador

Colaborador
 
Mensagens: 2945
Data de registro: 12 Ago 2008 15:50
Cidade/Estado: São Paulo-SP-Brasil
Curtiu: 21 vezes
Mens.Curtidas: 248 vezes

Firebird

Mensagempor JoséQuintas » 08 Mai 2021 11:05

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:

   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:

   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, multithread, dbfcdx, ADO+MySql, PNotepad
"The world is full of kings and queens, who blind our eyes and steal our dreams Its Heaven and Hell"

https://github.com/JoseQuintas/
Avatar de usuário

JoséQuintas
Membro Master

Membro Master
 
Mensagens: 18150
Data de registro: 26 Fev 2007 11:59
Cidade/Estado: São Paulo-SP
Curtiu: 15 vezes
Mens.Curtidas: 1215 vezes

Anterior



Retornar para SQL

Quem está online

Usuários vendo este fórum: Nenhum usuário registrado online e 8 visitantes


Ola Amigo, espero que meu site e forum tem lhe beneficiado, com exemplos e dicas de programacao.
Entao divulgue o link da Doacao abaixo para seus amigos e redes sociais ou faça uma doacao para o site forum...
MUITO OBRIGADO PELA SUA DOACAO!
Faça uma doação para o forum
cron
v
Olá visitante, seja bem-vindo ao Fórum Clipper On Line!
Efetue o seu login ou faça o seu Registro