日期:2014-05-17  浏览次数:21316 次

事务在触发器中结束。批处理已中止。
DataGridView的数据源关联数据库中的客户表,我在DataGridView网格控件中修改某一位客户的年龄,然后,点击保存按钮,以向数据库提交更新。但是,却报错----事务在触发器中结束。批处理已中止。

在源数据库中,我在客户表中写了一个触发器,如下:
CREATE TRIGGER [dbo].[TR_客户表] ON [dbo].[客户表]
AFTER UPDATE  
AS  
if(UPDATE(姓名) OR UPDATE(性别))
BEGIN
  PRINT '不能更改此字段内容' 
  ROLLBACK TRAN
END
ELSE
PRINT '更改成功'



此触发器的功能是不能修改姓名字段和性别字段的值,但是我修改的是年龄字段的值,却为什么报错呢?事务在触发器中结束。批处理已中止。

------解决方案--------------------
你确定你的update语句里没有修改姓名或者性别字段?。。。。调试出来看看就知道了
------解决方案--------------------
与sp中不同,
在触发器中使用ROLLBACK,会导致:包含触发器的语句的批处理中止!
从执行顺序上说,当前批处理中之后的语句不再执行了

不知道你想实现怎样的设计,
从目前楼主提供的信息,我觉得应该使用RAISEERROR更合适

------解决方案--------------------
还有,就是UPDATE()函数并不是检测值有没有变化,
而是检测INSERT或者UPDATE语句操作是否成功

如果要检测值的变化,需要调用INSERTED表和DELETED表去比对,
并且,还要考虑批更新的问题,也就是说,这两个系统表不一定是一行记录
------解决方案--------------------
探讨
Update语句有修改姓名和性别字段,但是值并没有改变啊,触发器中的
UPDATE(姓名) OR UPDATE(性别)应该返回false吧

------解决方案--------------------
探讨

引用:

你确定你的update语句里没有修改姓名或者性别字段?。。。。调试出来看看就知道了

我看了一下,适配器生存的Update语句有修改姓名和性别字段,但是值并没有改变啊,触发器中的
UPDATE(姓名) OR UPDATE(性别)应该返回false吧

------解决方案--------------------
要看保存按钮中都干了什么
------解决方案--------------------
因为你保存按钮中的Update语句有“姓名=xxx“,虽然姓名并未变化