起步软件技术论坛-X3

 找回密码
 立即注册
搜索
查看: 212|回复: 3

[分享]RecordNotFoundOrChangedByAnotherUser**

[复制链接]
发表于 2008-8-25 16:09:53 | 显示全部楼层 |阅读模式
1. 原理
用户对数据集上数据的更改,最终都是通过Insert、Update、Delete等SQL语句在数据库服务器上执行的,Update语句和Delete语句都会有Where子句来限定对哪些数据做修改或者删除。当表中没有数据能够满足Where子句所限定的条件,那么就没有任何记录被修改或者被删除,系统就会提示这个错误“Record not found or Changed by another user”。
回复

使用道具 举报

 楼主| 发表于 2008-8-25 16:10:08 | 显示全部楼层

出错原因

2. 出错原因
两个用户同时获取了某一条记录,然后分别对这条记录做了修改,这样当用户A提交数据以后,用户B提交的SQL语句的Where子句就无法找到这条记录了。


例如表T1的中有3个字段/1条记录:


FGUID    FVALUE1    FVALUE2

1                1                   1


用户A和用户B在运行平台中,基本同时把这条记录取下来了,然后各自对这条记录进行修改和提交
如果用户A把字段FVALUE1的值改为2了,系统提交的SQL语句就是:

UPDATE T1
   SET fvalue1 = 2
WHERE fguid = 1
   AND fvalue1 = 1
   AND fvalue2 = 1用户A提交成功以后数据就变成:


FGUID    FVALUE1    FVALUE2

1                2                   1


但是这时用户B的运行平台它并不知道用户A已经提交成功了呀,用户B继续做着对数据集的修改,如果用户B把字段FVALUE2的值改为11了,系统提交的SQL语句就是:

UPDATE T1
   SET fvalue1 = 11
WHERE fguid = 1
   AND fvalue1 = 1
   AND fvalue2 = 1这时问题来了,因为FVALUE1的字段值已经被用户A改为2了,所以这个提交语句的Where部分将定位不到任何记录,所以就报那个错.

某业务功能中有两个业务数据集,他们都是访问表T1的那条记录,如果这两个业务数据集同时把那条记录取下来进行修改和提交,只要有一个数据集提交成功,把数据改了,另外一个数据集就不能提交了。原理跟上面一样。
表中使用自动增长字段,当新增记录保存后,表中的自动增长字段已经有值,而数据集中没有值,造成数据集与表中字段的值不一致,这时候再修改字段的值时候,生成的Where子句就无法定位到表中的记录
表中使用了触发器,当数据修改以后,触发器又修改了某个字段的值,造成数据集与表中字段的值不一致,这时候再修改字段的值时候,生成的Where子句就无法定位到表中的记录
Where子句中包括了浮点数、日期时间等类型的有精度损失的字段,这样常常造成Where子句中给定的条件与记录上实际存在的字段值之间不能匹配
回复 支持 反对

使用道具 举报

 楼主| 发表于 2008-8-25 16:10:50 | 显示全部楼层

解决方法

解决方法
修改数据集的更新选项的更新模式,有三个选项:所有字段、主键和修改字段、主键。修改这个更新模式为主键,这样只有主键会出现在where部分。
修改数据集的更新选项,手工提供更新SQL语句,保证浮点数、日期时间等类型字段不出现在Where子句中
对于定义了自动增长字段或者定义了触发器的表,可以在修改了数据以后,马上调用DataSet.Refresh,保证数据集中数据与表中的数据一致
回复 支持 反对

使用道具 举报

发表于 2008-9-1 16:59:19 | 显示全部楼层
。。。。
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Justep Inc.

GMT+8, 2025-7-21 05:28 , Processed in 0.039986 second(s), 15 queries .

Powered by Discuz! X3.4

© 2001-2017 Comsenz Inc.

快速回复 返回顶部 返回列表