Convertir un conjunto de datos de consulta a ClientDataSet en Delphi
Pregunta
Hago uso de los componentes Mydac de devart (corelab) para acceder a MySql desde Delphi (2006) Muy a menudo necesito trabajar con datos en un TClientDataSet ¿Cuál es la mejor manera de convertir el conjunto de datos de un TMyQuery a TClientDataSet? Actualmente estoy 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;
¿Hay una mejor manera de hacer esto?
Solución
Si realmente lo necesita muy a menudo, entonces conviértalo en una función, de este modo:
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 función se puede usar en todos los lugares en lugar de TClientDataSet.Create () y, a menos que se genere una excepción, se le dará un TClientDataSet abierto que posee y de esa manera también libera los dos objetos auxiliares.
(Nota: solo uso los componentes DevArt para MS Sql Server, por lo que no puedo realizar pruebas. El código puede contener errores, pero la idea general funciona).