Página 3 de 4
MariaDB
Enviado: 26 Jan 2020 20:46
por JoséQuintas
Imagine o seguinte:
INSERT INTO CLIENTE ( NOME ) VALUE ( 'RUA DALVA' )
mas o usuário digita ' ) e mais comandos no nome
INSERT INTO CLIENTE ( NOME ) VALUE ( ' ' ); DELETE FROM.... ')
Só o fato de trocar aspas simples por \' , já evita problemas desse tipo, é uma das coisas a evitar.
O problema maior não é erro na gravação, mas o usuário se aproveitar pra outras coisas.
MariaDB
Enviado: 26 Jan 2020 20:51
por JoséQuintas
INSERT INTO CLIENTE ( NOME ) VALUE ( '\' ); DELETE FROM....\'')
Desse jeito vai gravar as aspas (') dentro do texto, sem erro, e sem a possibilidade do usuário injetar comandos, pelo menos com aspas...
MariaDB
Enviado: 26 Jan 2020 21:08
por asimoes
Quintas,
Fiz a função RemoveAcentosEspeciais(), com essa função funcionou.
Funcionou também para PTISO e PT850
CASE ValType( xValue ) == "C"
xValue := AllTrim( RemoveAcento( MySqlValidString( xValue ) ) )
RemoveAcentosEspeciais( @xValue )
cSql += StringSql( xValue )
Código: Selecionar todos
FUNCTION RemoveAcentosEspeciais( xValue )
LOCAL cLetra
FOR EACH cLetra IN xValue
DO CASE
CASE cLetra $ "abcdefghijklmnopqrstuvwxyz"
CASE cLetra $ "ABCDEFGHIJKLMNOPQRSTUVWXYZ"
CASE cLetra $ "0123456789"
CASE cLetra $ " /·,+-()"
OTHERWISE
xValue := StrTran( xValue, cLetra )
ENDCASE
NEXT
RETURN Nil
MariaDB
Enviado: 26 Jan 2020 21:48
por asimoes
Tinha um campo com o nome Desc, deu ruim, kkk, modifiquei para DESCONTO, sistema legado tem disso.
MariaDB
Enviado: 26 Jan 2020 23:42
por asimoes
Fiz uma modificação aqui só pra ler o dbf que não foi lido por erro ou que entrou na pasta (novo), pra não ter que ler tudo novamente
Código: Selecionar todos
hTable := {}
FOR EACH oFile IN Directory( "*.DBF" )
cFile := oFile[ F_NAME ]
cFile := Substr( cFile, 1, At( ".", cFile ) - 1 )
lRead := .T.
IF Hb_FileExists( "ARQUIVO.json" )
hArquivo := {}
Hb_JSONDecode( Hb_MemoRead( "ARQUIVO.json" ), @hArquivo )
lRead := Hb_aScan( hArquivo, { |a| a["DBF"] == cFile } ) = 0
ENDIF
IF lRead
hRecord := Nil
hRecord := {=>}
hRecord["DBF"] := cFile
aAdd( hTable, hRecord )
CopyDbfToMySql( cFile, .T., .T., .T. )
cJSON := Hb_JSONEncode( hTable, .T. )
Hb_MemoWrit( "ARQUIVO.json", cJSON )
ENDIF
NEXT
MariaDB
Enviado: 26 Jan 2020 23:59
por JoséQuintas
Tive um problema estranho pra atualizar de 5.5 pra 10.x
Ao chamar a atualização, selecionar MySQL, deu erro.
Fazendo de novo, e clicando em "select all", aí marcou MySQL e funcionou.
Vai entender...
Atualizei da 5.5 pra 10.x
A única coisa que não gostei, é que os bancos continuaram na pasta 5.5, isso pode confundir.
Mas tudo certo.
Uso servidores diferentes agora, MySQL e MariaDB, minha base local é MariaDB, mas na internet é MySQL.
Como eu já disse, o mesmo conector funciona nos dois.
Agora minhas máquinas só tem MariaDB, mas conectam normalmente no MySQL da internet.
Acho que só faltou dizer uma coisa:
A instalação do MySQL tem 400MB
A instalação do MariaDB tem 50MB, e vém com HeidiSQL.
E pra quem estiver interessado, já pode trocar o ODBC pra MariaDB, mesmo que continue usando MySQL.
MariaDB
Enviado: 27 Jan 2020 00:41
por asimoes
Peguntas:
O nome EMAIL é palavra reservada do MariaDB ?
Porque deu erro na criação de primary aqui:
cKeyName é IDEMAIL
cSql += " PRIMARY KEY ( " + cKeyName + " )"
Modifiquei o nome da tabela de EMAIL para XEMAI, não deu erro
MariaDB
Enviado: 27 Jan 2020 01:24
por asimoes
Agora tem esse erro maluco:
Já tentei trocar o nome do dbf mais continua o erro.
MariaDB
Enviado: 27 Jan 2020 14:18
por JoséQuintas
Faz assim:
Faz a manutenção do HeidiSQL, e dá uma olhada no código CREATE dele.
Pode renomear o nome do campo, criar índice, etc.
Depois é só olhar como ele fez o CREATE.
Uma opção que aparece no HeidiSQL:
`CODIGO` INT(11)
MariaDB
Enviado: 27 Jan 2020 19:56
por asimoes
Quintas,
Descobri o problema, não tem tratamento para campo lógico.
Inclui esse código
CASE oStru[ nCont, DBS_TYPE ] == "L"
cSql += " VARCHAR( " + Ltrim( Str( oStru[ nCont, DBS_LEN ] ) ) + " ) DEFAULT 'F' "
Era esse o problema.
Foi criado também essa função para tratar o lógico
Código: Selecionar todos
FUNCTION LogicSql( lLogic )
LOCAL cString
Hb_Default(@lLogic, .F.)
cString := IF( lLogic, "'T'", "'F'" )
RETURN cString
CASE ValType( xValue ) == "L"
cSql += LogicSql( xValue )
MariaDB
Enviado: 27 Jan 2020 22:18
por JoséQuintas
asimoes escreveu:CASE oStru[ nCont, DBS_TYPE ] == "L"
cSql += " VARCHAR( " + Ltrim( Str( oStru[ nCont, DBS_LEN ] ) ) + " ) DEFAULT 'F' "
Mas aí tá criando caractere.
Não seria o binary?
Vou deixar pra quando for usar, assim tiro a dúvida.
Nunca usei campo lógico, não gosto deles, mas talvez um dia use no MariaDB.
MariaDB
Enviado: 27 Jan 2020 22:25
por JoséQuintas
Achei isto, e de geralmente usarem Tiny Int
MariaDB
Enviado: 28 Jan 2020 08:30
por asimoes
Quintas
Vou modificar como você sugeriu
No Oracle não tem isso, o artifício e dessa forma que eu fiz, o problema é compatibilidade com os outros bancos se for migrar
Varchar é igual nos SGBD
MariaDB
Enviado: 29 Jan 2020 11:34
por asimoes
Filtro e Sort com um resultset
Pode-se ordenar um resultset ou filtrar determinado campo dele.
Ex.:
Código: Selecionar todos
oRs:Sort := "VENCIMENTO DESC"
oRs:Filter := "VENCIMENTO='20/02/2020'"
oRs:Filter := "VENCIMENTO >= #20/01/20#"
MariaDB
Enviado: 29 Jan 2020 11:49
por JoséQuintas
asimoes escreveu:Filtro e Sort com um resultset
Só que isso é do ADO, e vale pra qualquer base de dados, até DBF.