我想在单层应用中通过ClientDataSet组件进行缓存更新操作,也就是
在表中插入好几条记录后点“提交”可以保存,点“取消”可以统一取消。
不过在ClientDataSet组件引发异常:procedure TForm1.Button1Click(Sender: TObject);
begin
  with ClientDataSet1 do
  begin
    Insert;
    FieldByName('Name').AsString:= Edit1.Text;
    FieldByName('Weight').AsInteger:= StrToInt(Edit2.Text);
    ApplyUpdates(-1);  //Error here!!!
  end;
end;//Button1单击引发错误:
//EDatabaseError with message 'ClientDataSet1: Missing data provider or data packet'.procedure TForm1.Button2Click(Sender: TObject);
begin
  with ClientDataSet1 do
  begin
    Edit;
    Post; //点这个按钮统一把所有ApplyUpdates的数据写入数据库。
  end;
end;procedure TForm1.Button3Click(Sender: TObject);
begin
  ClientDataSet1.Cancel;
end;

解决方案 »

  1.   

    ClientDataSet 要有數据提供者TDataSetProvider組件;
    Insert,Edit,Delete后要Post;
    最后寫入數据庫時用ApplyUpdates(0);
      

  2.   

    ClientDataSet 怎么连数据库的,
    1。TDataSetProvider连接
    2。自己客户端 ClientDataSet 。create。
      

  3.   

    ClientDataSet在两层程序里没必要有Provider并且运行良好,如果我非ApplyUpdates不可那么一定加入Provider么?那Provider是谁?
      

  4.   

    我在单层中用ClientDataSet的目的大家可能不理解。
    因为无论BDE还是ADO最起码都4M以上大,所以我的程序中我根本不想用任何数据库引擎,所以才遇到这个问题。大家快救命啊!!!!!!!!!
      

  5.   

    try thisvar 
      BaseLine:Integer;
    begin
      with ClientDataSet1 do
      begin
        BaseLine:=SavePoint;
        Insert;
        FieldByName('Name').AsString:= Edit1.Text;
        FieldByName('Weight').AsInteger:= StrToInt(Edit2.Text);
        if 提交 then
          MergeChangeLog
        else //取消
          SavePoint:=BaseLine;
      end;
    end;
      

  6.   

    好像应该是先post
    在applyupdate
      

  7.   

    TOMWLD(笑天) 你太伟大了!你说的完全正确,只是非得事先SavePoint一下,多按一次按钮麻烦点。呵呵
      有方法让“当改动发生时”(Insert、Edit、Delete操作)SavePoint一下吗?