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

Forum sobre SQL.

Moderador: Moderadores

Avatar do usuário
susviela@bol.com.br
Usuário Nível 3
Usuário Nível 3
Mensagens: 236
Registrado em: 30 Jun 2017 11:17
Localização: São José / SC
Contato:

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

Mensagem 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
.
.
"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 do usuário
JoséQuintas
Administrador
Administrador
Mensagens: 20267
Registrado em: 26 Fev 2007 11:59
Localização: São Paulo-SP

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

Mensagem 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.
José M. C. Quintas
Harbour 3.2, mingw, gtwvg mt, fivewin 25.04, multithread, dbfcdx, MySQL, ADOClass, PDFClass, SefazClass, (hwgui mt), (hmg3), (hmg extended), (oohg), PNotepad, ASP, stored procedure, stored function, Linux (Flagship/harbour 3.2)
"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 do usuário
susviela@bol.com.br
Usuário Nível 3
Usuário Nível 3
Mensagens: 236
Registrado em: 30 Jun 2017 11:17
Localização: São José / SC
Contato:

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

Mensagem 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.
.
.
"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 do usuário
JoséQuintas
Administrador
Administrador
Mensagens: 20267
Registrado em: 26 Fev 2007 11:59
Localização: São Paulo-SP

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

Mensagem 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.
José M. C. Quintas
Harbour 3.2, mingw, gtwvg mt, fivewin 25.04, multithread, dbfcdx, MySQL, ADOClass, PDFClass, SefazClass, (hwgui mt), (hmg3), (hmg extended), (oohg), PNotepad, ASP, stored procedure, stored function, Linux (Flagship/harbour 3.2)
"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 do usuário
susviela@bol.com.br
Usuário Nível 3
Usuário Nível 3
Mensagens: 236
Registrado em: 30 Jun 2017 11:17
Localização: São José / SC
Contato:

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

Mensagem 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.
.
.
"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 do usuário
JoséQuintas
Administrador
Administrador
Mensagens: 20267
Registrado em: 26 Fev 2007 11:59
Localização: São Paulo-SP

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

Mensagem 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
José M. C. Quintas
Harbour 3.2, mingw, gtwvg mt, fivewin 25.04, multithread, dbfcdx, MySQL, ADOClass, PDFClass, SefazClass, (hwgui mt), (hmg3), (hmg extended), (oohg), PNotepad, ASP, stored procedure, stored function, Linux (Flagship/harbour 3.2)
"The world is full of kings and queens, who blind our eyes and steal our dreams Its Heaven and Hell"

https://github.com/JoseQuintas/
Responder