Clipper On Line • Ver Tópico - SELECT Nome FROM Cliente WHERE Nome = 'Maria D'Avila'
Página 1 de 1

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

MensagemEnviado: 12 Nov 2018 14:38
por susviela@bol.com.br
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

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

MensagemEnviado: 12 Nov 2018 20:51
por JoséQuintas
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.

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

MensagemEnviado: 12 Nov 2018 21:31
por susviela@bol.com.br
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.

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

MensagemEnviado: 13 Nov 2018 09:03
por JoséQuintas
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.

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

MensagemEnviado: 13 Nov 2018 10:11
por susviela@bol.com.br
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.

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

MensagemEnviado: 13 Nov 2018 11:20
por JoséQuintas
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