帮帮忙, 看一下为什么要出现这条出错信息!(50分)

  • 主题发起人 主题发起人 EdwinYeah
  • 开始时间 开始时间
E

EdwinYeah

Unregistered / Unconfirmed
GUEST, unregistred user!
环境: delphi 5 + ADO Express sp2 + sql server 2000

我在更新一个TADODataSet的一个字段时出现这条信息:

Project 123.exe raised exception class EOleException with message
'row cannot be located for updating. some values may have been
changed since it was last read'. Process stopped. Use Step or Run
to continue.

原来好好的,不知改了什么之后就这样了.不知是客户端还是服务器端的问题?
请各们大哥帮帮忙!
 
help!help!
列举一下在什么情况下会出现这种情况!
 
我现在的系统就是这样,不知道什么原因?
重装一次系统就好了。
 
以下内容为猜测,基本上没有依据。
从错误信息来看:是你用了update set where语句,在update时本来读出来的缓冲中存在
符合条件的行,但最后提交时却发现实际的数据库中这些行也不存在了,可能是被另一个进程
改了或是删了。出现了与时间相关的错误,读写了脏数据,原因是读数据用来写前没有加写锁
 
1、单步调试一下,看看是否有不该被修改的值被修改
2、重新启动计算机
3、重装
 
从出错信息上看,sonie分析得有道理.我原来也是这么想的.然而,原因却让人...FAINT!

我更新的表有一个trriger,如下:
CREATE TRIGGER OnOrdDtlUpdate ON
[dbo].[OrdDtl]
FOR UPDATE
AS
IF UPDATE(PartNo) BEGIN
UPDATE DNDtl SET PartNo = i.PartNo
FROM DNDtl d, inserted i
WHERE d.OrdDtlNo = i.OrdDtlNo
END
我删除这个trriger后就OK了!但为什么?我在trriger中只是修改了别一个表而已呀!
请各位大哥帮忙分析一下!我的的trigger应如何改.

 
想起来了,真奇怪!
我增加了这个trriger后曾测试过程序,当时并没有问题!
 
我认为有两个可能:
1、您的后台数据库的触发器产生两个inserted动作。
2、您的Tadodataset的cachesize的值不是1。
 
to liaotw:
先排除第二个可能.
对于第二种情况即使如此也不应出错,而且解决问题后也证明如此--是的,
问题解决了,但却仍不解.我是这样无意中解决的,我把trigger改成这样:
CREATE TRIGGER OnOrdDtlUpdate ON
[dbo].[OrdDtl]
FOR UPDATE
AS
<font color=red>PRINT 'Hello!'</font>
IF UPDATE(PartNo) BEGIN
UPDATE DNDtl SET PartNo = i.PartNo
FROM DNDtl d, inserted i
WHERE d.OrdDtlNo = i.OrdDtlNo
END

是的,我加了一个PRINT语句,就这样OK了!
当然,我现在的trigger不是这个样子的,我用另外的语句代替PRINT.
 
改为这样试一下:(当然@jj,@hh必须声明为你的fieldtype)
IF UPDATE(PartNo) BEGIN
select @jj=partno,@hh=ordtlno from inserted
if @@count>0
begin
UPDATE DNDtl SET PartNo = @jj
FROM DNDtl where OrdDtlNo=@hh
end
end
 
to billst:
这样也不行,我还是要在最前面加一句SET NOCOUNT ON.
反正问题解决了,谢谢大家的帮助!分数平分吧.
 
多人接受答案了。
 
后退
顶部