在Button的click事件中加如下代码,清空ClientDataSet2。
  if not ClientDataSet2.Active then
    ClientDataSet2.Active := true;
  ClientDataSet2.EmptyDataSet; 在后续的一个循环中实现如下代码,用以向ClientDataSet2中添加数据记录。
         with ClientDataSet2 do
          begin
            if not  Active then  Active := True;
            Append;
            FieldByName('NUMBER').asstring   := '5';   //执行到这一句就报错:Dataset not in edit or insert mode。删除该句,则在下句中报此错误。
            FieldByName('LINENO').asstring   := '432';
            FieldByName('BUSNO').asstring   := '213';
            FieldByName('STATION').asstring := '43';
            FieldByName('STATIONNAME').asstring   := '33';
            FieldByName('AVERAGESPEED').asstring   := '23'; 
            Post;
          end;//下面是测试跟踪代码,附在Append之后,在Append上下断点。跟踪发现CanModify为true,ReadOnly为false。但是奇怪的是State始终是dsBrowse。
            if CanModify
              and(not ReadOnly) then
              showmessage('Can');
            case State of
            dsInactive: showmessage('');
            dsBrowse: showmessage('');
            dsEdit: showmessage('');
            dsInsert: showmessage('');
            dsSetKey: showmessage('');
            dsCalcFields: showmessage('');
            dsFilter: showmessage('');
            dsNewValue: showmessage('');
            dsOldValue: showmessage('');
            dsCurValue: showmessage('');
            dsBlockRead: showmessage('');
            dsInternalCalc: showmessage('');
            dsOpening: showmessage('');
            end;
//最后这个也没闹明白,采用下面的办法解决了。将Append(包含Append)和Post(包含Post)之间的代码用下面的代码替代。
            x:='5';
            y:='432';
            z:='213';
            w:='43';
            q:='33';
            h:='23';
            AppendRecord([x,y,z,w,q,h]);
楼主真心求助论坛里的各路大神分析解决此问题。

解决方案 »

  1.   

    应该是在AfterInsert或者其它什么事件里有动作,导致Append后State有变化
      

  2.   

    看下你的 ClientDataSet2 的AfterInsert,  beforePost 事件是否写了什么代码, 先引掉调试看看可以通过不~
      

  3.   

    没有啊  我的ClientDataSet2的这两个事件里都是空的,没东西。
      

  4.   

    with ClientDataSet2 do
              begin
                Append;是不是Append和其他方向相同?
    即Compiler不认为是ClientDataSet2.Append?
    直接写ClientDataSet2.Append试试。
    同理,也有可能FieldByName不对应ClientDataSet2。
    用ClientDataSet2.FieldByName试试
      

  5.   

    你的意思是可能with  do 语句有问题对吧??我也尝试过把with  do 去掉,单独写那些语句。还是不行。让人头疼的在于:这段代码有时候行,有时候报错。我按照这个形式单独写个小工程测试,从来没报过错。
      

  6.   

    在操作前将数据操作状态,改为EDIT装态