Convertendo um conjunto de dados de consulta para ClientDataSet em Delphi
Pergunta
I fazer uso dos componentes MyDAC por devart (corelab) para acessar o MySQL de Delphi (2006) Muitas vezes eu preciso trabalhar com dados em um TClientDataSet Qual é a melhor maneira de converter o conjunto de dados de um TMyQuery para TClientDataSet Atualmente estou usando
var
MyQuery : TMyQuery;
Dsp : TDataSetProvider;
Cds : TClientDataSet;
begin
MyQuery := nil;
Dsp := nil;
Cds := nil;
try
MyQuery := TMyQuery.Create(nil);
Dsp := TDataSetProvider.Create(nil);
Cds := TClientDataSet.Create(nil);
MyQuery.Connection := TheConnection;
MyQuery.SQL.Text := CmdStr;
Dsp.DataSet := MyQuery;
Cds.SetProvider(Dsp);
Cds.Open;
////////////////////////////////////////////////////////////////////////
/// MAKE USES OF THE CDS //
////////////////////////////////////////////////////////////////////////
finally
FreeAndNil(Cds);
FreeAndNil(Dsp);
FreeAndNil(MyQuery);
end;
end;
Existe uma maneira melhor de fazer isso?
Solução
Se você realmente precisa fazer isso muito frequentemente, em seguida, torná-lo uma função, assim:
function CreateAndOpenClientDataset(AOwner: TComponent;
AConnection: TConnection; ACommand: string): TClientDataSet;
var
MyQuery: TMyQuery;
Dsp: TDataSetProvider;
begin
Result := TClientDataSet.Create(AOwner);
try
MyQuery := TMyQuery.Create(Result);
MyQuery.Connection := AConnection;
MyQuery.SQL.Text := ACommand;
Dsp := TDataSetProvider.Create(Result);
Dsp.DataSet := MyQuery;
Result.SetProvider(Dsp);
Result.Open;
except
Result.Free;
raise;
end;
end;
Esta função pode ser usado em todos os lugares em vez de TClientDataSet.Create (), ea menos que uma exceção é lançada, você será dado um TClientDataSet aberto que possui e dessa forma também libera os dois objetos auxiliares.
. (Nota: Eu só uso os componentes devart para MS SQL Server, por isso não posso testar o código pode muito bem conter erros, mas a idéia obras gerais.)