Problemas ao executar ClientDataSet em tempo de execução

18/09/2004

tenho o seguinte trecho de codigo

type

TPesquisa = class(TObject)
public
DataSource: TDataSource;
qry: TSQLQuery;
dsp: TDataSetProvider;
cds: TClientDataSet;

constructor Create;
function Pesquisar(): Integer;
end;

implementation

{ TPesquisa }

uses dmpoo;

constructor TPesquisa.Create;
begin
qry := TSQLQuery.Create(Nil);
DataSource := TDataSource.Create(Nil);
dsp := TDataSetProvider.Create(Nil);
cds := TClientDataSet.Create(Nil);

qry.SQLConnection := DataModule1.SQLConnection1;
DataSource.DataSet := cds;
dsp.DataSet := qry;
cds.ProviderName := dsp.Name;
end;

function TPesquisa.Pesquisar(): Integer;
begin
cds.Close;
qry.SQL.Add(´SELECT * FROM TAB_PESSOA´);
cds.ProviderName := dsp.Name;
cds.Open;
result := 1;
end;


quando instancio o objeto e executo o metodo pesquisar... é retornada a exceção:

MISSING DATA PROVIDER OR DATA PACKET

Gostaria que alguém me sugerisse uma solução...
Ou apontasse o problema em meu código...

Abraços a todos
Daniel Nascimento


Danielnascimento

Respostas

18/09/2004

Beppe

Solução: Atribua um nome único ao TDataSetProvider.
dsp.Name := ´MeuProvedor´;

Racionalização: Em tempo de projeto, quando você insere um componente ou controle no formulário, a IDE do Delphi gera um nome automáticamente a ele. Quando você o cria via código, ele é criado sem nome.

PS: Pelo trecho de código que você apresentou, está esquecendo de liberar os componentes. Se você não o faz no destruidor, pode passar Self no construtor de cada componente de dados, assim eles são liberados automaticamente com a sua instância de TPesquisa.


Responder Citar

18/09/2004

Danielnascimento

constructor TPesquisa.Create;
begin
qry := TSQLQuery.Create(Nil);
DataSource := TDataSource.Create(Nil);
dsp := TDataSetProvider.Create(Nil);
cds := TClientDataSet.Create(Nil);
qry.SQLConnection := DataModule1.SQLConnection1;
dsp.Name := ´DataSetProviderTeste´;
dsp.DataSet := qry;
cds.ProviderName := dsp.Name;
DataSource.DataSet := cds;
end;

function TPesquisa.Pesquisar(): Integer;
begin
cds.Close;
qry.SQL.Add(´SELECT * FROM TAB_PESSOA´);
cds.Open;
result := 1;
end;

a correção foi realizada conforme sugerido...


porém o erro descrito no 1 post ainda persiste

[]s
Daniel Nascimento


Responder Citar

18/09/2004

Beppe

a correção foi realizada conforme sugerido...

Sério? Ainda estou vendo os [b:c1ac77b092]nil [/b:c1ac77b092]no lugar... :?

Mude de [b:c1ac77b092]nil [/b:c1ac77b092]para Self ao menos no construtor do provedor e do dataset cliente. Simulei seu exemplo e rodou perfeitamente assim.


Responder Citar

18/09/2004

Danielnascimento

unit tstPOO;

interface

uses
SysUtils, Classes, DBXpress, DB, SqlExpr, FMTBcd, Provider, DBClient;

type

TPesquisa = class(TObject)
public
DataSource: TDataSource;
qry: TSQLQuery;
dsp: TDataSetProvider;
cds: TClientDataSet;

constructor Create;
destructor Destroy; Override;
function Pesquisar(): Integer;
end;

implementation

{ TPesquisa }

uses dmpoo;

constructor TPesquisa.Create;
begin
qry := TSQLQuery.Create(nil);
DataSource := TDataSource.Create(nil);
dsp := TDataSetProvider.Create(nil);
cds := TClientDataSet.Create(nil);
qry.SQLConnection := DataModule1.SQLConnection1;
dsp.Name := ´DataSetProviderTeste´;
dsp.DataSet := qry;
cds.ProviderName := dsp.Name;
DataSource.DataSet := cds;
end;

destructor TPesquisa.Destroy;
begin
qry.Free;
DataSource.Free;
dsp.Free;
cds.Free;
inherited;
end;

function TPesquisa.Pesquisar(): Integer;
begin
cds.Close;
qry.SQL.Add(´SELECT * FROM TAB_PESSOA´);
cds.Open;
result := 1;
end;

end.


Amigo ai está a unit do objeto!!!

bem modifiquei o objeto qry, e cds, para

qry := TSQLQuery.Create(Self)
e
cds := TClientDataSet.Create(Self)

e a seguinte mensagem ocorreu!!!

Incompatibles types... TComponent and TPesquisa...


ou seja tipos incompatíves....

Como vc havia sugerido criei tb o destrutor destruindo os objetos criados...!!!! acho que agora esta ok... porem o erro permanede :shock:
ja nao tenho mais ideias do que realizar...

não seria pedir demais para vc listar o código que vc esta testando ai??
Agradeço pela sua ajuda Beppe... esta sendo de grande valia!!!


[]s
Daniel Nascimento


Responder Citar

19/09/2004

Beppe

Me desculpe...eu fiz o teste destro do TForm1, mas criando os componentes via código, como você fez. Não cheguei a testar com um derivado direto de TObject, como é TPesquisa.

Eu tinha sugerido duas alternativas para efetuar o controle da memória(os componentes que nunca eram liberados). Uma delas resolve o seu problema que você relatou, então aconselho a fazer isto.

Primeiro, descenda TPesquisa de TComponent. Assim poderá passá-lo como proprietário dos outros componentes, e de quebra fazer o ´memory management´.

Segundo, remova o destruídor. A liberação de componentes é feita automática no seu caso, ao destruir a instância de TPesquisa.

Se ficou alguma dúvida, poste aí.


Responder Citar

19/09/2004

Danielnascimento

Olá beepe...


cara valeu pela ajuda...

deu certinho aqui...

to te devendo essa!!!

[]s
Daniel Nascimento


Responder Citar

19/09/2004

Beppe

Estamos aqui pra isso! :wink:


Responder Citar

18/12/2004

Christian_adriano

Olá Colega ´Beppe´,

Estou com um ´probleminha´, estou criando um CDS (TClientDataSet) em tempo de execução, até ae tudo bza, só q quero ´Atribuir o DataSetProvider´ que está ´ligado´ com um DBEdit.

Tentei o seguinte:

FQrPesquisa.ProviderName := TClientDataSet(FZCampo.DataSource.DataSet).ProviderName;

Onde:
FQrPesquisa = TClientDataSet;
FZCampo = TDBEdit;

Obs. No campo ´FZCampo´ esta ´ligado´ com DataSource q está ligado em um outro CDS. Só quero pegar o DataSetProvider desse CDS que esta ´ligado´ com o TDBEdit (FZCampo).

Desde de já agradeço atenção.

[]´s.

Christian.


Responder Citar

20/12/2004

Rômulo Barros

Acredito q você ainda não tenha solucionado o problema.
Para linkar o DataSetProvider ao ClientDataSet, faça:

ClientDataSet.SetProvider(DataSetProvider);


[color=red:17abae164b][b:17abae164b]No seu caso, ficaria assim:[/b:17abae164b][/color:17abae164b]

Cds.SetProvider(Dsp);


:arrow: [i:17abae164b][b:17abae164b]Espero ter esclarecido a situação.[/b:17abae164b][/i:17abae164b]


Responder Citar