Fórum Parâmetros com DbExpress #333817

27/11/2006

0

oi pessoal...
esse erro é meio estranho
Tenho o seguinte

var
cds: TClientDataSet;
dsp: TDataSetProvider;
qe: TSQLQuery;

begin
//faz-se os creates...
dsp.DataSet := qe;
cds.SetProvider(dsp);

qe.SQL.Add(´select Codigo from Teste where Codigo = :Codigo´);
qe.ParamByName(´Codigo´).AsInteger := 1;
cds.Open; //FUNCIONA

cds.Close;
cds.SetProvider(dsp);
qe.SQL.Add(´select Codigo from Teste where Codigo = :Codigo and Codigo = :Codigo´);
qe.ParamByName(´Codigo´).AsInteger := 1;
cds.Open; //AQUI ACONTECE UM ERRO...
//Nenhum valor foi fornecido para um ou mais parâmetros necessários.

//faz-se os frees...
end;


Quer dizer... se eu usar dois parâmetros com o mesmo nome no segundo caso dá erro.
Mas se eu usar dois parâmetros com o mesmo nome no primeiro e segundo caso tudo funciona.
Se eu der um close em ´qe´ ao invés do ´cds´ também funciona. Só que isto não é correto e gera erro em outros momentos. Se eu der close nos dois componentes o erro persiste.

Se alguem puder me dar uma luz ficarei muito agradecido.


Miudo

Miudo

Responder

Posts

28/11/2006

Miudo

sobe


Responder

Gostei + 0

28/11/2006

Emerson Nascimento

a partir do momento que você trabalha com clientdatasets não é mais necessário - e nem recomendável - alterar a instrução do dataset origem (SQLDataset/SQLQuery/etc.) até porque, numa aplicação multicamadas, você não terá acesso à esses datasets.
segue um exemplo de uso, tomando como base o seu código:
var 
  cds: TClientDataSet; 
  dsp: TDataSetProvider; 
  qe: TSQLQuery; 
begin 
  //faz-se os creates... 
  dsp.DataSet := qe;
  dsp.Options := dsp.Options + [poCascadeDeletes, poCascadeUpdates, poAllowCommandText];
  // a opção AllowCommandText é que permite alterar a instrução no clientdataset.

  cds.SetProvider(dsp);
  // pronto. a partir de agora manipularemos somente o cds

  cds.commandtext := ´select Codigo from Teste where Codigo = :Codigo´;
  cds.Params.ParamByName(´Codigo´).AsInteger := 1;
  cds.Open; //FUNCIONA

  cds.Close;
  cds.CommandText := ´select Codigo from Teste where Codigo = :Codigo and Codigo = :Codigo´;
  cds.Params.ParamByName(´Codigo´).AsInteger := 1;
  cds.Open; //TAMBEM FUNCIONA... 

  //faz-se os frees...
end;



Responder

Gostei + 0

28/11/2006

Rogerioluz

Concordo plenamente com o Emerson. Fica muito mais fácil trabalhar com o CommandText direto no ClientDataset, pois a facilidade é muito maior e você não tem tantos erros de abertura.

Um Abraço...

Rogério Luz


Responder

Gostei + 0

28/11/2006

Miudo

oi pessoal

eu fiz dessa forma pois usando o comandtext acontece muitos erros
isso eu falo porque eu estou tentando converter todo o sistema da empresa para tirar o bde, e o sistema não é pequeno.

eu tenho uma lista de erros anotados aqui
resolvi um tanto... mas agora apareceu este que eu já sei como resolver
é só antes do open colocar um cds.Params.Clear

nas minhas pesquisas, pessoas desse fórum até... indicaram eu não usar o ClientDataSet dessa forma pois o MIDAS tinhas alguns bugs realmente e era melhor evita-los

versões de DLLs tambem tem diferenças etc... realmente usando dessa forma que eu estou usando me poupou de alguns bugs.

mas de qualquer forma estou sempre presisando de algumas dicas...


Responder

Gostei + 0

28/11/2006

Emerson Nascimento

bom, eu trabalho com um sistema distribuído (multicamadas, COM+/DataSnap/Socket)

esse sistema tem por volta de 850 forms (entre telas de entradas de dados e relatórios). há clientes que utlizam o sistema em 10, 15 filiais simultaneamente (um servidor alocado na matriz com acesso on-line).

todo o sistema é feito com o uso da alteração do clientdataset ao invés do sqldataset (optamos por esse, ao invés de sqlquery). o sistema está no ar há mais de 3 anos. não dá problema algum no MIDAS. nunca sequer ouvi falar disso.
até porque, como eu disse, no caso de sistemas distribuídos (o meu caso) não se tem acesso ao sqldataset, pois ele está no aplicativo servidor, e não no cliente. dessa forma só consigo alterar o clientdataset e nunca tive qualquer problema.

se um dia você tiver intenção de passar seu sistema de 2 camadas para n-camadas, você terá, mais uma vez, uma grande mão-de-obra...


Responder

Gostei + 0

28/11/2006

Miudo

muito bom emerson
muito bom mesmo você ter me falado isso
eu começei a testar o MIDAS com duas camadas e encontrei alguns problemas no caminho, talvez por falta de maturidade.
Cheguei a achar que ninguem usava isso em um sistema relativamente grande
você foi o primeiro que me falou isso.
você usa que banco de dados?
que versão do delphi?
tem uma diferença entre MIDAS e dbExpress...
você usa o BDE?
e esse sistema foi feito do zero ou já existia e vocês colocaram para funcionar em duas camadas?

estou querendo muito saber essas respostas...
talvez seja uma nova direção pra mim...


Responder

Gostei + 0

28/11/2006

Emerson Nascimento

o primeiro sistema era no bom e velho Clipper.
depois foi migrado para Delphi (7) em duas camadas, o meu segmento de trabalho requer o acesso de muitas filiais. com isso tivemos que criar um módulo de transferência de dados, mas isso gerava muitos problemas, pois nem sempre as filiais sincronizavam os dados.

devido a esse problema optamos por utilizar um sistema on-line. isso se tornou mais fácil com a oferta de banda larga e também o custo/benefício de ter os dados atualizados em tempo-real. com isso foi desenvolvido um sistema a partir do zero, multicamadas, COM+, utilizando DataSnap/MIDAS.

o sistema trabalha independente do banco de dados, desde que seja um banco de dados relacional (MS-SQL, Interbase, Firebird, Oracle, etc)

DataSnap/MIDAS e dbExpress são complementares. o dbExpress faz a conexão com o banco de dados e o DataSnap/MIDAS permite a distribuição disso, possibilitando o acesso n-camadas.

BDE???? Deus que me livre!!!

se você fizer as alterações no seu sistema da forma que eu falei, ficará muito fácil você migrá-lo para multicamadas. na verdade eu recomendo que você já faça isso: além de tirar o BDE, transforme-o em multicamadas. vai ficar muito bom. você não irá se arrepender.


Responder

Gostei + 0

28/11/2006

Miudo

valeu...
valeu mesmo
mas minha situação é que tenho que converter um sistema que já está em delphi e que é impossível sair reencrevendo o código todo.
Impossível analizar tela por tela...
é muito mais que 800...

estou tendo que varrer todos os .pas e dfm, criando novos componentes e substituindo os antigos pelos novos com um programa.
mascarando assim todos os componentes necessários para converter de um delphi pro outro e tirar o BDE.

então o controle de transação fica muito complicado... os recursos novos do clientdataset tem que ser ignorados e muitos outros problemas que acontecem... relatórios...

mas é bom saber disso ai que você falou
muito obrigado


Responder

Gostei + 0

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

Aceitar