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

时间:2021-02-09 04:28:22
俺想用TADOQuery取到数据后,立即断开数据库连接。

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

请问怎样实现?谢谢各位大侠。。。

14 个解决方案

#1


两种方法。。
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;

#2


如果仅仅是本地取数,不需要Post直接提交数据库的话,个人比较推荐第二种方法。。

#3


第二种方法要先在TClientDataSet中定义各个字段及其类型吧?

#4


ClientDataSet1 := TClientDataSet(ADOQuery1);
ADOQuery1 := TADOQuery(ClientDataSet1 );
其实这两个是可以相互转换的,两个同样继承于TDataSet所以可以这样转换,可以保存你想要的数据,具体你测试一下就知道了。

#5


哦不好意思,我错了,这样不行ADO Close以后就没有数据了。

#6


对,需要定义字段先。。因为我个人的习惯字段全是英文的,所以都需要先定义字段设定displaytext,简单来说,你可以直接在ADOQUERY里面新增字段,然后把这些字段复制到CDS里面去,再删除ADO对应的字段即可。。
如果不想定义字段的话,用第一种方式会比较简单。。

#7


而且如果你只是想要断开数据库连接的话,并不需要用到cds的。。
你直接把adoquery的LockType换成ltBatchOptimistic即可

#8


我想要 C#.net的 DataTable ,DataSet的那种效果,

就是 ADO.NET 中的DataSet和DataTable 

#9


事先定义ClientDataSet中的字段和类型
adoquery取出来后,循环append到ClientDataSet中

#10


说实话,没那必要。。。Ado.net的DataTable就等于delphi的DataSet了。。除非你自己写一个控件去封装。。

#11


引用 9 楼 pengxuan 的回复:
事先定义ClientDataSet中的字段和类型
adoquery取出来后,循环append到ClientDataSet中


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

还是ADO.NET 中的DataSet和DataTable 好啊。 

#12


引用 10 楼 ray2312 的回复:
说实话,没那必要。。。Ado.net的DataTable就等于delphi的DataSet了。。除非你自己写一个控件去封装。。


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

delphi的DataSet不能断开数据库吧

#13


DataSetProvider.dataset:= adoquery.
adoquery.open;

clientdataset.data:= DataSetProvider.data;

這樣你就可以關閉adoquery也不會有問題了。

#14


该回复于2011-01-18 14:41:18被版主删除

#1


两种方法。。
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;

#2


如果仅仅是本地取数,不需要Post直接提交数据库的话,个人比较推荐第二种方法。。

#3


第二种方法要先在TClientDataSet中定义各个字段及其类型吧?

#4


ClientDataSet1 := TClientDataSet(ADOQuery1);
ADOQuery1 := TADOQuery(ClientDataSet1 );
其实这两个是可以相互转换的,两个同样继承于TDataSet所以可以这样转换,可以保存你想要的数据,具体你测试一下就知道了。

#5


哦不好意思,我错了,这样不行ADO Close以后就没有数据了。

#6


对,需要定义字段先。。因为我个人的习惯字段全是英文的,所以都需要先定义字段设定displaytext,简单来说,你可以直接在ADOQUERY里面新增字段,然后把这些字段复制到CDS里面去,再删除ADO对应的字段即可。。
如果不想定义字段的话,用第一种方式会比较简单。。

#7


而且如果你只是想要断开数据库连接的话,并不需要用到cds的。。
你直接把adoquery的LockType换成ltBatchOptimistic即可

#8


我想要 C#.net的 DataTable ,DataSet的那种效果,

就是 ADO.NET 中的DataSet和DataTable 

#9


事先定义ClientDataSet中的字段和类型
adoquery取出来后,循环append到ClientDataSet中

#10


说实话,没那必要。。。Ado.net的DataTable就等于delphi的DataSet了。。除非你自己写一个控件去封装。。

#11


引用 9 楼 pengxuan 的回复:
事先定义ClientDataSet中的字段和类型
adoquery取出来后,循环append到ClientDataSet中


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

还是ADO.NET 中的DataSet和DataTable 好啊。 

#12


引用 10 楼 ray2312 的回复:
说实话,没那必要。。。Ado.net的DataTable就等于delphi的DataSet了。。除非你自己写一个控件去封装。。


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

delphi的DataSet不能断开数据库吧

#13


DataSetProvider.dataset:= adoquery.
adoquery.open;

clientdataset.data:= DataSetProvider.data;

這樣你就可以關閉adoquery也不會有問題了。

#14


该回复于2011-01-18 14:41:18被版主删除