Parametros do Client Data Set somem em tempo de execução

Delphi

15/06/2004

Meu Cliente Data Set funciona corretamente durante o desenvolvimento, porém em tempo de execução, ocorre um erro dizendo que não foi possível encontrar os parametros, testando percebi que o ParamsCount retorna zero, alguem sabe porque ele não esta conseguindo enchergar o parametro?

with CDSInspCada do
begin
Close;
CommandText := ´select tbinspecao.* from tbinspecao where (tbinspecao.cnpjempr = :Pcnpj) and (tbinspecao.nomeseto = :Psetor) and (tbinspecao.logiexecinsp = :Plogin) and (tbinspecao.datainsp = :Pdata);´;
FetchParams;
Params.ParamByName(´Pcnpj´).AsString := CNPJ;
Params.ParamByName(´Psetor´).AsString := Setor;
Params.ParamByName(´Plogin´).AsString := Login;
Params.ParamByName(´Pdata´).AsSQLTimeStamp := StrToSQLTimeStamp(Data);
try
Open;
result := True;
except
Cancel;
result := False;
end;

ERRO: ...CDSInspCada: Parameter ´Pcnpj´ not found. Process stoped...


Carvajal

Carvajal

Curtidas 0

Respostas

Paulo_amorim

Paulo_amorim

15/06/2004

Olá

Antes de abrir um ClientDataSet, recomenda-se dar um comando para fazer um ´retrieve´ nos parametros.

Portanto, antes de qualquer Open, execute, etc. coloque a procedure
ClientDataSet.FetchParams;


Isso deve resolver
Até+


GOSTEI 0
Carvajal

Carvajal

15/06/2004

O comando FetchParams consta no código acima, pode ser que esteja mal declarado ou em lugar indevido, vc poderia me orientar caso ainda tenha mais sugestões, tenho apanhado um cado.

Obrigado pela atenção.


GOSTEI 0
Paulo_amorim

Paulo_amorim

15/06/2004

Olá

Desculpa, passei batido pelo FetchParams...

Como vc seta um CommandText, vc já tentou TIRAR o FetchParams?
Pode ser daí que some...

Só Tentando...
Até+


GOSTEI 0
Tec.doido

Tec.doido

15/06/2004

tente carregar os parametros primeiro !!!
with CDSInspCada do 
begin 
Close; 
FetchParams; 
Params.ParamByName(´Pcnpj´).AsString := CNPJ; 
Params.ParamByName(´Psetor´).AsString := Setor; 
Params.ParamByName(´Plogin´).AsString := Login; 
Params.ParamByName(´Pdata´).AsSQLTimeStamp := StrToSQLTimeStamp(Data); 
CommandText := ´select tbinspecao.* from tbinspecao where (tbinspecao.cnpjempr = :Pcnpj) and (tbinspecao.nomeseto = :Psetor) and (tbinspecao.logiexecinsp = :Plogin) and (tbinspecao.datainsp = :Pdata);´; 
try 
Open; 
result := True; 
except 
Cancel; 
result := False; 
end; 

pode ser que resolva.


GOSTEI 0
Dopi

Dopi

15/06/2004

Pelo que notei no seu código. Voce está criando uma consulta SQL no ComandText do ClientDataSet que deve estar ligado a um DataSetProvider com a propriedade AlowCommandText em True....

Sendo assim... não há necessidade de FetchPamaters, pois os paramatros estão sendo defindos no CommandText do ClientDataSet (local)... Use o FetchParameters apenas para pegar os paramteros de uma linha de SQL definida lá no SQLDataSet (remoto)...


GOSTEI 0
Carvajal

Carvajal

15/06/2004

Pelo que percebi, tenho muito a aprender sobre componentes de acesso a Banco de Dados, mas me ajudaria muito se alguem me orientesse como passo um valor absoluto do tipo data numa instrução SQL, estou usando assim e esta dando um erro:

...
where tabela.campodata = #01/01/2004 00:00:00;

Já tentei Data e Data com Hora, com e sem ´´, a base q utilizo é Interbase com acosso DBExpress.

Ate mais galera


GOSTEI 0
Dopi

Dopi

15/06/2004

Essa linha:

Params.ParamByName(´Pdata´).AsSQLTimeStamp := StrToSQLTimeStamp(Data);

Ou

Params.ParamByName(´Pdata´).AsDateTime := now

não funcionaram ?

Não é recomendado passar a data como uma String... pois o formato da Data pode variar de um Sistema Operacional para outro ou de um Banco de Dados para Outro... Com isso o seu programa pode deixar de funcionar em alguns ambientes... Usando ParamByName é mais seguro...


GOSTEI 0
Carvajal

Carvajal

15/06/2004

Desenvolvia utilizando Access e BDE, resolvi mudar para Interbase com DBExpress, e agora tamo aí, suando...

Valeu a dica qto ao uso de strings em SQL, não sabia deste incoveniente, mas quanto o meu problema:

A real é que o problema não chega a ser com o campo do tipo data, este sei que ainda terei que encarar, o fato é que quando tento ativar meu ClientDataSet ele diz que não encontra o 1º parametro, cheguei a excluir o criterio de data e manter os demais, que são string, mesmo assim os params nao foram encontrado, cheguei a checar a qtde de params que ele encherga e deu zero, foi quando...

Num comentario sobre este assunto percebi que os ClientDataSet deveriam se conectar aos DataSetProvider, e ai pensei q como os meus se conectam diretamente ao SQLConnection (o q deve estar errado), poderia ser esse o motivo do erro, resolvi entao rever o organização dos meu componentes de acesso, alguma sugestão?

Qualquer força será bem vinda

Obrigado pela ajuda


GOSTEI 0
Paulo_amorim

Paulo_amorim

15/06/2004

Olá

ClientDataSet - DataSetProvider - DataSet (query, table, etc.)

Essa ligação he a mais aconselhavel...
Se os cds e os providers estão em lugares diferentes, use a procedure
SetProvider
para especificar o provider do cara...

Espeor que ajude
Até+


GOSTEI 0
Carvajal

Carvajal

15/06/2004

O erro era a estruturação dos meus componentes de acesso a dados (utilizando o dbExpress), seguindo a sujestão proposta (SQLConnection - Query - DataSetProvider - ClienteDataSet), consegui realizar consultas parametrizadas sem problemas

Valeu mesmo galera


GOSTEI 0
POSTAR