所以希望能用TClientDataSet来保存 TADOQuery查询到的结果集,
请问怎样实现?谢谢各位大侠。。。
14 个解决方案
#1
两种方法。。
1、加TDataSetProvider,这个我就不多说了。。随便查查都能查到。。
2、遍历Adoquery的数据,插入Cds.给你段代码。。
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所以可以这样转换,可以保存你想要的数据,具体你测试一下就知道了。
ADOQuery1 := TADOQuery(ClientDataSet1 );
其实这两个是可以相互转换的,两个同样继承于TDataSet所以可以这样转换,可以保存你想要的数据,具体你测试一下就知道了。
#5
哦不好意思,我错了,这样不行ADO Close以后就没有数据了。
#6
对,需要定义字段先。。因为我个人的习惯字段全是英文的,所以都需要先定义字段设定displaytext,简单来说,你可以直接在ADOQUERY里面新增字段,然后把这些字段复制到CDS里面去,再删除ADO对应的字段即可。。
如果不想定义字段的话,用第一种方式会比较简单。。
如果不想定义字段的话,用第一种方式会比较简单。。
#7
而且如果你只是想要断开数据库连接的话,并不需要用到cds的。。
你直接把adoquery的LockType换成ltBatchOptimistic即可
你直接把adoquery的LockType换成ltBatchOptimistic即可
#8
我想要 C#.net的 DataTable ,DataSet的那种效果,
就是 ADO.NET 中的DataSet和DataTable
就是 ADO.NET 中的DataSet和DataTable
#9
事先定义ClientDataSet中的字段和类型
adoquery取出来后,循环append到ClientDataSet中
adoquery取出来后,循环append到ClientDataSet中
#10
说实话,没那必要。。。Ado.net的DataTable就等于delphi的DataSet了。。除非你自己写一个控件去封装。。
#11
可以是可以,就是太麻烦,
还是ADO.NET 中的DataSet和DataTable 好啊。
#12
Ado.net的DataTable 和delphi的DataSet不一样吧,
delphi的DataSet不能断开数据库吧
#13
DataSetProvider.dataset:= adoquery.
adoquery.open;
clientdataset.data:= DataSetProvider.data;
這樣你就可以關閉adoquery也不會有問題了。
adoquery.open;
clientdataset.data:= DataSetProvider.data;
這樣你就可以關閉adoquery也不會有問題了。
#14
#1
两种方法。。
1、加TDataSetProvider,这个我就不多说了。。随便查查都能查到。。
2、遍历Adoquery的数据,插入Cds.给你段代码。。
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所以可以这样转换,可以保存你想要的数据,具体你测试一下就知道了。
ADOQuery1 := TADOQuery(ClientDataSet1 );
其实这两个是可以相互转换的,两个同样继承于TDataSet所以可以这样转换,可以保存你想要的数据,具体你测试一下就知道了。
#5
哦不好意思,我错了,这样不行ADO Close以后就没有数据了。
#6
对,需要定义字段先。。因为我个人的习惯字段全是英文的,所以都需要先定义字段设定displaytext,简单来说,你可以直接在ADOQUERY里面新增字段,然后把这些字段复制到CDS里面去,再删除ADO对应的字段即可。。
如果不想定义字段的话,用第一种方式会比较简单。。
如果不想定义字段的话,用第一种方式会比较简单。。
#7
而且如果你只是想要断开数据库连接的话,并不需要用到cds的。。
你直接把adoquery的LockType换成ltBatchOptimistic即可
你直接把adoquery的LockType换成ltBatchOptimistic即可
#8
我想要 C#.net的 DataTable ,DataSet的那种效果,
就是 ADO.NET 中的DataSet和DataTable
就是 ADO.NET 中的DataSet和DataTable
#9
事先定义ClientDataSet中的字段和类型
adoquery取出来后,循环append到ClientDataSet中
adoquery取出来后,循环append到ClientDataSet中
#10
说实话,没那必要。。。Ado.net的DataTable就等于delphi的DataSet了。。除非你自己写一个控件去封装。。
#11
可以是可以,就是太麻烦,
还是ADO.NET 中的DataSet和DataTable 好啊。
#12
Ado.net的DataTable 和delphi的DataSet不一样吧,
delphi的DataSet不能断开数据库吧
#13
DataSetProvider.dataset:= adoquery.
adoquery.open;
clientdataset.data:= DataSetProvider.data;
這樣你就可以關閉adoquery也不會有問題了。
adoquery.open;
clientdataset.data:= DataSetProvider.data;
這樣你就可以關閉adoquery也不會有問題了。