批更新 ApplyUpdates 有问题,先添加新的,再删除原来的 就不对了(插入重复键)GoodsCode   GoodsName    Space
  001               AAA          10G
  002               BBB          5ml
  003               CCC          10lgGoodsCode是主键
这时侯我 先添加 001 的记录,  然后删除"之前" 001 的记录(不是添加的)   , 居然提示插入重复键,  我跟中 SQL 语句发现先 是先执行"插入"再执行"删除"的, 这样的话批更新就有问题了 ApplyUpdates
  try
    ADOConnection1.BeginTrans ;
    ADOQuery1.ApplyUpdates ;
    ADOConnection1.CommitTrans ;
  except
    ADOConnection1.RollbackTrans ;
  end;
PB就没有这样的问题
我跟中 SQL 语句发现先 是先执行"删除"再执行"插入"的

解决方案 »

  1.   

    發生此問題的几种情况:
    1、在你修改数据库以后别人修改了数据库,这种情况属于正常情况。比较容易理解。
    2、数据表里面设有缺省值,在ClientDataSet新建记录以后,本地可能没有填入该字段的值,在applyupdates以后,ClientDataSet中的记录与上面事实上是不一样的(缺省值的地方)。再次修改后Applyupdates,在updateWhereAll的情况下必然会出错。
    3、数据字段设成char的时候使用MS sql server也容易引起错误,原因类似 2。
    4、数据表里面没有设主键或者唯一索引,似乎会出错。
    5、包含有比较特别的字段,比如TDateTime,由于微软和Borland公司对时间的解释“略有不同”,DateTime记录到毫秒,比如对于:2001-11-4 19:19:01 在微软的数据库里面可能真正的值是相当于2001-11-4 19:19:00.568 ,如果转成字符串,微软会认为是2001-11-4 19:19:01 ,但是Borland公司把后面的毫秒四舍五入,解释成“ 2001--11-4 19:19:00”,在applyupdates的时候就会拿这个字符串去数据库里面找,微软的ADO引擎(假设用的是ADO)自然是找不到对应的记录。所以也会引发错误。这个错误是非常隐蔽的,实数字段估计也是相应的原因引起的。
    可以通过下面的方法解决:
    1、如果不是多用户同时操作该表或记录,您可以用设定upWhereKeyOnly的方法。
    2、多用户时,对于有特别的字段,比如DateTime,在业务允许的情况下,只填写日期。避开real类的字段,试用其他的字段来代替。
    3、不要用applyupdaes或者Delta来处理,使用自己组织Sql语句。