请问怎样把TADOQuery查询到的结果复制到 TClientDataSet中?

打酱油的无证程序猿 2011-01-16 01:08:18
俺想用TADOQuery取到数据后,立即断开数据库连接。

所以希望能用TClientDataSet来保存 TADOQuery查询到的结果集,

请问怎样实现?谢谢各位大侠。。。
...全文
578 14 打赏 收藏 转发到动态 举报
写回复
用AI写文章
14 条回复
切换为时间正序
请发表友善的回复…
发表回复
linghengmao 2011-01-18
  • 打赏
  • 举报
回复
DataSetProvider.dataset:= adoquery.
adoquery.open;

clientdataset.data:= DataSetProvider.data;

這樣你就可以關閉adoquery也不會有問題了。
  • 打赏
  • 举报
回复
[Quote=引用 10 楼 ray2312 的回复:]
说实话,没那必要。。。Ado.net的DataTable就等于delphi的DataSet了。。除非你自己写一个控件去封装。。
[/Quote]

Ado.net的DataTable 和delphi的DataSet不一样吧,

delphi的DataSet不能断开数据库吧

  • 打赏
  • 举报
回复
[Quote=引用 9 楼 pengxuan 的回复:]
事先定义ClientDataSet中的字段和类型
adoquery取出来后,循环append到ClientDataSet中
[/Quote]

可以是可以,就是太麻烦,

还是ADO.NET 中的DataSet和DataTable 好啊。
Ray2312 2011-01-18
  • 打赏
  • 举报
回复
说实话,没那必要。。。Ado.net的DataTable就等于delphi的DataSet了。。除非你自己写一个控件去封装。。
pengxuan 2011-01-18
  • 打赏
  • 举报
回复
事先定义ClientDataSet中的字段和类型
adoquery取出来后,循环append到ClientDataSet中
  • 打赏
  • 举报
回复
我想要 C#.net的 DataTable ,DataSet的那种效果,

就是 ADO.NET 中的DataSet和DataTable

Ray2312 2011-01-16
  • 打赏
  • 举报
回复
而且如果你只是想要断开数据库连接的话,并不需要用到cds的。。
你直接把adoquery的LockType换成ltBatchOptimistic即可
Ray2312 2011-01-16
  • 打赏
  • 举报
回复
对,需要定义字段先。。因为我个人的习惯字段全是英文的,所以都需要先定义字段设定displaytext,简单来说,你可以直接在ADOQUERY里面新增字段,然后把这些字段复制到CDS里面去,再删除ADO对应的字段即可。。
如果不想定义字段的话,用第一种方式会比较简单。。
Jekhn 2011-01-16
  • 打赏
  • 举报
回复
哦不好意思,我错了,这样不行ADO Close以后就没有数据了。
Jekhn 2011-01-16
  • 打赏
  • 举报
回复
ClientDataSet1 := TClientDataSet(ADOQuery1);
ADOQuery1 := TADOQuery(ClientDataSet1 );
其实这两个是可以相互转换的,两个同样继承于TDataSet所以可以这样转换,可以保存你想要的数据,具体你测试一下就知道了。
  • 打赏
  • 举报
回复
第二种方法要先在TClientDataSet中定义各个字段及其类型吧?
Ray2312 2011-01-16
  • 打赏
  • 举报
回复
如果仅仅是本地取数,不需要Post直接提交数据库的话,个人比较推荐第二种方法。。
Ray2312 2011-01-16
  • 打赏
  • 举报
回复
两种方法。。
1、加TDataSetProvider,这个我就不多说了。。随便查查都能查到。。
2、遍历Adoquery的数据,插入Cds.给你段代码。。
Qry1.Open;
with CdsDetail do
begin
DisableControls;
try
CreateDataSet;
Qry1.First;
while not Qry1.Eof do
begin
Append;
for I := 0 to FieldCount - 1 do
Fields[i].Value := Qry1.FieldByName(Fields[i].FieldName).Value;
Qry1.Next;
end;
if State in dsEditModes then Post;
MergeChangeLog;
finally
EnableControls;
Qry1.Close;
end;
end;
unit uMain; interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls, Mask, RzEdit, RzButton, ExtCtrls, IniFiles, RzTabs, ComCtrls, RzListVw, RzShellCtrls, ImgList, RzShellDialogs, RzCmboBx, QRCtrls, QuickRpt, jpeg, ShlObj, RzPanel, RzSplit, RzTreeVw, DB, ADODB, Provider, DBClient, GridsEh, DBGridEh, RzStatus; type PShellItem = ^TShellItem; TShellItem = record FullID, ID: PItemIDList; Empty: Boolean; DisplayName, TypeName: string; ImageIndex, Size, Attributes: Integer; ModDate: string; end; TfrmMain = class(TForm) RzPageControl1: TRzPageControl; TabSheet1: TRzTabSheet; TabSheet2: TRzTabSheet; lbl1: TLabel; edt_Path1: TRzEdit; btn_o2: TButton; Button1: TButton; SplPreview: TRzSplitter; img1: TImage; RzToolbar1: TRzToolbar; RzSpacer1: TRzSpacer; ClientDS_PicCap: TClientDataSet; DataSP_PicCap: TDataSetProvider; Qry_PicCap: TADOQuery; Ds_PicCap: TDataSource; DBGridEh1: TDBGridEh; ClientDataSetH: TClientDataSet; DataSetProviderH: TDataSetProvider; QueryH: TADOQuery; DataSourceH: TDataSource; RzBtn_0: TRzBitBtn; RzBtn_1: TRzBitBtn; ImageList1: TImageList; Memo1: TMemo; ClientDS_PicCapacc_id_only: TStringField; ClientDS_PicCapname: TStringField; ClientDS_PicCapplate_num: TStringField; ClientDS_PicCapplate_type: TStringField; ClientDS_PicCapInsDate: TDateTimeField; ClientDS_PicCapAcc_ID_Only_1: TStringField; ClientDS_PicCapfDateTime: TDateTimeField; ClientDS_PicCapPicturePath1: TStringField; ClientDS_PicCapPicturePath2: TStringField; ClientDS_PicCapPicturePath3: TStringField; ClientDS_PicCapPicturePath4: TStringField; ClientDS_PicCapPicturePath5: TStringField; ClientDS_PicCapPicturePath6: TStringField; ClientDS_PicCapPicturePath7: TStringField; ClientDS_PicCapPrintCount: TIntegerField; ClientDataSetHAutoID: TAu

2,498

社区成员

发帖
与我相关
我的任务
社区描述
Delphi 数据库相关
社区管理员
  • 数据库相关社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧