我使用devart(corelab)的Mydac组件从Delphi访问MySql(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,这样也可以释放两个辅助对象.
(注意:我只对MS Sql Server使用DevArt组件,所以我无法测试.代码可能包含错误,但总体思路有效.)