Clipper On Line • Ver Tópico - HBDBD x ADO

HBDBD x ADO

Discussão sobre Banco de Dados e RDDs para Clipper/[x]Harbour.

Moderador: Moderadores

 

HBDBD x ADO

Mensagempor Ranier » 08 Set 2019 10:06

JoséQuintas escreveu:Fico imaginando se a RDDSQL ou similares tiram proveito disso ao trabalhar igual DBF....


Com a DBDRDD a resposta é sim, com certeza, porquê apesar de usar a api dbfcdx, ela funciona
nos bastidores, somente com SQL, e trabalha com qualquer banco de dados (PostgreSQL, MySQL, sqlite, etc).
Ai o tamanho final, vai depender das características de cada banco e de como está estruturada a tabela.
E tem uma grande vantagem a função dbQuery(), onde se pode fazer uma query específica e limitada, como:
"Select ID, Nome From Clientes Order By Nome;"
E retornar um dataset compacto, de toda a tabela e utilizar normalmente como se fosse dbf.
sSQL := "SELECT ID, Nome FROM Clientes Order By Nome;"
DBQuery("c:\usr\src\dbdrdd\tests\clientes.ini", "DBDRDD", sSQL, "table1")
While(!Eof())
    ? table1->Nome
    Skip
Enddo
Nota de Moderação:
JoséQuintas: O presente tópico foi dividido, uma vez que seu conteúdo desviou o assunto anterior/
Ranier
Usuário Nível 2

Usuário Nível 2
 
Mensagens: 80
Data de registro: 02 Abr 2019 09:01
Cidade/Estado: Goiania/Goias
Curtiu: 0 vez
Mens.Curtidas: 9 vezes

DBF pra MySQL

Mensagempor JoséQuintas » 08 Set 2019 22:06

Pois é... usando a RDD o usuário não vai aprender nada de SQL, vai usar somente o que tiver sido definido pra uso.
E como o usuário não vai aprender nada de SQL... nem vai saber se está sendo enganado, ou se vai ficar eternamente preso a alguma coisa.

Só lembrando:
o Harbour tem isso pronto.
E o que está sendo mostrado como vantagem.... é o básico do básico do básico, só quem não usa SQL não sabe disso.
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: 18008
Data de registro: 26 Fev 2007 11:59
Cidade/Estado: São Paulo-SP
Curtiu: 15 vezes
Mens.Curtidas: 1206 vezes

DBF pra MySQL

Mensagempor Ranier » 08 Set 2019 23:50

"Pois é... usando a RDD o usuário não vai aprender nada de SQL, vai usar somente o que tiver sido definido pra uso.
E como o usuário não vai aprender nada de SQL... nem vai saber se está sendo enganado, ou se vai ficar eternamente preso a alguma coisa."
Desculpa, não entendi, ser enganado como?
Essa RDD é bem clara, emula o funcionamento do DBFCDX, mas acessando SGDB, não tem um único DBF local.
Como você acha que os dados não estariam sendo gravados/lidos do SGDB?
Ela foi criada especificamente para um propósito, facilitar a migração de DBF para SQL, para quem ainda
não teve tempo de fazer e repito, não utiliza nada mais de DBF além da API.

"Só lembrando:
o Harbour tem isso pronto.
E o que está sendo mostrado como vantagem.... é o básico do básico do básico, só quem não usa SQL não sabe disso."
Já é um começo, para quem está iniciando do SQL, poder utilizar algumas queries, ir aos poucos, fazendo a migração.
Como no Harbour, você consegue migrar todos seus DBFs para Banco de Dados e continuar a usar as mesmas rotinas e funções, praticamente, sem mudar uma linha, a não ser o nome do arquivo a ser aberto?

Agora, se quiser voar e usar todo o poder do SQL em Harbour, temos a HBDBD, essa sim, é para quem quer migrar tudo para SQL e poder acessar, qualquer SGDB em Harbour.
tamanho atual: 167kb
Ansi C
Bancos Atuais: PostgreSQL, MySQL, SQLite

Mas, usando a HBDBD, tem que mudar a forma de trabalhar com seus dados. Não teria mais REPLACE, somente queries como INSERT and UPDATE, sem qualquer filtro ou facilidade para compatibilizar entre os bancos.
Explicando, o desenvolvedor monta sua instrução SQL e é responsável por ela funcionar junto ao SGDB.

Um exemplo:
hDBD := DBD_NEW(0)
If ( hDBD == NIL )
   Return 1
Endif
nRET := DBD_OPEN( hDBD, sCONN )
If ( nRET != 0 )
   Return 2
Endif
aROW := DBD_FIELDS_ARRAY( hDBD, "table1" )

sSQL := "INSERT INTO table1 (codig, name, datecreate, active) VALUES ($1, $2, $3, $4);"
hDBD_PREP := DBD_PREPARE_NEW( hDBD, sSQL, "insert_table1", 4)
If ( hDBD_PREP != NIL )
   aROW[1] := NIL // Pula _dbd_id
   aROW[2] := 1
   aROW[3] := "TESTE1"
   aROW[4] := CtoD("31/12/2019")
   aROW[5] := "Y"
   aROW[6] := NIL
   aROW[7] := NIL
   DBD_BIND_ARRAY( hDBD, hDBD_PREP, aROW )
   nRET := DBD_PEXEC( hDBD, hDBD_PREP, aROW )
   If ( nRET != 0 )
      HB_Alert( "ERRO PEXEC: " + DBD_STRERROR( HDBD ))
   Endif
   aROW[1] := DBD_LAST_UID( hDBD, "table1", "_dbd_uid" )
Endif

sSQL := "INSERT INTO table1 (codig, name, datecreate, active, notes) VALUES " + ;
        "(3, 'JÕAO DIAS E IRMÃOS', '2019-12-31', 'Y', 'TESTE3')"
nRET := DBD_EXEC( hDBD, sSQL )
If ( nRET != 0 )
   HB_Alert( "ERRO INSERT: " + DBD_STRERROR( HDBD ))
Endif

sSQL := "SELECT * FROM table1;"
hDBD_RES := DBD_QUERY( hDBD, sSQL )
If ( hDBD_RES == NIL )
   HB_Alert( "FALHA NO ACESSO AO BANCO DE DADOS!" )
   QUIT
Endif

nROWS := DBD_RES_NROWS( hDBD, hDBD_RES )
? "Numero de linhas: " + Str( nROWS, 8 )

hDBD_ROW := DBD_FETCH_ROW( hDBD, hDBD_RES )
If ( hDBD_ROW != NIL )
   aROW := DBD_ROW_ARRAY( hDBD, hDBD_ROW )
   DBD_ROW_DESTROY( hDBD_ROW )
Endif

DBD_RES_DESTROY( hDBD, hDBD_RES )
DBD_DESTROY( hDBD )
Ranier
Usuário Nível 2

Usuário Nível 2
 
Mensagens: 80
Data de registro: 02 Abr 2019 09:01
Cidade/Estado: Goiania/Goias
Curtiu: 0 vez
Mens.Curtidas: 9 vezes

DBF pra MySQL

Mensagempor JoséQuintas » 09 Set 2019 08:42

GRANDE LIXO !!!!

É MUITO PIOR DO QUE EU DISSE ANTES: ISSO É JOGAR TODOS OS FONTES NO LIXO

ISSO É PRA USUÁRIO DESISTIR DE SQL.

É SÉRIO QUE TÁ OFERECENDO ESSE LIXO?
OU SÓ QUER ESTRAGAR O TÓPICO PRA CONFUNDIR QUEM QUERIA APRENDER????

É POR GENTE ASSIM QUE O MUNDO XBASE TÁ UMA MERD.
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: 18008
Data de registro: 26 Fev 2007 11:59
Cidade/Estado: São Paulo-SP
Curtiu: 15 vezes
Mens.Curtidas: 1206 vezes

DBF pra MySQL

Mensagempor JoséQuintas » 09 Set 2019 10:29

Comparem o fonte anterior com o uso do ADO.

Criar conexão:

oConexao := win_OleCreateObject( "ADODB.Connection" )
oConexao:ConnectionString := "ksddkfdskfhkdshfkjdshkdhksjfhd"


Buscar informações:

oTemporario := oConexao:Execute( "SELECT CODIGO, NOME FROM CLIENTES ORDER BY NOME"
DO WHILE ! oTemporario:Eof()
   ? oTemporario:Fields( "CODIGO" ):Value
   ? oTemporario:Fields( "NOME" ):Value
   ? oTemporario:MoveNext()
ENDDO
oTemporario:Close()


Incluir:

oConexao:Execute( "INSERT INTO CLIENTES ( CODIGO, NOME ) VALUES ( 10, 'TESTE' )" )


alterar:

oConexao:Execute( "UPDATE CLIENTES SETCODIGO=11, NOME='novo teste' WHERE CODIGO=10" )


excluir:

oConexao:Execute( "DELETE FROM CLIENTES WHERE CODIGO=10" )


criar tabela (comando parcial):

oConexao:Execute( "CREATE TABLE CLIENTES ( CODIGO INT(11) INCREMENTAL, NOME VARCHAR(50) )" )


Como eu já disse antes, se quer aprender a trabalhar com SQL use ADO.
Não precisa aprender quase nada, vai se concentrar exatamente no SQL/MySQL, que é o que interessa.
Se depois de alguns testes quiser usar uma RDD ou qualquer outro componente, vai ter conhecimento de como tudo funciona, ou pelo menos de como funcionam os comandos SQL.

ADO tem que reescrever tudo?
Na LIB apresentada, parece que o fonte fica uma merd... não se entende nada, e depois o fonte não serve pra nada.
Já com ADO... tudo vai ser aproveitado... até mesmo pra outra linguagem de programação.

É bom? é ruim?
Funciona.

Vai sair de DBF? o que precisa aprender?
Comandos SQL e a nova base de dados (MySQL, SQL Server, Firebird, etc)
Pronto... com ADO é exatamente nisso que vai trabalhar/aprender.
Se gostar do resultado: pode continuar com ADO, ou pode escolher uma RDD já sabendo de como tudo funciona.

O que é uma aplicação cliente/servidor?
É o computador cliente conversando com o computador servidor.
E o que o ADO faz: apenas facilita essa conversa: conversa direta entre o aplicativo e o servidor

Qual o objetivo de usar LIBs pra isso?
Facilitar a conversa, pra não precisar ficar mexendo nos fontes.
Não vi a LIB fazer nada disso, pelo contrário, só complicou, vai obrigar a aprender a LIB enquanto poderia estar aprendendo o que interessa.
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: 18008
Data de registro: 26 Fev 2007 11:59
Cidade/Estado: São Paulo-SP
Curtiu: 15 vezes
Mens.Curtidas: 1206 vezes

DBF pra MySQL

Mensagempor Ranier » 09 Set 2019 10:44

Lixo, é o seu código. Você não sabe porra nenhuma de programação. Piada né, para quem usa dbSkip(0) para fazer "commit", sem comentários.
E se o mundo xbase tá uma M****, não é por minha causa!

No mais, foda-se!
Ranier
Usuário Nível 2

Usuário Nível 2
 
Mensagens: 80
Data de registro: 02 Abr 2019 09:01
Cidade/Estado: Goiania/Goias
Curtiu: 0 vez
Mens.Curtidas: 9 vezes

DBF pra MySQL

Mensagempor JoséQuintas » 09 Set 2019 12:26

Ranier escreveu:Piada né, para quem usa dbSkip(0) para fazer "commit", sem comentários.


Sim, tem comentários.
Uso isso há anos, e nunca tive problema nenhum.
O Harbour é 100% compatível com Clipper, então continuar usando igual no Clipper é 100% de continuar funcionando.

ranier escreveu:A segunda, sempre crie um tópico novo para questionar a respeito de outro assunto, mesmo que relacionado,


Hummm.... não pode mudar o assunto pra letodbf, mas pra essa LIB pode....

Ranier escreveu:Você não sabe porra nenhuma de programação


Igual a todos aqui do fórum, tem coisas que sei e coisas que não sei, tem coisas que uso, e coisas que não uso.
Mas sei quando um fonte confunde tudo.

Mas se quiser, pode testar minha classe pra ADO.
Talvez goste dela, talvez não, o único jeito de saber é se testar, ou se der uma olhada.
Mas... NÃO precisa dela pra trabalhar com ADO, também corre o risco de desaprender com ela.
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: 18008
Data de registro: 26 Fev 2007 11:59
Cidade/Estado: São Paulo-SP
Curtiu: 15 vezes
Mens.Curtidas: 1206 vezes

DBF pra MySQL

Mensagempor JoséQuintas » 09 Set 2019 12:53

Uma dica pro seu fonte:

sSQL := "INSERT INTO table1 (codig, name, datecreate, active) VALUES ($1, $2, $3, $4);"
hDBD_PREP := DBD_PREPARE_NEW( hDBD, sSQL, "insert_table1", 4)
If ( hDBD_PREP != NIL )
   aROW[1] := NIL // Pula _dbd_id
   aROW[2] := 1
   aROW[3] := "TESTE1"
   aROW[4] := CtoD("31/12/2019")
   aROW[5] := "Y"
   aROW[6] := NIL
   aROW[7] := NIL
   DBD_BIND_ARRAY( hDBD, hDBD_PREP, aROW )
   nRET := DBD_PEXEC( hDBD, hDBD_PREP, aROW )
   If ( nRET != 0 )
      HB_Alert( "ERRO PEXEC: " + DBD_STRERROR( HDBD ))
   Endif
   aROW[1] := DBD_LAST_UID( hDBD, "table1", "_dbd_uid" )
Endif


Se adicionar/remover algum campo no banco de dados, o fonte já era, vai ser um grande problema fazer a correção de todos os locais que gravam alguma coisa.
Melhor fazer pelo nome.

         WITH OBJECT cnMySql
            :QueryCreate()
            :QueryAdd( "SFCNPJ",      cCnpj )
            :QueryAdd( "SFUF",        cUF )
            :QueryAdd( "SFINFINC",    LogInfo() )
            :QueryAdd( "SFCONSULTAR", "S" )
            :QueryExecuteInsert( "WEBCADFAZ" )
         END WITH


Dessa forma, mesmo que altere a estrutura, os fontes anteriores continuam funcionando.
O fonte da outra forma pode até ficar menor, mas depois pra manutenção..... vai ser complicado.
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: 18008
Data de registro: 26 Fev 2007 11:59
Cidade/Estado: São Paulo-SP
Curtiu: 15 vezes
Mens.Curtidas: 1206 vezes

DBF pra MySQL

Mensagempor Ranier » 09 Set 2019 18:54

"Hummm.... não pode mudar o assunto pra letodbf, mas pra essa LIB pode...."
"Fico imaginando se a RDDSQL ou similares tiram proveito disso ao trabalhar igual DBF...."
Foi você mesmo quem sugeriu a mudança de assunto...

"Comparem o fonte anterior com o uso do ADO."
Comparando sem qualquer tipo de verificação de erros, como está no exemplo em ADO.

Criar conexão:
hDBD := DBD_NEW(DBD_MYSQL_DRIVER)
DBD_OPEN( hDBD, sCONN )


Buscar informações:
#define FIELD_INDEX_CODIGO 1
#define FIELD_INDEX_NOME    2
hDBD_RES := DBD_QUERY( hDBD, "SELECT CODIGO, NOME FROM CLIENTES ORDER BY NOME" )
If ( hDBD_RES != NIL )
   While((hDBD_ROW := DBD_FETCH_ROW( hDBD, hDBD_RES )) != NIL)
        aROW := DBD_ROW_ARRAY( hDBD, hDBD_ROW )
        ? aROW[ FIELD_INDEX_NOME ]
   Enddo
Endif


Incluir:
DBD_EXEC( hDBD, "INSERT INTO CLIENTES ( CODIGO, NOME ) VALUES ( 10, 'TESTE' )" )


alterar:
DBD_EXEC( hDBD, "UPDATE CLIENTES SETCODIGO=11, NOME='novo teste' WHERE CODIGO=10" )


excluir:
DBD_EXEC( hDBD, "DELETE FROM CLIENTES WHERE CODIGO=10" )


criar tabela (comando parcial):
DBD_EXEC( hDBD, "CREATE TABLE CLIENTES ( CODIGO INT(11) INCREMENTAL, NOME VARCHAR(50) " )


"Como eu já disse antes, se quer aprender a trabalhar com SQL use ADO."
Para se trabalhar com SQL não precisa de ADO. ADO só roda no "ruindows", usa objetos OLE e parece-me que precisa de ODBC.
A HBDBD roda 100% nativo, usando comunicação direta, sem quaisquer traduções.
É multiplataforma, roda em Windows, Linux, FreeBSD, MacOS, enfim, onde se puder compilar um código 100%
ANSI C, até no Android. Foi feita para desempenho máximo, performance e é otimizada para usar somente recursos eficientes do Harbour, tais como arrays e variáveis simples, que são rápidos e leves, ocupando pouca memória.

"ADO tem que reescrever tudo?
Na LIB apresentada, parece que o fonte fica uma merd... não se entende nada, e depois o fonte não serve pra nada.
Já com ADO... tudo vai ser aproveitado... até mesmo pra outra linguagem de programação."
Se o código já funciona para DBF, então terá que ser reescrito para funcionar com SQL, tanto com ADO, como com a HBDBD, ou com qualquer outra lib ou RDD.

"Não vi a LIB fazer nada disso, pelo contrário, só complicou, vai obrigar a aprender a LIB enquanto poderia estar aprendendo o que interessa."
Acho que o meu exemplo pegou pesado. Realmente é muita coisa para se entender de uma vez só.
A parte complicada ali, se chama "PREPARED QUERIES".

sSQL := "INSERT INTO table1 (codig, name, datecreate, active) VALUES ($1, $2, $3, $4);"
hDBD_PREP := DBD_PREPARE_NEW( hDBD, sSQL, "insert_table1", 4)
If ( hDBD_PREP != NIL )
   aROW[1] := NIL // Pula _dbd_id
   aROW[2] := "TESTE1"
   aROW[3] := CtoD("31/12/2019")
   aROW[4] := "Y"
   DBD_BIND_ARRAY( hDBD, hDBD_PREP, aROW )
   DBD_PEXEC( hDBD, hDBD_PREP, aROW )
Endif


Ou assim:

sSQL := "INSERT INTO table1 (codig, name, datecreate, active) VALUES ($1, $2, $3, $4);"
hDBD_PREP := DBD_PREPARE_NEW( hDBD, sSQL, "insert_table1", 4)
If ( hDBD_PREP != NIL )
   aROW[1] := NIL // Pula _dbd_id
   aROW[2] := "TESTE1"
   aROW[3] := CtoD("31/12/2019")
   aROW[4] := "Y"

   DBD_BIND_ARRAY( hDBD, hDBD_PREP, aROW )
   DBD_PEXEC( hDBD, hDBD_PREP, aROW )

   aROW[2] := "TESTE2"
   aROW[3] := CtoD("31/12/2020")
   aROW[4] := "N"
   DBD_BIND_ARRAY( hDBD, hDBD_PREP, aROW )
   DBD_PEXEC( hDBD, hDBD_PREP, aROW )
Endif


Para quem não sabe, se não filtrar toda e quaisquer entradas vindas diretamente do usuário, corre-se o risco de uma injeção de SQL, permitindo coisas como ";DROP DATABASE dbNome;".
Nos exemplos acima, não tem como isso acontecer, porquê, não importa o que o usuário digitou e foi parar nas variáveis, o SGDB vai receber tudo escapado e controlado.

"Mas se quiser, pode testar minha classe pra ADO.
Talvez goste dela, talvez não, o único jeito de saber é se testar, ou se der uma olhada.
Mas... NÃO precisa dela pra trabalhar com ADO, também corre o risco de desaprender com ela."
Não preciso de ADO, utilizo comunicação direta, nativa, compilada e rodando a 1000%, que deixa qualquer conexão OLE no chinelo.

"Uma dica pro seu fonte:
Se adicionar/remover algum campo no banco de dados, o fonte já era, vai ser um grande problema fazer a correção de todos os locais que gravam alguma coisa.
Melhor fazer pelo nome."
Não obrigado. Mais overhead desnecessário. Prefiro usar constantes, que são extremamente rápidas e de fácil manutenção, basta localizá-las em um arquivo include ".ch":
#define FIELD_INDEX_UID 1
#define FIELD_INDEX_NAME 2
#define FIELD_INDEX_DATECREATE 3
#define FIELD_INDEX_ACTIVE 4

   aROW[FIELD_INDEX_UID] := NIL // Pula _dbd_id
   aROW[FIELD_INDEX_NAME] := 1
   aROW[FIELD_INDEX_DATECREATE] := CtoD("31/12/2019")
   aROW[FIELD_INDEX_ACTIVE] := "Y"
   DBD_BIND_ARRAY( hDBD, hDBD_PREP, aROW )


Para cada chamada QueryAdd( "SFCNPJ", cCnpj ), é feito um retrabalho absurdo para se localizar o campo pelo
nome. Como disse a lib é voltada para desempenho, performance, nada que possa criar lentidão desnecessária.

Enfim, não vejo nada de bom nessa ADO, somente desvantagens, só roda no ruindows, usa OLE, usa ODBC.

Pra usar HBDBD, terá que mexer no código, infelizmente sim. Terá que aprender algumas funções novas, infelizmente sim, mas são todas de fácil compreensão e não muda o conhecimento de SQL, pelo contrário, enfatizam a SQL.
Com ela têm-se acesso a múltiplos bancos de dados, utilizando-se SQL, com performance.

Agora poderia-se criar uma API SQL de Banco de Dados, que poderia ser seguida por todas as RDD, como existe para o DBF, seria ótimo e muito bom para os usuários, que poderiam criar um fonte somente e utilizar com qualquer lib, inclusive a HBDBD. Se essa API SQL for criada, certamente a HBDBD irá adotá-la, até lá, infelizmente, tenho que utilizar a API atual.
Ranier
Usuário Nível 2

Usuário Nível 2
 
Mensagens: 80
Data de registro: 02 Abr 2019 09:01
Cidade/Estado: Goiania/Goias
Curtiu: 0 vez
Mens.Curtidas: 9 vezes

DBF pra MySQL

Mensagempor JoséQuintas » 09 Set 2019 19:32

Ranier escreveu:Para cada chamada QueryAdd( "SFCNPJ", cCnpj ), é feito um retrabalho absurdo para se localizar o campo pelo
nome


No seu fonte está assim:
sSQL := "INSERT INTO table1 (codig, name, datecreate, active) VALUES ($1, $2, $3, $4);"

Tudo indica que substitui os parâmetros $n pelo elemento do array correspondente.

QueryAdd() é similar, e não faz nenhum trabalho absurdo, aliás, faz o mesmo trabalho que essa LIB deve fazer.

QueryAdd() apenas adiciona elementos a um array.
{ { "CODIGO", 10 }, ;
{ "NOME", "NOME" } }

QueryExecuteInsert() apenas transforma isso no comando SQL, igual sua LIB faz pra substituir os $n, e isso não é trabalho nenhum.

( CODIGO, NOME ) VALUES ( 10, 'NOME' )

Se for insert é assim, mas se for update, será assim:

SET CODIGO=10, NOME='NOME'

Trata-se apenas de facilitar a conferência por parte de quem vê o fonte.
Com array, teria que conferir elemento a elemento, pra ver se a ordem está certa.

Provavelmente na sua LIB, deve ter algo como:

FOR EACH xValue IN xValueList
   cSql := StrTran( "$" + LTrim( Str( xValue:__EnumIndex ) ), Converte( xValue ) )
NEXT


Pois é... seria o equivalente, mas montando a string do zero.
E usar "NOME" é mais visível de conferir do que [1], principalmente se existirem trocentos campos para serem atualizados.
Para o SQL tanto faz, ele vai receber a string nos dois casos.
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: 18008
Data de registro: 26 Fev 2007 11:59
Cidade/Estado: São Paulo-SP
Curtiu: 15 vezes
Mens.Curtidas: 1206 vezes

DBF pra MySQL

Mensagempor JoséQuintas » 09 Set 2019 19:47

Ranier escreveu:A HBDBD roda 100% nativo, usando comunicação direta, sem quaisquer traduções.
É multiplataforma, roda em Windows, Linux, FreeBSD, MacOS, enfim, onde se puder compilar um código 100%


Isso é interessante nos dois sentidos, mas vamos ao que interessa pra Windows:

O Windows tem suas particularidades com conexões.
- Não pode ficar abrindo/fechando toda hora, porque trava
- Não pode ficar parada muito tempo, senão fecha

Isso foi tratado para Windows?
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: 18008
Data de registro: 26 Fev 2007 11:59
Cidade/Estado: São Paulo-SP
Curtiu: 15 vezes
Mens.Curtidas: 1206 vezes

DBF pra MySQL

Mensagempor Ranier » 09 Set 2019 20:28

"Tudo indica que substitui os parâmetros $n pelo elemento do array correspondente.
QueryAdd() é similar, e não faz nenhum trabalho absurdo, aliás, faz o mesmo trabalho que essa LIB deve fazer.
QueryAdd() apenas adiciona elementos a um array.
{ { "CODIGO", 10 }, ;
{ "NOME", "NOME" } }
QueryExecuteInsert() apenas transforma isso no comando SQL, igual sua LIB faz pra substituir os $n, e isso não é trabalho nenhum."
Nesse ponto, não é igual, não é montado nenhuma string SQL internamente. A lib, nem sabe o nome do campo. Cada driver da lib (MySQL, PostgreSQL, Sqlite) trata da sua forma de "bindar" os parâmetros. A lib faz uma vinculação entre a array harbour para a estrutura interna em C.
Não corre-se o risco de sofrer uma injeção de SQL, porquê não é feita qualquer adição de strings.

"Pois é... seria o equivalente, mas montando a string do zero.
E usar "NOME" é mais visível de conferir do que [1], principalmente se existirem trocentos campos para serem atualizados. Para o SQL tanto faz, ele vai receber a string nos dois casos."
Acho que usar o nome de campo diretamente no código não é uma boa idéia, se tiver "trocentos" campos e trocentos arquivos prg. Com o arquivo include localizado, as alterações também ficam localizadas. Porém quem monta as strings
SQL, tem que manter os arquivos includes.
Se, adicionada, alguma forma de se usar variáveis com nomes de campos, teria que ser usado HASH.

"Isso é interessante nos dois sentidos, mas vamos ao que interessa pra Windows:
O Windows tem suas particularidades com conexões.
- Não pode ficar abrindo/fechando toda hora, porque trava
- Não pode ficar parada muito tempo, senão fecha
Isso foi tratado para Windows?"
Está em uso a quase 10 anos, a lib, em nossos próprios sistemas. Nunca tivemos qualquer problema com o windows.
Porém, não abrimos e fechamos a conexão a qualquer hora. E os usuários ficam o dia inteiro com o aplicativo aberto. Até na hora do almoço, quando deixam tudo ligado e aberto. Até hoje, nenhuma reclamação, nenhum problema relatado no suporte a respeito de conexões.
Mas realmente, quem trata da conexão é a lib de cada SGDB, no caso do PostgreSQL (libpq), no caso do Mysql (libmysql) e no caso da Sqlite (sqlite3.dll).
Pode-se inclusive, usar todas ao mesmo tempo, basta criar 3 variáveis e configurar as conexões e usar tudo ao mesmo tempo. Um exemplo poderia-se, importar dados do Sqlite para o Mysql, e vice-versa, mas acredito que com a ADO, também pode-se fazer isso.

Então:
"Não pode ficar abrindo/fechando toda hora, porque trava", nunca tivemos esse tipo de travamento, porquê os nossos sistemas, abrem a conexão no início do e fecham ao sair. Mas nada impede de se abrir/fechar a qualquer hora, acredito que não haverá travamento, porquê não se depende do Windows aki, mas sim da biblioteca do próprio SGDB, que são bem robustas e testadas ao extremo.

"Não pode ficar parada muito tempo, senão fecha", nunca ocorreu até agora, a conexão se mantém, não é necessária nenhuma configuração de baixo nível da conexão. A lib, não faz. Talvez as libs dos SGDB o façam. Não investiguei a fundo para saber 100%.

"Isso foi tratado para Windows?", a resposta é não, até hoje, nenhuma necessidade, nesse sentido.
Ranier
Usuário Nível 2

Usuário Nível 2
 
Mensagens: 80
Data de registro: 02 Abr 2019 09:01
Cidade/Estado: Goiania/Goias
Curtiu: 0 vez
Mens.Curtidas: 9 vezes

DBF pra MySQL

Mensagempor asimoes » 10 Set 2019 21:56

Usamos ADO com oracle e funciona perfeitamente.
►Harbour 3.x | Minigui xx-x | HwGui◄
Pense nas possibilidades abstraia as dificuldades.
Não corrigir nossas falhas é o mesmo que cometer novos erros.
A imaginação é mais importante que o conhecimento. (Albert Einstein)
Avatar de usuário

asimoes
Colaborador

Colaborador
 
Mensagens: 4919
Data de registro: 26 Abr 2007 16:48
Cidade/Estado: RIO DE JANEIRO-RJ
Curtiu: 341 vezes
Mens.Curtidas: 258 vezes

DBF pra MySQL

Mensagempor Itamar M. Lins Jr. » 12 Set 2019 09:19

Ola!
Jogar esse tópico no Bate-Papo por favor.
Tá muito confuso.

Saudações,
Itamar M. Lins Jr.
Avatar de usuário

Itamar M. Lins Jr.
Colaborador

Colaborador
 
Mensagens: 6927
Data de registro: 30 Mai 2007 11:31
Cidade/Estado: Ilheus Bahia
Curtiu: 309 vezes
Mens.Curtidas: 503 vezes

HBDBD x ADO

Mensagempor JoséQuintas » 14 Set 2019 20:28

Não sei se o título ficou adequado, mas acabou sendo comparação entre os dois acessos.
Apesar de não ser banco de dados, trata-se de acesso a banco de dados.
Citei o texto que originou tudo no início (com quote), pra não ficar sem sentido.
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: 18008
Data de registro: 26 Fev 2007 11:59
Cidade/Estado: São Paulo-SP
Curtiu: 15 vezes
Mens.Curtidas: 1206 vezes

Próximo



Retornar para Banco de Dados

Quem está online

Usuários vendo este fórum: Google [Bot] e 12 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