Conversion d'un ensemble de données de requête en ClientDataSet dans Delphi
Question
Je me sers des composants Mydac de devart (corelab) pour accéder à MySql depuis Delphi (2006). Très souvent, j'ai besoin de travailler avec des données dans un TClientDataSet Quel est le meilleur moyen de convertir l'ensemble de données d'un TMyQuery en TClientDataSet J'utilise actuellement
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;
Y a-t-il une meilleure façon de faire cela?
La solution
Si vous en avez vraiment besoin très souvent, faites-en une fonction, comme suit:
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;
Cette fonction que vous pouvez utiliser partout au lieu de TClientDataSet.Create (), et à moins qu'une exception ne soit déclenchée, un TClientDataSet ouvert, qui en est le propriétaire, libère les deux objets d'assistance.
(Remarque: je n'utilise que les composants DevArt pour MS Sql Server. Je ne peux donc pas tester. Le code peut très bien contenir des erreurs, mais l'idée générale fonctionne.)