一般出现"Couldn't perform this edit because anther user changed the record" 是什么原因? (

  • 主题发起人 主题发起人 zzjat
  • 开始时间 开始时间
Z

zzjat

Unregistered / Unconfirmed
GUEST, unregistred user!
一般出现"Couldn't perform this edit because anther user changed the record" 是什么原因? (50分)<br />一般出现"Couldn't perform this edit because anther user changed the record" 是什么原因?
 
我碰到过这种情形,我的情况是这样的:
要修改A表数据,启动了事物来处理的,而在事物之外(也就是别的事件中也进行修改A表)
,而且该事件在事物处理的时候也会触发!!这样就会出现上叙情形。
解决办法,把修改处理都放在事物里处理,就好了。
 
按字面意思翻译好像是

“不能执行这次修改,因为有其他用户更改了这个记录”

在数据库系统中,是不允许一个记录同时被两个用户修改的吧。
 
SoftBoy兄:我把事务取消了也不行.
sjn1978兄:不是你说的那种情况,我可以保证就我一个人在用
 
急呀,各位大哥,在线等候!
 
换个说法:在程序中可以修改表的一部份记录,另一部份却不能修改,在em中没问题,真是额这么怪的事情
 
我把数据类型由float改成numeric就可以了,为什么?
 
>>我把数据类型由float改成numeric就可以了,为什么?
因为MS的SQL SERVER的数据格式与BORLAND的数据格式不一致。DATATIME类型也有这个问题。
我想你用的是ADO控件吧。。。
 
仔细查一查源程序
 
对,MySQL也有类似的问题
估计Oracle也不例外
类似这种错误,都可以朝这方面考虑
 
ADO升级了吗?
 
这并不是一个错误。当dbgrid等控件提交数据时,它是将每一个字段都放到update语句的set部分和where部分。如果执行这个update影响的行数为0,表示有其他人修改了当前编辑的行。以主键合成where条件吧,相当于其他人进行的修改无效。
所以说,这个事情从逻辑上讲就行不通。只能是用户重新将数据刷新一次,在新数据上进行修改。
或者设计程序的时候,告诉dbgrid不要修改每一个字段。
不知明白没有。
 
更新的表中有没有primary key?我也遇到这样的问题,但是我加了索引以后就好了
 
主要在DataSet的AfterPost事件中加入DataSet.Refrash就行了,具体什么原因我也不清楚.
 
这样作可以根本解决问题:把ADO中加入固定的字段,找到你TABLE中的关键字。在ADO的
相应字段中设置TField.ProviderFlags,保证它包含pfInKey。然后再BEFOREPOST中加入
下面的代码,这是保证ADO产生更新的SQL时使用什么方式的。0代表主关键字。
procedure TrdmPcAppSvr.setAdoWhereKeyOnly(ADODataSet:TADODataSet);
var
rs_ : _RecordSet;
pty : Property_;
pties : Properties;
begin
rs_ := ADODataSet.Recordset;
pties := rs_.Properties;
pty := pties.Get_Item('Update Criteria');
pty.Value:=0;
end;
下面是pty.Value的可取值及含义。
A d C r i t e r i a K e y 0 只在S Q L命令的W h e r e子句中使用键值字段值来寻找
原来的记录
A d C r i t e r i a A l l C o l s 1 在S Q L命令的W h e r e子句中使用所有的字段值来寻找
原来的记录
A d C r i t e r i a U p C o l s 2 在S Q L命令的W h e r e子句中使用键值字段以及所有被
修改的字段值来寻找原来的记录,这是A D O使用的默
认设定
a d C r i t e r i a Ti m e S t a m p 3 在S Q L命令的W h e r e子句中使用键值字段以及数据表
中字段类型为Ti m e S t a m p的字段来寻找原来的记录

 
这个提示是很有名的,但其实并非是错误,应该是更新数据时逻辑上的问题.
大意就是在你准备进行更新时,你当前所看到的数据在数据库中已经发生了变化
(也就是被别人改变了),你要知道,TADODataSet也是发SQL去更新数据库的,
缺省方式其是索引字段与被改变字段作where匹配字段查找字段来更新,(有几种方式
,这是缺省的方式)
类似
update tbname set *=*
where 索引字段=*
and 被改变字段=*....
如果这些where字段发生了变化会导致本意要更新一条,但准备被更新的记录条数为0
或多于1条,就会发生你上述的提示.其实这是很符合逻辑的(比如你感冒了,你去看医生,
而在走了一段路后,感冒可能奇迹般好了,你是否会继续去医院哟?).但有时可能会感到
不方便.

如果是被其他程序所改变,而你希望有这种情况下更新情况,你可以使用wherekeyonly
更新方式.

另外要注意一种情况:缺省值,在这种情况下,没有其他程序更新数据库,也可能
发生字段值被改变而引发上述提示,解决办法是取消sqlserver或access字段
的缺省值.
 
lynu的分析是非常正确的。这实际上是一个与数据锁相关的问题。
 
接受答案了.
 

Similar threads

S
回复
0
查看
3K
SUNSTONE的Delphi笔记
S
S
回复
0
查看
2K
SUNSTONE的Delphi笔记
S
D
回复
0
查看
2K
DelphiTeacher的专栏
D
D
回复
0
查看
2K
DelphiTeacher的专栏
D
D
回复
0
查看
1K
DelphiTeacher的专栏
D
后退
顶部