Преобразование набора данных TMyQuery в TClientDataSet в Delphi
Вопрос
Я использую компоненты Mydac от devart (corelab) для доступа к MySQL из Delphi (2006) Очень часто мне приходится работать с данными в наборе TClientDataSet Каков наилучший способ преобразовать набор данных TMyQuery в TClientDataSet В настоящее время я использую
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;
Есть ли лучший способ сделать это ?
Решение
Если вам действительно это нужно очень часто, то сделайте это функцией, вот так:
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;
Эту функцию вы можете использовать везде вместо TClientDataSet.Create(), и если не возникнет исключение, вам будет предоставлен открытый TClientDataSet, который владеет и таким образом также освобождает два вспомогательных объекта.
(Примечание:Я использую только компоненты DevArt для MS Sql Server, поэтому не могу протестировать.Код вполне может содержать ошибки, но общая идея работает.)