Clipper On Line • Ver Tópico - SELECT Nome FROM Cliente WHERE Nome = 'Maria D'Avila'

SELECT Nome FROM Cliente WHERE Nome = 'Maria D'Avila'

Discussão sobre SQL

Moderador: Moderadores

 

SELECT Nome FROM Cliente WHERE Nome = 'Maria D'Avila'

Mensagempor susviela@bol.com.br » 12 Nov 2018 14:38

Sei que uma das soluções é usar DOIS apóstrofes ou usar o escape \'

Como os colegas tratam esse detalhe ?

Nada que um StrTran não resolva mas ...

SGBD: MariaDB
Lib: HMG 3.4.4
.
.
"E quando você perder o controle, colherá o que plantou."
=========================================
Carlos Alberto Nunes #Susviela
Site: https://www.PowerInformatica.com.br
=========================================
Blog xBase: https://programandoxbase.wordpress.com/
Blog TI: https://susviela.wordpress.com

( #ProgramandoxBase #AllxBase )
Avatar de usuário

susviela@bol.com.br
Usuário Nível 3

Usuário Nível 3
 
Mensagens: 145
Data de registro: 30 Jun 2017 11:17
Cidade/Estado: São José / SC
Curtiu: 74 vezes
Mens.Curtidas: 14 vezes

SELECT Nome FROM Cliente WHERE Nome = 'Maria D'Avila'

Mensagempor JoséQuintas » 12 Nov 2018 20:51

Acho que depende do que está usando pra acessar MySQL.
No ADO acabei criando uma função de/para.

cSql += StringSql( cTexto ) // ValueSql()
...
cCampo := Rs:StringSql( "CAMPO" )


Nessas funções, faço as conversões de/para, e até mesmo pra colocar entre aspas.
Ao invés de colocar tratamento especial em tudo que é fonte, só usar uma função e pronto.
Inclusive funções extras pra fazer "de baciada".... rs

cnMySql:QueryCreate()
cnMySql:QueryAdd( "campo", valor )
cnMySql:QueryAdd( "campo", valor)
cnMySql:QueryExecuteUpdate( "clientes", "CODIGO=" + NumberSql( nCodigo ) )


Neste último caso, crio um array com todos os campos, e no final crio a query por função.
Fica um fonte mais legível, na maioria dos casos, comparado a ficar convertendo tudo em cada fonte/comando.
José M. C. Quintas
Harbour 3.4, mingw, gtwvg, multithread, dbfcdx, ADO+MySql, hbnetio, PNotepad
"The world is full of kings and queens, who blind our eyes and steal our dreams Its Heaven and Hell"
Avatar de usuário

JoséQuintas
Colaborador

Colaborador
 
Mensagens: 11592
Data de registro: 26 Fev 2007 11:59
Cidade/Estado: São Paulo-SP
Curtiu: 12 vezes
Mens.Curtidas: 740 vezes

SELECT Nome FROM Cliente WHERE Nome = 'Maria D'Avila'

Mensagempor susviela@bol.com.br » 12 Nov 2018 21:31

Estou usando a classe TMySQLServer() nativamente com HMG / MariaDB ...

   LOCAL cSql   := "INSERT INTO "+ ::cTabela +"(  " +;
            "usuario, senha, nome, ativo, nivel, imagem, ultimologin ) "+;
            "VALUES ( " +;
            "'" + ::usuario             +"', "+;
            "'" + ::senha                +"', "+;
            "'" + ::nome                +"', "+;
            " " + ALLTRIM(STR(::ativo))      +" , "+;
            " " + ALLTRIM(STR(::nivel))      +" , "+;
            "'" + ::imagem                +"', "+;
            "'" + ::ultimologin            +"'  " ;


Vou dar uma estudada mas acho que vai ter que ser isso mesmo colocar na minha classe de manutenção da tabela uns filtros.

Como diz querer pegar uns atalhos as vezes acaba não rendendo, eu não usei métodos GET / SET, poderia colocar os filtros nesses métodos, mas vou pensar ... se não faço a coisa certa antes de ficar maior ainda.
.
.
"E quando você perder o controle, colherá o que plantou."
=========================================
Carlos Alberto Nunes #Susviela
Site: https://www.PowerInformatica.com.br
=========================================
Blog xBase: https://programandoxbase.wordpress.com/
Blog TI: https://susviela.wordpress.com

( #ProgramandoxBase #AllxBase )
Avatar de usuário

susviela@bol.com.br
Usuário Nível 3

Usuário Nível 3
 
Mensagens: 145
Data de registro: 30 Jun 2017 11:17
Cidade/Estado: São José / SC
Curtiu: 74 vezes
Mens.Curtidas: 14 vezes

SELECT Nome FROM Cliente WHERE Nome = 'Maria D'Avila'

Mensagempor JoséQuintas » 13 Nov 2018 09:03

Poderia fazer igual eu faço, e centralizar numa função de conversão.

   LOCAL cSql   := "INSERT INTO "+ ::cTabela +"(  " +;
            "usuario, senha, nome, ativo, nivel, imagem, ultimologin ) "+;
            "VALUES ( " + ;
           StringSql( ::usuario ) + "," + ;
           StringSql( ::senha ) + "," + ;
           StringSql( ::nome ) + "," + ;
           NumberSql( ::Ativo ) + "," + ;
           NumberSql( ::nivel ) + "," + ;
           StringSql( ::Imagem ) + "," + ;
           StringSql( ::UltimoLogin ) + " )"

FUNCTION StringSql( xValue )

   xValue := StrTran( xValue, ['], [\']

   RETURN ['] + xValue + [']

FUNCTION NumberSql( xValue )

   RETURN AllTrim( Str( xValue ) )


É só um exemplo.
Tratando tudo em função, é menos fonte, mais legível, e já ajusta tudo num logar só.
Opcionalmente, pode usar única função.

FUNCTION ValueSql( xValue )

   DO CASE
   CASE ValType( xValue ) == "C"; RETURN StringSql( xValue )
   CASE ValType( xValue ) == "N"; RETURN NumberSql( xValue )
   CASE ValType( xValue ) == "D"; RETURN DateSql( xValue )
   ENDCASE
   // tipo nao tratado
   RETURN xValue


Só sugestão.
José M. C. Quintas
Harbour 3.4, mingw, gtwvg, multithread, dbfcdx, ADO+MySql, hbnetio, PNotepad
"The world is full of kings and queens, who blind our eyes and steal our dreams Its Heaven and Hell"
Avatar de usuário

JoséQuintas
Colaborador

Colaborador
 
Mensagens: 11592
Data de registro: 26 Fev 2007 11:59
Cidade/Estado: São Paulo-SP
Curtiu: 12 vezes
Mens.Curtidas: 740 vezes

SELECT Nome FROM Cliente WHERE Nome = 'Maria D'Avila'

Mensagempor susviela@bol.com.br » 13 Nov 2018 10:11

Muito bom ...

FUNCTION StringSql( xValue )

   xValue := StrTran( xValue, ['], [\']

   RETURN ['] + xValue + [']

FUNCTION NumberSql( xValue )

   RETURN AllTrim( Str( xValue ) )



Gostei, mesmo da dica e vou adotar ...

O mais estranho que cada pessoa tem o seu modo de escrever o código ... sabe que nunca uso [ ] para delimitar string e ficou gravado em minha mente como delimitador de matriz .... hehehe.

aDados := {}

aDados[1,2] := "Teste"

----

Voltando ao assunto você usa os atributos (nome dos campos como PROTECTED na classe ) ou EXPORTED, tenho adotado esse modelo mas estou pensando em fazer o correto que seria não permitir que os atributos da classe fossem alterado externamente.
.
.
"E quando você perder o controle, colherá o que plantou."
=========================================
Carlos Alberto Nunes #Susviela
Site: https://www.PowerInformatica.com.br
=========================================
Blog xBase: https://programandoxbase.wordpress.com/
Blog TI: https://susviela.wordpress.com

( #ProgramandoxBase #AllxBase )
Avatar de usuário

susviela@bol.com.br
Usuário Nível 3

Usuário Nível 3
 
Mensagens: 145
Data de registro: 30 Jun 2017 11:17
Cidade/Estado: São José / SC
Curtiu: 74 vezes
Mens.Curtidas: 14 vezes

SELECT Nome FROM Cliente WHERE Nome = 'Maria D'Avila'

Mensagempor JoséQuintas » 13 Nov 2018 11:20

Por enquanto não.
Mas pode ser interessante pra impedir colocar tipo de variável errado em variáveis da classe, por exemplo.
Por outro lado, isso pode esconder erros de fonte.

No geral vou alterando conforme a necessidade.
Tipo... quando começo a errar muito o nome de uma variável da classe, sinal de que tá na hora de alterar aquele nome... rs
José M. C. Quintas
Harbour 3.4, mingw, gtwvg, multithread, dbfcdx, ADO+MySql, hbnetio, PNotepad
"The world is full of kings and queens, who blind our eyes and steal our dreams Its Heaven and Hell"
Avatar de usuário

JoséQuintas
Colaborador

Colaborador
 
Mensagens: 11592
Data de registro: 26 Fev 2007 11:59
Cidade/Estado: São Paulo-SP
Curtiu: 12 vezes
Mens.Curtidas: 740 vezes




Retornar para SQL

Quem está online

Usuários vendo este fórum: Nenhum usuário registrado online e 1 visitante


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
v
Olá visitante, seja bem-vindo ao Fórum Clipper On Line!
Efetue o seu login ou faça o seu Registro