Fórum Missing Data provider or Data packet #13886
11/01/2010
0
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
Curtir tópico
+ 0Post mais votado
11/01/2010
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
Gostei + 1
Mais Posts
12/01/2010
Alexandro Oliveira
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 .
Gostei + 0
12/01/2010
Alexandro Oliveira
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 .
Gostei + 0
12/01/2010
Rodrigo Mourão
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!!!
Gostei + 1
14/01/2010
Rodrigo Mourão
Podemos encerrar o chamdo ???
No aguardo !!!
Abs!
Gostei + 0
14/01/2010
Alexandro Oliveira
At.Alex Oliveira
Gostei + 0
Clique aqui para fazer login e interagir na Comunidade :)