我动态的创建了一个ClientDataSet,然后用cds.CloneCursor(cdsMeter, True)克隆了一个数据集,当我遍历时,为什么ClientDataSet已经是最后一条记录了,而Eof()函数返回不为True,以致于执行cds.Next,导致出错:Missing data provider or data packet.

解决方案 »

  1.   

    無代碼,無真相
    最簡單的: 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;  
      

  2.   

    Missing data provider or data packet是没有打开数据集,把代码贴出来看看。
      

  3.   

    代码就是这样,我也觉得奇怪,
    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;
      

  4.   

    ....
    cds.CloneCursor(cdsMeter, True);
    cds.FetchOnDemand:=False;//加这一句
      

  5.   

    估计有别的设置吧,用cds.Data := cdsMeter.Data试试
      

  6.   

    应该是下标的问题吧
    if cds.RecNo = cds.RecordCount then如果 cds.recNo是从0开始的,那么你判断最后一条应该是if cds.RecNo = cds.RecordCount-1 then这样才对
      

  7.   

    进行数据操作之前要cds.CreateDataSet
      

  8.   

    应该是字段设置好后,要cds.CreateDataSet才能对数据进行操作