Parâmetros com DbExpress
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.
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
Curtidas 0
Respostas
Miudo
27/11/2006
sobe
GOSTEI 0
Emerson Nascimento
27/11/2006
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:
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;
GOSTEI 0
Rogerioluz
27/11/2006
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
Um Abraço...
Rogério Luz
GOSTEI 0
Miudo
27/11/2006
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...
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...
GOSTEI 0
Emerson Nascimento
27/11/2006
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...
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...
GOSTEI 0
Miudo
27/11/2006
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...
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...
GOSTEI 0
Emerson Nascimento
27/11/2006
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.
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.
GOSTEI 0
Miudo
27/11/2006
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
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
GOSTEI 0