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?
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
Curtir tópico
+ 0
Responder
Posts
30/09/2009
Adilsond
Sim, a movimentação do conteúdo é feita pelo indice.
Correção:
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.
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
Clique aqui para fazer login e interagir na Comunidade :)