Formatando e preparando uma query com a FWPreparedStatement – Maratona AdvPL e TL++ 239

Nesse vídeo demonstraremos a utilização da classe FWPreparedStatement, que serve formatar uma query.

Abaixo o código fonte desenvolvido para o exemplo em vídeo acima:

//Bibliotecas
#Include 'TOTVS.ch'
 
/*/{Protheus.doc} User Function zExe239
Classe que prepara uma query SQL
@type Function
@author Atilio
@since 20/02/2023
@see https://tdn.totvs.com/display/public/framework/FWPreparedStatement
@obs 

    **** Apoie nosso projeto, se inscreva em https://www.youtube.com/TerminalDeInformacao ****
/*/

User Function zExe239()
	Local aArea := FWGetArea()
    Local oStateQry
    Local cQueryOrig
    Local cQueryNova
    
    //Prepara a query original
    cQueryOrig := "SELECT * FROM " + RetSQLName("SB1") + " SB1 WHERE B1_TIPO = ? AND B1_LOCPAD = ? AND SB1.D_E_L_E_T_ = ' '"

    //Começa a montar a query
    oStateQry := FWPreparedStatement():New()
    
    //Define a query e define o conteúdo das interrogações
    oStateQry:SetQuery(cQueryOrig)
    oStateQry:SetString(1, "PA")
    oStateQry:SetString(2, "01")
    
    //Busca a query formatada
    cQueryNova := oStateQry:GetFixQuery()
    FWAlertInfo(cQueryNova, "Teste 1 FWPreparedStatement")

    RestArea(aArea)
Return

Bom pessoal, por hoje é só.

Abraços e até a próxima.

Dan (Daniel Atilio)
Cristão de ramificação protestante. Especialista em Engenharia de Software pela FIB, graduado em Banco de Dados pela FATEC Bauru e técnico em informática pelo CTI da Unesp. Entusiasta de soluções Open Source e blogueiro nas horas vagas. Autor e mantenedor do portal Terminal de Informação.

4 Responses

  1. Fala Atilão, tudo certo meu querido.
    Jovem, só uma observação muito importante quanto ao uso dessa classe.
    Um dos pontos importantes dela é a proteção contra sql Injection. E pegar a query através do GetFixQuery() e executar ela por MpSysOpenQuery, TcQuery ou afins, não vai proteger o código da injeção de dependencias, pois em suma o que o GetFixQuery vai fazer, é apenas trocar os ‘?’ pelos valores, ou seja, fazer o bind.

    Para que a query seja protegida do SQL Injection, ela precisa ser executada através da classe, usando o método executeQuery por exemplo.

    Mas o melhor é não fazer uso da FWPreparedStatement, mas sim da classe FWExecStatement que é mais moderna, usa conceitos da classe FWExecCachedQuery e por isso acaba sendo mais rápida. Mas nelas a proteção do SQL Injection também só existe se as querys forem executadas pela própria classe. Exemplo, a FWExecStatement os métodos que executariam a query e protegeria da injeção de dependencias são OpenAlias e o ExecScalar.

    Estou fazendo esse comentário pois já estou vendo muitos códigos usando o FWPreparedStatement, pegando a query pelo GetFixQuery, e executando ela pelas funções padrões, na ilusão que o GetFixQuery já tira a injeção de sql.

    • Bom dia mano Súlivan, por aqui tudo joia graças a Deus e por aí?

      Opa, muito obrigado pelo excelente adendo.

      Realmente é uma ótima dica, depois estudarei também essa FWExecStatement.

      Tenha uma ótima e abençoada quinta feira.

      Um forte abraço.

  2. -A disse:

    Verdade no desenvolvimento a orientação é usar o FwExecStatement

Deixe uma resposta

Terminal de Informação