Consulta Parametrizada não retorna dados
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:
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
Curtidas 0
Respostas
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++
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
30/04/2008
Pô Obrigado pela rapidez mazzi, vou testar aqui essas modificações e depois coloco o resutado.
Obrigado...
Obrigado...
GOSTEI 0
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?
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
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)
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
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
30/04/2008
Macario o Datase é SQLQuery. Minha SQL está assim select * from INFORMATIVO where ID_PREFEITURA=:PID_PREFEITURA.
GOSTEI 0
Junior Bezerra
30/04/2008
Olha só, tentei assim e deu certo:
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?
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
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!
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
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
30/04/2008
Sim.
Perfeito.
Perfeito.
GOSTEI 0
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...
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
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.
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