Quais as vantagens Query String ou Embedded SQL?
Olha Dilson eu particularmente prefiro montar a string diretamente no fonte mesmo e executar com a classe FwExecStatement() que faz o cache das querys no SQL além de proteção dos parâmetros de filtro (tratamento para aspas, etc.).
Exemplo:
Local cQuery := '' AS Character
Local oQry AS Object
Local ucQry AS Variant
BeginContent Var cQuery
SELECT *
FROM %Exp:FWSX2Util():GetFile("SRA")% SRA
WHERE SRA.D_E_L_E_T_ <> '*'
AND RA_MAT = ?
EndContent
oQry := FwExecStatement():New(cQuery)
oQry:setString (1,cFiltro)
oQry:OpenAlias(@ucQry) //oQry:getFixQuery() retorna query processada
While (ucQry)->(!EoF())
//-- EXECUTA O QUE PRECISAR AQUI COM OS DADOS DA QUERY
(ucQry)->(dbSkip())
EndDo
(ucQry)->(dbCloseArea()) //Fecha a query
oQry:Destroy()
FreeObj(oQry)
Eu prefiro usar Embedded SQL em query’s simples e diretas (como um select básico em alguma tabela e uso o FwExecStatement() quando quero fazer alguma iteração utilizando os dados da query.
O Embedded SQL tem um detalhe que o CodeAnalysis sempre critica, é que ele não trata o SQL Injection o que pode ser um problema dependo da fonte dos dados para a query. Já a classe FwExecStatement() faz todo esse tratamento e resolve esse impasse. Da forma que uso inclusive é bem semelhante a do Embedded SQL na leitura da consulta.
Se a prioridade for a depuração e a flexibilidade na construção dinâmica de consultas, “Query String” pode ser uma opção.
Se a prioridade for a legibilidade, a manutenção e a performance do código, Embedded SQL é geralmente a opção recomendada.
A TOTVS recomenda o uso de Embedded SQL, pois ele encapsula ChangeQuery, e cria cache das querys, aumentando a performance
Olá,
Hoje recomendamos sempre utilizar FWExecStatement
, pois essa classe consegue efetuar o tratamento de SQL Injection.
Ela já possui métodos para abrir a query, portanto é uma grande facilitadora:
https://tdn.totvs.com/display/public/framework/FWExecStatement