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()