批更新 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 语句发现先 是先执行"删除"再执行"插入"的
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、在你修改数据库以后别人修改了数据库,这种情况属于正常情况。比较容易理解。
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语句。