Преобразование набора данных TMyQuery в TClientDataSet в Delphi

StackOverflow https://stackoverflow.com/questions/405065

  •  03-07-2019
  •  | 
  •  

Вопрос

Я использую компоненты 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, поэтому не могу протестировать.Код вполне может содержать ошибки, но общая идея работает.)

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top