我动态的创建了一个ClientDataSet,然后用cds.CloneCursor(cdsMeter, True)克隆了一个数据集,当我遍历时,为什么ClientDataSet已经是最后一条记录了,而Eof()函数返回不为True,以致于执行cds.Next,导致出错:Missing data provider or data packet.
無代碼,無真相 最簡單的: cbb_cb.Properties.Items.Clear; cbb_cb.Text:=''; ADOQuery1.Close; ADOQuery1.SQL.Clear; ADOQuery1.SQL.Add( ' select CB from Res_User_Temp where CB is not NULL group by CB ' ); ADOQuery1.Open; while not ADOQuery1.Eof do begin cbb_cb.Properties.Items.Add(Trim(ADOQuery1.FieldValues['CB'])); ADOQuery1.Next; end;
Missing data provider or data packet是没有打开数据集,把代码贴出来看看。
代码就是这样,我也觉得奇怪, var cds: TClientDataSet; begin cdsMeter.Open; cds := TClientDataSet.Create(nil); if cdsMeter.State in [dsEdit, dsInsert] then cdsMeter.Post; //这里cdsMeter的记录数为100,已经打开, cds.CloneCursor(cdsMeter, True); SelectCount := 0; RelayClass := 0; cds.First; while not cds.Eof do begin if cds.FieldByName('Checked').AsBoolean = true then Inc(SelectCount); if cds.RecNo = cds.RecordCount then Break; cds.Next;//这里这跟踪过了,当cds的记录数RecordCount为100时,cds.Eof还为false,所以还会执行一次cds.Next,这时就会弹出哪个错误 end; end;
最簡單的: cbb_cb.Properties.Items.Clear;
cbb_cb.Text:='';
ADOQuery1.Close;
ADOQuery1.SQL.Clear;
ADOQuery1.SQL.Add( ' select CB from Res_User_Temp where CB is not NULL group by CB ' );
ADOQuery1.Open;
while not ADOQuery1.Eof do
begin
cbb_cb.Properties.Items.Add(Trim(ADOQuery1.FieldValues['CB']));
ADOQuery1.Next;
end;
var
cds: TClientDataSet;
begin
cdsMeter.Open;
cds := TClientDataSet.Create(nil);
if cdsMeter.State in [dsEdit, dsInsert] then
cdsMeter.Post; //这里cdsMeter的记录数为100,已经打开,
cds.CloneCursor(cdsMeter, True);
SelectCount := 0;
RelayClass := 0;
cds.First;
while not cds.Eof do
begin
if cds.FieldByName('Checked').AsBoolean = true then
Inc(SelectCount);
if cds.RecNo = cds.RecordCount then
Break;
cds.Next;//这里这跟踪过了,当cds的记录数RecordCount为100时,cds.Eof还为false,所以还会执行一次cds.Next,这时就会弹出哪个错误
end;
end;
cds.CloneCursor(cdsMeter, True);
cds.FetchOnDemand:=False;//加这一句
if cds.RecNo = cds.RecordCount then如果 cds.recNo是从0开始的,那么你判断最后一条应该是if cds.RecNo = cds.RecordCount-1 then这样才对