环境:D7+SQLSERVER2000,
Tadodataset
    LockType    为ltBatchOptimistic
    commandText 为 select a1,a2,a3....a20,Price from TB where 1=2 (作为临时表)操作:
   在adodataset1 中append了N行记录(由其他窗体进行写入除price外其他字段的内容),
   然后对price字段进行手工录入,录完所有行的price后,保存。   保存的代码为
   
   fm_adodm.adoconnection1.BeginTrans;
   try
       adodataset1.updateBatch(arall);
       fm_adodm.adoconnection1.commitTrans;
       showmessage('保存成功');
   except
       fm_adodm.adoconnection1.RollbackTrans;
       showmessage('保存失败,请检查');
   end;
      现在发生一些奇怪现象:         有时保存后,检查,发现会有几行记录的price值为0,而实际保存前已手工录入了。
         有时只有两行也会出现该现象。      此种现象不是每次都发生。   近期对数据库作了维护,迁移了历史数据(因表记录有50W左右的记录),大概迁移了30W左右的记录。   在没有做迁移时,从来没有发生过此现象。   不知是哪方面的原因引起的,找了很多方面都没有能解决,请教各位还有类似情况发生过。    是SQSERVER的原因,还是adodataset提交时的原因?

解决方案 »

  1.   

    都是price值为0, 在adodataset1 中append了N行记录z(由其他窗体进行写入除price外其他字段的内容),我的分析是很可能是你行手工录入price有问题,不然为什么会只有price出问题呢?
      

  2.   

    楼主有没有亲手操作重现问题?
    销售或客服或客户传回的消息总有失实的部分。
    可能的话,把程序更新一下,Price字段在保存前做个检查。
    可以先在一台机器上做这个实验,看问题能否重现
      

  3.   

    谢谢楼上的建议。目前有3台PC有过此现象,其中2台有过多次。
    一开始我也无法相信这个现象,因为系统用了几年了,一直没有发生过。就这几天的事。
    今天下午我在现场就发生过几次,而且有一次仅2 行记录也发生此现象。后来加了保存前检查price是否有0的记录,待客户测试,看反馈。真是想不明白,所以请教同行。
      

  4.   


    下午我加了检查,先在一台机上测试,等客户消息 了。我一直都是用批量提交的方式,从来没有出现过此种现象,怀疑是不是SQLSERVR表记录被迁移出去后引起的。TB表用了一个自增长的字段作主键的。
      

  5.   

    是不是price字段也要经过其它的运算,最后才赋值,但运算结果是0
      

  6.   


    没有参与其他计算,只是手工录入。其他列都是不可编辑的,只有price列可以编辑,用的是cxgrid.今天在SQLSERVER中用 DBCC 查找了一下,也没有发现有什么异常。
      

  7.   

    是不是在用户录入price值后,光标还在cxgrid的单元格中时,用户就点击了保存按钮?(我在DBGridEh中遇到过这样的情况),如果是这样的话,丢失数据的记录应该每次只有一条,即最后一个输入price的记录,而不是多条。但,即使是这种情况,cxgrid也不应该出现丢失数据的问题。
      

  8.   

    这个可能性不大,因为我在保存前也用了post,虽然UpdateBatch隐性也会先Post.
      

  9.   

    用dbmonitor 跟踪下你的程序提交的SQL语句和值,可以跟到DELPHI生成的SQL 语句和值