"无法为更新定位行。一些值可能已在最后一次读取后已更改。"问题的解决方案
无数的DB Developers遇到过"无法为更新定位行。一些值可能已在最后一次读取后已更改。"这一经典提示,其经典程度堪比当年的Windows蓝屏。它并非大问题,却是很“顽固”的存在。解决这一问题应该遵循如下两条原则:
1. 尽量使用 "update"语句来更新数据库中的指定行的数据;
2. 如果必须添加,尽量使用"insert"语句来完成添加;
实例说明:我写了一个类用来读写数据库中的指定记录。我一前一后使用该类中的两个方法对数据库中同一表格的同一行数据的不同字段进行修改,此时出现"无法为更新定位行。一些值可能已在最后一次读取后已更改。"错误提示。原因是两次提交过于接近,时间间隔以毫秒计,数据库服务器“响应不及”。通过遵循上述两条原则该问题得到解决。
备注:网络上给出了很多方法,不一而足,多数指向关键字未设置、某些字段是否设置为“允许为空”、出现重复数据等回答。一名合格的DB Developer是不会轻易犯下这些错误的,但他们(也包括我)可能会更倾向于使用开发语言(工具)所提供给的更简洁的方法来访问数据库,然而这些方法可能存在“问题”,当然我不是指这些方法有Bug,它们单个执行都没有问题,可程序设计是千变万化的,把它们“组合”起来的时候就不一定能够得到你想要的结果了。使用传统SQL语句来更新数据则有效的将问题交给了服务器端,服务器端可以自行控制提交,只需在完成后向客户端提交一个执行是否成功的结果。是的,这个返回的结果绝大多数情况下不会让你失望的!^_^