GARANTIR DESCONTO

Fórum Missing Data provider or Data packet #13886

11/01/2010

0

Boa noite Rodrigo, meu Mestre estou tendo o determinado problema , criei um Class (TSQL)para fazer consulta simples ultizando o ClientDataSet em Tempo de Excução mais estou tendo o seguinte erro quanto tendo dar um open no ClientDataSet "Missing Data provider or Data packet" Segue embaixo o codigo que estou usando.

unit Utpersis;

interface

uses DBClient, DB, SqlExpr,Provider;

type
   TSQL = class
private
  { private declarations }
  FQuery :TSQLQuery;
  FClient:TClientDataSet;
  FProv  :TProvider;
protected
  { protected declarations }
public
  { public declarations }
  constructor Create(cSQL:TSQLConnection);
  destructor  Destroy; override;

  procedure Select(ds:TDataSource);
end;

implementation

{ TSQL }

constructor TSQL.Create(cSQL:TSQLConnection);
begin
     Inherited Create;

      FQuery :=TSQLQuery.Create(nil);
      FClient:=TClientDataSet.Create(nil);
      FProv  :=TProvider.Create(nil);

      FQuery.SQLConnection:=cSQL;

      FProv.DataSet:=FQuery;
      FProv.Name:='MY_PROVIDER';
      FProv.Options:=[poAllowCommandText];

      FClient.ProviderName:=FProv.Name;

end;

destructor TSQL.Destroy;
begin
  FQuery.Free;
  FQuery:=nil;

  FClient.Free;
  FClient:=nil;

  FProv.Free;
  FProv:=nil;

  inherited;
end;

procedure TSQL.Select(ds:TDataSource);
begin
     FClient.Close;
     FClient.CommandText:='SELECT * FROM UCTABUSERS';
     C.Open;
    
     ds.DataSet:=FClient;
end;

end.

At.Alex Oliveira
Alexandro Oliveira

Alexandro Oliveira

Responder

Post mais votado

11/01/2010

Olá Amigo,

Tudo esta perfeito mas e uma pegadinha do delphi.

constructor TSQL.Create(cSQL:TSQLConnection);
begin
     Inherited Create;

      FQuery :=TSQLQuery.Create(nil);
      FClient:=TClientDataSet.Create(nil);
      FProv  :=TProvider.Create(nil);

      FQuery.SQLConnection:=cSQL;

      FProv.DataSet:=FQuery;
      FProv.Name:='MY_PROVIDER';
      FProv.Options:=[poAllowCommandText];

      FClient.ProviderName:=FProv.Name; --Errado
     
      FClient.SetProvider(FProv); Correto.
     

end;


Teste e me diga se funcionou !!!

Abs!!!!

Rodrigo Mourão

Rodrigo Mourão
Responder

Gostei + 1

Mais Posts

12/01/2010

Alexandro Oliveira

Rodrigo se é fera , campeão funcionou perfeito  so que ai apareceu o segundo problema xD , pois depois dos componentes instanciados na minha memoria e ja criado quero  usar  a procedure abaixo para fazer minha pesquisar,
mais quanto faço isto , aparece novamente o erro acima citado "Missing Data provider or Data packet"

Como este Metodo so funciona a primeira vez que eu o execudo e ai o erro não sai mais

procedure TSQL.Select(ds:TDataSource);
begin

     FClient.Close;
     FClient.CommandText:='SELECT * FROM UCTABUSERS';
     FClient.Open;

     ds.DataSet:=FClient;
end;


Mais quanto faço assim   Colocando o SetProvider(FProv) o erro aparece uma vez sim e outra vez não

procedure TSQL.Select(ds:TDataSource);
begin
      FClient.SetProvider(FProv);


     FClient.Close;
     FClient.CommandText:='SELECT * FROM UCTABUSERS';
     FClient.Open;

     ds.DataSet:=FClient;
end;

Bom com este codigo eu quero tipo fazer um Consulta, mais não quero que os Dados suma do DBGrid no SQLQUERY Funcionar Perfeitamente mais como este Componente não vai ne com Reza, por algum motivo esta perdendo a referencia, ainda não descobrir qual é o pulo do gato .



Responder

Gostei + 0

12/01/2010

Alexandro Oliveira

Rodrigo se é fera , campeão funcionou perfeito  so que ai apareceu o segundo problema xD , pois depois dos componentes instanciados na minha memoria e ja criado quero  usar  a procedure abaixo para fazer minha pesquisar,
mais quanto faço isto , aparece novamente o erro acima citado "Missing Data provider or Data packet"

Como este Metodo so funciona a primeira vez que eu o execudo e ai o erro não sai mais

procedure TSQL.Select(ds:TDataSource);
begin

     FClient.Close;
     FClient.CommandText:='SELECT * FROM UCTABUSERS';
     FClient.Open;

     ds.DataSet:=FClient;
end;


Mais quanto faço assim   Colocando o SetProvider(FProv) o erro aparece uma vez sim e outra vez não

procedure TSQL.Select(ds:TDataSource);
begin
      FClient.SetProvider(FProv);


     FClient.Close;
     FClient.CommandText:='SELECT * FROM UCTABUSERS';
     FClient.Open;

     ds.DataSet:=FClient;
end;

Bom com este codigo eu quero tipo fazer um Consulta, mais não quero que os Dados suma do DBGrid no SQLQUERY Funcionar Perfeitamente mais como este Componente não vai ne com Reza, por algum motivo esta perdendo a referencia, ainda não descobrir qual é o pulo do gato .



Responder

Gostei + 0

12/01/2010

Rodrigo Mourão

Olá Amigo,

O problema pode não esta no set provider.

Você esta utilizando um unico CDS, DSP e SqlDataSet Certo? Eu faria diferente, eu criaria e destruiria sempre que vc chamar. Experimente criar duas procedures:  CriaDataSet, DestroiDataSet. Na cria você faz:


      FQuery :=TSQLQuery.Create(nil);
      FClient:=TClientDataSet.Create(nil);
      FProv  :=TProvider.Create(nil);

      FQuery.SQLConnection:=cSQL;

      FProv.DataSet:=FQuery;
      FProv.Name:='MY_PROVIDER';
      FProv.Options:=[poAllowCommandText];
      FClient.SetProvider(FProv);


Ja na Destroi faria:

   freeandnil(FQuery);
   freeandnil(FClient);
   freeandnil(FProv);

Agora nas rotinas poderia fazer:

     CriaDataSet;
     FClient.CommandText:='SELECT * FROM UCTABUSERS';
     ds.DataSet:=FClient;    
     FClient.Open;

Se quiser poderia destruir aqui !!!!


Agora lembre-se que ainda sim estaremos com uma unica referência, então se vc não destruir e chamar a rotina criadataset de novo a referencia entiga será sobrescrita. Para poder criar varias consultas ao memso tempo então terá que criar dos data set dentro das funcção com variaceis locais.

Abs!!!



Responder

Gostei + 1

14/01/2010

Rodrigo Mourão

Olá Amigo,

Podemos encerrar o chamdo ???

No aguardo !!!

Abs!

Responder

Gostei + 0

14/01/2010

Alexandro Oliveira

sim meu amigo , muito obrigado pela ajudar
 

At.Alex Oliveira
Responder

Gostei + 0

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

Aceitar