Fórum Consulta Parametrizada não retorna dados #357832

30/04/2008

0

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

Responder

Posts

30/04/2008

Mazzi

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++


Responder

Gostei + 0

30/04/2008

Junior Bezerra

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

Obrigado...


Responder

Gostei + 0

30/04/2008

Junior Bezerra

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?


Responder

Gostei + 0

30/04/2008

Macario

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)


Responder

Gostei + 0

30/04/2008

Rjun

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;



Responder

Gostei + 0

30/04/2008

Junior Bezerra

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


Responder

Gostei + 0

30/04/2008

Junior Bezerra

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?


Responder

Gostei + 0

01/05/2008

Mazzi

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!


Responder

Gostei + 0

01/05/2008

Junior Bezerra

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?


Responder

Gostei + 0

01/05/2008

Mazzi

Sim.

Perfeito.


Responder

Gostei + 0

01/05/2008

Junior Bezerra

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...


Responder

Gostei + 0

02/05/2008

Mazzi

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.


Responder

Gostei + 0

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

Aceitar