Erro ao fazer select passando parâmetros

Delphi

Firebird

06/11/2014

Bom dia,

Estou fazendo um consulta no banco utilizando um mesmo método para diferentes tabelas usando parâmetros.
Uso Delphi XE7 e banco Firebird 2.3

Segue o código:

procedure TfrmPrincipal.sbtnBuscarClick(Sender: TObject);
var
  pk, tabela: string;
begin
  pk := 'COD_' + cbBusca.Text;
  tabela := cbBusca.Text;

  consultaProblema(pk,tabela);
end;

---------------------------------------------------------------------------------------------

procedure consultaProblema(codtabela, tabela : string);
begin
  DM.cdsProblema.Close;
  with DM.qryProblema do
  begin
    SQL.Clear;
    SQL.Add('SELECT :PCOD, DESCRICAO ');
    SQL.Add(' FROM :PTABELA ');
    ParamByName('PCOD').Value := codtabela;  //codtabela = COD_CADASTROS
    ParamByName('PTABELA').Value := tabela; //tabela = CADASTROS
    Open;
  end;
  DM.cdsProblema.Open;
end;


Se faço um ShowMessage e mando exigir meus parâmetros ele mostra certo.
Porém ao executar a query da o seguinte erro:
"Token unknown - line 2, column 8
?."

Que seria um erro de sql. o SQL é pra ficar o seguinto "SELECT COD_CADASTROS, DESCRICAO FROM CADASTROS".
Se executo isso no ibexpert vai normal e se escrevo isso a mão sem os parâmetros funciona normal.

Agora se esta passando os valores para os parâmetros onde estaria o erro ?

Alguém pode me ajudar, isto esta travando meu projeto.

OBS: Em um outro projeto de teste que estava fazendo esta funcionando normal com parâmetros, ai neste projeto me deparei com este erro. Voltei para o outro para ver se era problema com o projeto e no outro o que eu já havia feito esta normal funcionando, porem se escrevo uma nova consulta também não funciona e ocorre este erro.
Ari Junior

Ari Junior

Curtidas 0

Respostas

Cleverson

Cleverson

06/11/2014

Amigo tenta jogar o SQL direto no componente da query, assim você só vai precisar usar Close e Open + os parâmetros.

EDIT: Lembrando que na propriedade SQL quando voce coloca os parametros >> INSERT INTO tbTeste (id, teste) VALUES (NULL, :Valor);
Ele ja cria corretamente (Assim como uso no Zeos :))

Bs
GOSTEI 0
Renato Rubinho

Renato Rubinho

06/11/2014

Buenos,

Já tentei fazer algo parecido no oracle, mas ainda não encontrei uma alternativa a não ser montar o comando todo com variáveis no delphi, sem parâmetros do sql, salvando na query já o comando com os campos e tabelas preenchidos.
Posta aí como você fez para funcionar para entender o que você fez para burlar a interpretação do sql.

Teoricamente não funciona porque você está passando um texto na identificação da tabela e do campo e, para o banco, deveriam ser passados "objetos".

Colando o comando com parâmetros desta forma no IBExpert também não funciona pelo mesmo problema.

SELECT :PCOD, DESCRICAO FROM :PTABELA ;


Abraççç,
Renato
GOSTEI 0
Francisco Camurça

Francisco Camurça

06/11/2014

porderia contatenar as string

consultaProblema(pk,tabela);

procedure consultaProblema(codtabela, tabela : string);
begin
  DM.cdsProblema.Close;
  with DM.qryProblema do
  begin
    SQL.Clear;
    SQL.Add('SELECT ' + codtabela + ' DESCRICAO ');
    SQL.Add(' FROM ' + tabela);
    Open;
  end;
  DM.cdsProblema.Open;
end;
GOSTEI 0
Renato Rubinho

Renato Rubinho

06/11/2014

Boa tarde Francisco,

Desse jeito foi a única forma que consegui fazer.
Mas usando em 3 camadas, a query está no servidor e gostaria apenas de passar os parâmetros para escolher os campos e tabela a serem utilizados.

Abraççç,
Renato
GOSTEI 0
POSTAR