GARANTIR DESCONTO

Fórum Ordem de parâmetros ADOQuery #375470

30/09/2009

0

Pessoal, percebi uma coias no componente ADOQuery e não consegui entender nem consegui achar algo falando sobre isso. Nem debugando a Unit ADODB, não consegui saber o porque.
Bom, vamos lá. Tenho uma script SQL:

UPDATE TESTE
SET TEXTO = :TEXTO
WHERE CODIGO= :CODIGO

O delpih já inclui na lista de parâmetros na ordem, TEXTO e CODIGO.
Se eu for na propriedade Parameters e abrir o editor e mudar a ordem dos parâmetros, meu SQL não funciona, pois a ordem fica CODIGO e TEXTO, sendo assim quando executa o ExecSQL, sobe um erro que está atribuindo valores de tipos diferentes, CODIGO int e TEXTO varchar(255).
A curiosidade é o seguinte: Como ele tenta atribuir valores nos parâmetros trocados? Sendo que o método ParamByName percorre a lista de parâmetros para achar o mesmo e atribuir o valor.
Achei isso no mínimo estranho. Não acredito que isso seja um bug, mas queria ter cereteza. Ainda estou pesquisando.

Outro exemplo:
SELECT * FROM TESTE WHERE CODIGO = :CODIGO AND SITUACAO = :SITUACAO

Na tabela existe um registro com CODIGO = 1 e SITUACAO = 2. Se eu for no Editro de parametros e mudar a ordem, não retorna nenhum regsitro. É como se estivesse passando o valor 1 para o parâmetro SITUACAO e valor 2 para CODIGO. Como não existe código com valor 2 na tabela não retorna nada. A ordem no editor de parâmetros está SITUACAO(Índice 0) e CODIGO(Índice 1).

qrySelecionar.Close;
qrySelecionar.Parameters.ParamByName(´CODIGO´).Value := 1;
qrySelecionar.Parameters.ParamByName(´SITUACAO´).Value := 2;
qrySelecionar.Open;

Assim também não lista nada:
qrySelecionar.Close;
qrySelecionar.Parameters.Items[0].Value := 2;
qrySelecionar.Parameters.Items[1].Value := 1;
qrySelecionar.Open;

A pergunta é: A ordem tem infuência?


Fabiocolli

Fabiocolli

Responder

Posts

30/09/2009

Adilsond

Sim, a movimentação do conteúdo é feita pelo indice.

Correção:
  qrySelecionar.Close;
  qrySelecionar.Parameters.ParseSQL(qrySelecionar.SQL.Text,True);
  qrySelecionar.Parameters.ParamByName(´CODIGO´).Value := 1;
  qrySelecionar.Parameters.ParamByName(´SITUACAO´).Value := 2;
  qrySelecionar.Open;



Responder

Gostei + 0

01/10/2009

Fabiocolli

Bom, apesar de não concordar com a implementação da busca pelo parâmetro no ADOQuery, eu agradeço pela solução.
Relamente existe algumas implentações de componentes nativos do Delphi que deixam a desejar. Estou falando isso, pelo menos desse caso, por que também não sei o motivo dessa implentação.
No componente TQuery a ordem dos parâmetros não influencia, mas isso já é outra discussão.
Quem quiser olhar a implentação do método StringReplace do Delphi, vai ver que também é a pior implementação possível. Ela funciona bem para textos pequenos. Use um texto de 5000 caracteres para você terem uma idéia da demora e comsumo de processamento.


Responder

Gostei + 0

Utilizamos cookies para fornecer uma melhor experiência para nossos usuários, consulte nossa política de privacidade.

Aceitar