老问题:"无法为更新行集定位:一些值可能已在最后读取后改变" (50分)

  • 主题发起人 主题发起人 delphi1234
  • 开始时间 开始时间
D

delphi1234

Unregistered / Unconfirmed
GUEST, unregistred user!
我在做一个促销品组成时有这样一个问题.就是我从两个表中取到的数据都放在一个DXDBGRID中.由于系统要求,要在修改数据(当然应包括新增,删除和更新)时要检查两列(单品占促销品%--检查是否全部单品所占%是否相加为100,,单品数量---检查各单品数量是否>0)的数据是否合要求.我是把这两列的检查都放在触发器中检查,当我不用触发器时(也就是不检查),所有修改都能正常保存.而一旦使用触发器检查,则就会出现上述提示"无法为更新行集定位:一些值可能已在最后读取后改变".但是还是能正常保存.就问这提示一般是哪出了问题?应如何解决?我写的相应触发器代码如下:请问是否是触发器写错了?
CREATE TRIGGER Check_per_qty1 ON st_sp
FOR INSERT
AS
if @@rowcount>0
begin
declare @sum int
declare @qty int
declare @spcode char(10)
select @spcode=sp_code from inserted
select @sum=sum(per) from st_sp where sp_code=@spcode
if @sum<>100
begin
raiserror('促销品各组合的总和不等于100,请重新设定总和为100!',16,1)
return
end
select * from st_sp where (sp_code=@spcode) and (qty is null)
if @@rowcount>0
begin
raiserror('促销品中各单品的数量不能为空,请重新设定!',16,1)
return
end
end
在这我说明下:
1. 在我的表中绝对不存在重复的记录.
2.我在表中已建了唯一索引.
3.我采用的是使用事务提交方式.
4.我的这个程序是处于调试阶级,代码全放在一台机子上,所以不存在在运行时别人也修改了记录;
 
上面的触发器代码只是其中一个,另外的UPDATE触发器与其差不多,所以就没有一起列出来.
 
这个问题一般是这样产生的,
你取了记录到了客户端,但是你的触发器或者别的程序改变了
一些记录的值,这时当你把客户端改变的记录存储到数据库中时,
就会产生你说的错误(记录已经改变了,当然也就无法定位了)。
你试试用事务控制。
 
在触发器开始加上:
SET NOCOUNT ON
结束时加上:
SET NOCOUNT OFF
 
多人接受答案了。
 
后退
顶部