Descrição:
Objeto que representa um comando SQL precompilado. Esse objeto pode ser usado para executar eficientemente um comando SQL inúmeras vezes.



Métodos:



New()

Sintaxe:
FWPreparedStatement():New( cQuery ) ->

Descrição:
Construtor da carga

Parâmetros:

NomeTipoDescrição
cQueryCaracterQuery em SQL ANSI


Destroy()

Sintaxe:
FWPreparedStatement():Destroy( ) ->

Descrição:
Destrói o objeto




SetQuery()

Sintaxe:
FWPreparedStatement():SetQuery( cQuery ) ->

Descrição:
Informa a query a ser executada, deve ser utilizada a construção com os parametros com ? ao invés do valor, que posteriormente serão passados via setString, SetDate etc.

Parâmetros:

NomeTipoDescrição
cQueryCaracterQuery em SQL ANSI

setBoolean()

Sintaxe:
FWPreparedStatement():setBoolean( nParam , lValue , lProtheus ) ->

Descrição:
Seta um parâmetro na query do tipo Boolean. Parâmetros iniciam sempre com 1.

Parâmetros:

NomeTipoDescrição

nParam

NuméricoNúmero do parâmetro (1..N)
lValueLógicoValor boolean a se passar na query
lProtheusLógicoSe .T. trata o lógico igual ao Protheus, .T. é Default

setDate()

Sintaxe:
FWPreparedStatement():setDate( nParam , dDate ) ->

Descrição:
Seta um parâmetro na query do tipo Data do Protheus. Parâmetros iniciam sempre com 1.

Parâmetros:

NomeTipoDescrição
nParamNuméricoNúmero do parâmetro (1..N)
dDateDataData no formato Protheus

setString()

Sintaxe:
FWPreparedStatement():setString( nParam , cValue ) -> cBuffer

Descrição:
Seta um parâmetro na query via String. Parâmetros iniciam sempre com 1.
Obs.: Deve-se passar a string normalmente, sem uso de aspas simples (') para o banco. Caso seja encontrado esse caracter, será considerado parte da string para o banco, e não como delimitador de string em SQL.

Parâmetros:

NomeTipoDescrição
nParamNuméricoNúmero do parâmetro (1..N)
cValueCaracterValor do conteúdo de String

Retorno:
cBuffer



setIn()

Sintaxe:
FWPreparedStatement():setIn( nParam , aValues ) ->

Descrição:
Seta um parâmetro na query do tipo IN. Parâmetros iniciam sempre com 1.

Parâmetros:

NomeTipoDescrição
nParamNuméricoNúmero do parâmetro (1..N)
aValuesArrayArray com valores do IN

validParamSize()

Sintaxe:
FWPreparedStatement():validParamSize( nParam ) ->

Descrição:
Valida se o parâmetro informado existe na query atual.

Parâmetros:

NomeTipoDescrição
nParamNuméricoNúmero do parâmetro (1..N)

getFixQuery()

Sintaxe:
FWPreparedStatement():getFixQuery( ) -> cQuery

Descrição:
Retorna a query com os parâmetros já tratados e substituídos. Pronta para ser enviada ao banco.

Retorno:
cQuery - Query no padrão do banco conectado



executeQuery()

Sintaxe:
FWPreparedStatement():executeQuery( cAlias , aSetField ) -> xRet

Descrição:
Executa a Query

Parâmetros:

NomeTipoDescrição
cAliasCaracterAlias a ser criado
aSetFieldArray

Vetor com os campos para execução  de TCSetField com a estrutura:                       [1] Nome do Campo
[2] Tipo
[3] Tamanho
[4] Decimal

Retorno:
xRet




setFields()

Sintaxe:
FWPreparedStatement():setFields( aSelect ) ->

Descrição:
Seta os campos do Select

Parâmetros:

NomeTipoDescrição
aSelectArray

Array com os nomes dos campos

Pode-se utilizar um array no formato:
[1] "CAMPO1"
[2] "CAMPO2"
[3] "CAMPO3"

Ou no formato:
[1][1] "CAMPO1"
[1][2] "N" //tipo
[1][3] "10" //Tamanho
[1][4] "0" //Decimal
[2][1] "CAMPO2"
[2][2] "M" //tipo
[2][3] "10" //Tamanho
[2][4] "0" //Decimal

O array pode ser misto, os campos que não precisam de TCSetField podem estar no formato simples



getFieldSelect()

Sintaxe:
FWPreparedStatement():getFieldSelect( ) -> cSelect

Descrição:
Retorna uma String com todos os campos da query

Retorno:
cSelect



doTcSetField()

Sintaxe:
FWPreparedStatement():doTcSetField( cAlias ) ->

Descrição:
Executa o TCSetField para todos os campos informados via parâmetro SetFields. É necessário que a query já esteja aberta.

Parâmetros:

NomeTipoDescrição
cAliasCaracterAlias que será realizado o TCSetField




getResultArray()

Sintaxe:
FWPreparedStatement():getResultArray( cAlias , lClose ) -> aResult

Descrição:
Retorna um array com todos os campos da query para todos os registros. Será utilizado o array de campo passado no SetFields, e não o DBStruct da query.
Esse método não faz DBGOTOP no alias, portanto o ResultSet será a partir do ponto que a "query" está posicionada.

Parâmetros:

NomeTipoDescrição
cAliasCaracterNome do Alias
lCloseLógicoSe .T. fecha o alias após consumir os valores. .T. é Default

Retorno:
aResult - Array com o resultado da query



setConnection()

Sintaxe:
FWPreparedStatement():setConnection( oObj ) ->

Descrição:
Seta o Objeto

Parâmetros:

NomeTipoDescrição
oObjObjetoObjeto de conexão externo (ver Classe: FWDBAccess)






setNumeric()

Sintaxe:
FWPreparedStatement():setNumeric( nParam , nValue ) →

Descrição:
Seta um parâmetro na query via String. Parâmetros iniciam sempre com 1.

Parâmetros:

NomeTipoDescrição
nParamNuméricoNúmero do parâmetro (1..N)
nValueNuméricoValor do conteúdo numérico


setParams()

Sintaxe:
FWPreparedStatement():setParams( aParams ) ->

Descrição:
Seta todos os parâmetros passados no array. Essa função não é tão performática quanto chamar o setXXXX de cada tipo, pois ela usa valtype.

Parâmetros:

NomeTipoDescrição
aParamsArrayArray com o valores a serem testados




setUnsafe()

Sintaxe:
FWPreparedStatement():SetUnsafe( nParam , xValue) 

Descrição:
Seta um parâmetro na query. Parâmetros iniciam sempre com 1.
Obs.:  Por enviar um parâmetro de forma não segura para o statment ele nunca deve ser utilizado
para inserir um parâmetro recebido por uma requisição HTTP, por exemplo, pois ele pode
receber um SqlInjection e causar problemas no sistema. Somente utilize este método
se você estiver seguro que o parâmetro enviado é seguro (por exemplo, trocar o nome de uma tabela de forma dinâmica)

Parâmetros:

NomeTipoDescrição
nParamNuméricoNúmero do parâmetro (1..N)
XValueVariantValor do conteúdo a ser incluído

Retorno:
nil 






Exemplo de Uso da Classe

User Function tPrepStat
Local oStatement
Local cQuery
Local cFinalQuery 
Local cUser := "000001"
Local cPassword := "testeFWPS"

oStatement := FWPreparedStatement():New()
cQuery := "SELECT * FROM users WHERE username=? AND password=?"

//Define a consulta e os parâmetros
oStatement:SetQuery(cQuery)
oStatement:SetString(1,cUser)
oStatement:SetString(2,cPassword)

//Recupera a consulta já com os parâmetros injetados
cFinalQuery := oStatement:GetFixQuery()



<style>
div.theme-default .ia-splitter #main {
    margin-left: 0px;
}
.ia-fixed-sidebar, .ia-splitter-left {
    display: none;
}
#main {
    padding-left: 10px;
    padding-right: 10px;
    overflow-x: hidden;
}

.aui-header-primary .aui-nav,  .aui-page-panel {
    margin-left: 0px !important;
}
.aui-header-primary .aui-nav {
    margin-left: 0px !important;
}
</style>