我使用devart(corelab)的Mydac组件从Delphi(2006)访问MySql。
很多时候我需要使用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,它拥有并以这种方式释放了两个帮助对象。

(注意:我只使用MS Sql Server的DevArt组件,因此无法测试。代码很可能包含错误,但是总的思路可行。)

10-04 11:57