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.   

    把事务加入try,解决问题,给分
       try
          DataMod.adoConn.BeginTrans;
          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;
      

  2.   

    conis(凌空踏烟) 
    经测试,故障依然!
      

  3.   

    补充说明:
    ////////////////////////
    一、表结构
    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;