Página 1 de 1
SELECT Nome FROM Cliente WHERE Nome = 'Maria D'Avila'
Enviado: 12 Nov 2018 15: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'
Enviado: 12 Nov 2018 21:51
por JoséQuintas
Acho que depende do que está usando pra acessar MySQL.
No ADO acabei criando uma função de/para.
Código: Selecionar todos
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
Código: Selecionar todos
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'
Enviado: 12 Nov 2018 22:31
por susviela@bol.com.br
Estou usando a classe TMySQLServer() nativamente com HMG / MariaDB ...
Código: Selecionar todos
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'
Enviado: 13 Nov 2018 10:03
por JoséQuintas
Poderia fazer igual eu faço, e centralizar numa função de conversão.
Código: Selecionar todos
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.
Código: Selecionar todos
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'
Enviado: 13 Nov 2018 11:11
por susviela@bol.com.br
Muito bom ...
Código: Selecionar todos
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'
Enviado: 13 Nov 2018 12: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