用DataSetProvider.GetRecords如何取得第N包的数据?(100分)

  • 主题发起人 主题发起人 lajfox
  • 开始时间 开始时间
L

lajfox

Unregistered / Unconfirmed
GUEST, unregistred user!
我有一个应用,需要把一个数据集(TAdoQuery,或TQuery)分包,然后得到第N包的数据,
我用TAdoQuery查询返回一个结果集,用一个DataSetProvider联到TAdoQuery,然后用
DatasetProvider.GetRecords(10,RecCount,XMLUTF8Option+MetaDataOption)得到一个
有10条记录的数据包,然后我要得到下一个10条记录的包,不知道如何做?Delphi帮助
中说需要设置数据库Cursor位置,但我不知如何设置,用AdoQuery.next不起作用,谁
有这方面的经验?
 
以下方法在D7中可用...
//服务端
procedure TZLJD_01.DataSetProvider1BeforeGetRecords(Sender: TObject;
var OwnerData: OleVariant);
begin
if VarIsEmpty(OwnerData) then
Exit;
with Sender as TDataSetProviderdo
begin
DataSet.Open;
if OwnerData<DataSet.RecordCount then
DataSet.RecNo:=OwnerData;
end;
end;

//在客户端...PageNo为页号,PageRecordCount为每页的记录数
procedure TMainForm.ClientDataSet1BeforeGetRecords(Sender: TObject;
var OwnerData: OleVariant);
begin
OwnerData:=(StrToInt(PageNO.Text)-1)*StrToInt(PageRecordCount.Text)+1;
end;
 
好像不管用,
我在一个Form上放了AdoConnection、AdoQuery、DataSetProvider,依次连接,然后用
ClientDataSet、DataSource、DBGrid显示数据,用这些代码:
DataSetProvider.Dataset.Open;
DataSetProvider.Dataset.RecNo := 6;
ClientDataSet.Data := DataSetProvider.GetRecords(5,outRecCount,XMLUTF8Option+MetaDataOption);
结果还是取回了最前面的5条数据。
 
好象在李维的什么分布式的书上有讲到,具体我忘了,大概意思是这样:
在客户端clientdataset的beforegetrecord(取记录前触发的,是不是这个事件?)传递
当前客户端的最后一条记录的索引字段的值给服务器,在服务器的datasetprovider的
beforegetrecord事件里根据客户端传过来的值定位记录,然后再取记录.
 
var
RecsOut:Integer;
Options:TGetRecordOptions;
begin
DataSetProvider.Close;
DataSetProvider.Open;
ADOQuery1.RecNo:=6;
Options:=[grMetaData,grXML];
cds.Data:=DataSetProvider1.GetRecords(5,RecsOut,Byte(Options));
end;
 
多谢smokingroom,我昨天改用了GetRecords(5,RecsOut,Byte(Options)),情况有所好转,
连续调用可以顺序取得数据包。
但是ADOQuery1.RecNo:=6;这句还是无效,也就是无法直接跳到我想要开始取数据的位置
直接取回一个数据包,大家再研究一下,难道就没有更好的解决方法吗?
 
sorry,今天我又测试了一下,按照smokingroom的方法在Ado下可行,如果没有人有更好的
方法,我就把100分给smokingroom了。
 
100分给你
 
后退
顶部