Consulta Parametrizada não retorna dados

Delphi

30/04/2008

bom estou usando bd firebird, faço muito em ASP mais em Delphi estou apanhando um pouco, seguinte tenho duas tabelas:

Tabela PREFEITURAS
id_prefeitura
nome_prefeitura

Tabela Informativo
id_informativo
descricao
valo
id_prefeitura

na minha query da consulta parametrizei meu select da sequinte forma, select * from INFORMATIVO where ID_PREFEITURA=:PID_PREFEITURA.

O que eu quero com isso, mostrar todos os informativos que estão em uma prefeitura tal. Fiz um DBGrid que quando da duplo clique abre um form com esses dados da prefeitura.

no onshow do form da consulta fiz assim:
dm.SQLConnection1.Open; try dm.qryConsulta.Close; dm.qryConsulta.SQL.Clear; dm.qryConsulta.SQL.Add(´select * from INFORMATIVO where´); dm.qryConsulta.SQL.Add(´ID_PREFEITURA = :PID_PREFEITURA´); dm.qryConsulta.Params.ParamByName(´PID_PREFEITURA´).AsInteger:= dm.cdsPrefeiturasID_PREFEITURA.AsInteger; dm.qryConsulta.Open; finally dm.SQLConnection1.Close; end;
Mais não me retorna nada, fica em branco. O que estou fazendo de errado?


Junior Bezerra

Junior Bezerra

Curtidas 0

Respostas

Mazzi

Mazzi

30/04/2008

Olá, vamos ver... uma coisinha, desculpe se for detalhista de mais, mas a intenção é ajuda-lo da melhor forma possivel.

nas linhas:

[i]dm.qryConsulta.SQL.Add(´select * from INFORMATIVO where´); [/i]
// coloque um ´espacinho... entre o where e a aspas//
//ex: [b]where ´);[/b] ok
dm.qryConsulta.SQL.Add(´ID_PREFEITURA = :PID_PREFEITURA´);
dm.qryConsulta.Params.ParamByName(´PID_PREFEITURA´).AsInteger:=
dm.cdsPrefeiturasID_PREFEITURA.AsInteger;
//após passar um parametro dê um Prepare;
//ex: [b]dm.cdsPrefeitura.Prepare;[/b]
dm.qryConsulta.Open;


até aui tudo bem, o que pode estar acontecendo é que o processo é iniciado e finalizado logo após o seu finally. Fechando a conexão.
[i]
finally
dm.SQLConnection1.Close;[/i]

//tente finalizar sua conexão ao fechar o formulario, por exemplo inserindo o dm.SQLConnection1.Close; no evento onClose do Form, ou algo do tipo;

Abraços++


GOSTEI 0
Junior Bezerra

Junior Bezerra

30/04/2008

Pô Obrigado pela rapidez mazzi, vou testar aqui essas modificações e depois coloco o resutado.

Obrigado...


GOSTEI 0
Junior Bezerra

Junior Bezerra

30/04/2008

Mazzi quando coloco essa linha:
dm.cdsPrefeitura.Prepare;
ele nem auto completa na dica do Delphi nem eu forçando e colocando normal da erro: Undeclared identifier: ´Prepare´.

O que pode ser?


GOSTEI 0
Macario

Macario

30/04/2008

Olá.

Ocorre que você esta fechando a conexão após efetuar a consulta.

qryConsulta é qual tipo de dataset? ADOQuery? SQLQuery?

Visto que o mesmo não faz cache da consulta.

Use Clientdataset para tal finalidade.

p.s.: Em aplicacões Win32 não se deve aplicar a mesma metodologia que na WEB, abrindo e fechando conexão.

8)


GOSTEI 0
Rjun

Rjun

30/04/2008

dm.qryConsulta.SQL.Clear; 
dm.qryConsulta.SQL.Add(´select * from INFORMATIVO where´); 
dm.qryConsulta.SQL.Add(´ID_PREFEITURA = :PID_PREFEITURA´); 
dm.qryConsulta.Params.ParamByName(´PID_PREFEITURA´).AsInteger:= 
dm.cdsPrefeiturasID_PREFEITURA.AsInteger; 
dm.qryConsulta.Open; 
try
  // Aqui você faz o que tiver que fazer com sua query
finally
  dm.qryConsulta.Close;   
end;



GOSTEI 0
Junior Bezerra

Junior Bezerra

30/04/2008

Macario o Datase é SQLQuery. Minha SQL está assim select * from INFORMATIVO where ID_PREFEITURA=:PID_PREFEITURA.


GOSTEI 0
Junior Bezerra

Junior Bezerra

30/04/2008

Olha só, tentei assim e deu certo:
dm.cdsConsulta.Close; dm.cdsConsulta.Params[0].AsInteger:= dm.cdsPrefeiturasID_PREFEITURA.AsInteger; dm.cdsConsulta.Open;

Agora fiquei encabulado pq não consigo via código SQL, o que estou fazendo errado, outra coisa a alguma perda de performace assim cmo eu consegui?


GOSTEI 0
Mazzi

Mazzi

30/04/2008

Oi , deu certo, pois vc

não colocou aquela parte do

[i]dm.SQLConnection1.Close[/i];

senao a sua conexao fecharia.

assim tah certo, vai fundo. Sucesso!


GOSTEI 0
Junior Bezerra

Junior Bezerra

30/04/2008

Mais não usei a parte do SQL:
dm.qryConsulta.SQL.Clear; dm.qryConsulta.SQL.Add(´select * from INFORMATIVO where´); dm.qryConsulta.SQL.Add(´ID_PREFEITURA = :PID_PREFEITURA´);
Usei apenas isso:
dm.cdsConsulta.Close; dm.cdsConsulta.Params[0].AsInteger:= dm.cdsPrefeiturasID_PREFEITURA.AsInteger; dm.cdsConsulta.Open;
e deu certo. Esse é o melhor modo?


GOSTEI 0
Mazzi

Mazzi

30/04/2008

Sim.

Perfeito.


GOSTEI 0
Junior Bezerra

Junior Bezerra

30/04/2008

Então desde já agradeço pela atenção

Só mais uma coisa qual a melhor opção para fazer um insert, delete, update? Via código SQL ou normal mesmo tipo: dm.cdsconsulta.Insert;

vlw...


GOSTEI 0
Mazzi

Mazzi

30/04/2008

Melhor forma......, depende...., em alguns casos é melhor usar um e outros é melhor usar outro.....

o mais fácil e mais usado vais ser o TDataSet.Insert mesmo.

Lembre-se ainda, se for usar em rede (Servidor, client) pra não ter problemas de acesso em ao mesmo tempo na rede use os Transactions corretamente.


GOSTEI 0
POSTAR