无法为更新定位行,一些值可能已在最后一次读取后已更改

ADOTable,ACCESS数据库,表某个字段A-数字类型,默认值是0.

添加一条记录后,

http://wenku.baidu.com/view/bd87ea50ad02de80d4d840c8.html

无法为更新定位行,一些值可能已在最后一次读取(2009-03-11 11:58:22)标签:it 报错:无法为更新定位行,一些值可能已在最后一次读取后已更改 在Delphi 7中,用ADOQuery或ADODataSet操作数据库很方便,可查询,可增删改。

但如果对数据进行修改保存,然后再次对其进行修改保存,就会遇到“无法为更新定位行,一些值可能已在最后一次读取后已更改”的问题。

原因有这样几种:

1.在数据库设计时,为某些字段设置了默认值,在修改进行提交以后,数据库会自动修改对应字段的所有行的默认值,从而导致了数据库与数据集中数据的不一致,使ADOQuery(adoDataSet)无法对数据集进行定位。

2.数据库对应的表没有主键,输入了重复的数据以后,数据库里有两条一样的数据,从而使ADOQuery无法对数据进行定位。

解决方法:

1.修改数据库设计,不再设置默认值,为数据库表定义主键,保证其唯一性。

2.在执行完ADOQuery.Post之后,执行ADOQuery.Refresh,对于设置默认值的情况可以解决。 (refresh后dataset中的默认值字段获得了值,跟数据库中一致了)

3.改用Insert into sql语句插入,而不是add--post方式. 但这种方式不更新其他打开该表的query, 所以要requery才行, refresh不起作用.

4.使用ADODataSet也是同样的解决方法

http://www.cnblogs.com/terony/archive/2013/06/13/3133383.html

"无法为更新定位行。一些值可能已在最后一次读取后已更改。"问题的解决方案

无数的DB Developers遇到过"无法为更新定位行。一些值可能已在最后一次读取后已更改。"这一经典提示,其经典程度堪比当年的Windows蓝屏。它并非大问题,却是很“顽固”的存在。解决这一问题应该遵循如下两条原则:

1. 尽量使用 "update"语句来更新数据库中的指定行的数据;

2. 如果必须添加,尽量使用"insert"语句来完成添加;

实例说明:我写了一个类用来读写数据库中的指定记录。我一前一后使用该类中的两个方法对数据库中同一表格的同一行数据的不同字段进行修改,此时出现"无法为更新定位行。一些值可能已在最后一次读取后已更改。"错误提示。原因是两次提交过于接近,时间间隔以毫秒计,数据库服务器“响应不及”。通过遵循上述两条原则该问题得到解决。

备注:网络上给出了很多方法,不一而足,多数指向关键字未设置、某些字段是否设置为“允许为空”、出现重复数据等回答。一名合格的DB Developer是不会轻易犯下这些错误的,但他们(也包括我)可能会更倾向于使用开发语言(工具)所提供给的更简洁的方法来访问数据库,然而这些方法可能存在“问题”,当然我不是指这些方法有Bug,它们单个执行都没有问题,可程序设计是千变万化的,把它们“组合”起来的时候就不一定能够得到你想要的结果了。使用传统SQL语句来更新数据则有效的将问题交给了服务器端,服务器端可以自行控制提交,只需在完成后向客户端提交一个执行是否成功的结果。是的,这个返回的结果绝大多数情况下不会让你失望的!^_^

原文地址:https://www.cnblogs.com/CodeGear/p/4241785.html