DataMod.adoConn.BeginTrans;
   try
      if adoMain.LockType  =ltOptimistic then
         adoMain.Post
      else  if adoMain.LockType  =ltBatchOptimistic then
         adoMain.UpdateBatch(arAll);
      DataMOd.adoConn.CommitTrans;
   except on E:Exception do
      begin
      DataMod.adoConn.RollbackTrans;
      DBGridEhMain.Refresh;
      if IsAborted=False then
      begin
         myShowErr('保存数据时失败!原因:' + #13 + E.Message );
      end;
      exit;
      end;
   end;假设共有3条记录被新增,
如上,adoMain 是ltBatchOptimistic型的游标,只要我的数据出现过一次错误,被 Except 后的语句堆截获,那么,前面加入的两条记录不会被保存到数据库(DBGrid上有3条,关闭窗体再进来就只一条记录)!!
经试这多次都是这样,但是,如果数据一直都正确,就会全部写入数据库。1\请给出解决方法,最好是原基础上修改
2、说明原因

解决方案 »

  1.   

    补充说明:
    ////////////////////////
    一、表结构
    DepartNO(主键)  DepartName二、测试方法1、先输入
    DepartNO(主键)  DepartName
      01             计算机系
      01             英语系2、保存,系统提示出错
    3、把英语系的 01 改为 02
    4、再保存
    系统提示保存成功。5、关闭窗体,再进入,发现上一次新增的记录(不管新增多少条)系统总是只保存最后一条(如本例的02  英语系)。当然,以前的旧记录系统不会删除。另外,我测试了
    adoMain.CancelBatch(arAll);
    adoMain.CancelBatch();都一样的出现如题所说的问题。adoMain是一个 adoDataset,语句为: 
    Select * from bs_Depart  adoMain.CursorType:=ctKeyset;
      adoMain.LockType:=ltBatchOptimistic;
      

  2.   

    if adoMain.LockType  =ltOptimistic then
             adoMain.Post
          else  if adoMain.LockType  =ltBatchOptimistic then
                begin
                  adoMain.post;//加上这个试试
                  adoMain.UpdateBatch(arAll);
                end;
      

  3.   

    qizhanfeng(glacier) :
    还是不行
    还是只保存了最后一条记录
      

  4.   

    改一下:
    /////////////////
    另外,我测试了
    adoMain.CancelBatch(arAll);   ----> 是adoMain.UpdateBatch(arAll);
    adoMain.CancelBatch();       -->>adoMain.UpdateBatch();
      

  5.   

    改一下:
    /////////////////
    另外,我测试了
    adoMain.CancelBatch(arAll);   ----> 是adoMain.UpdateBatch(arAll);
    adoMain.CancelBatch();       -->>adoMain.UpdateBatch();