触发器使Nhibernate更新操作时产生异常

本文介绍了解决NHibernate更新操作时遇到的问题,当SQL Server表存在触发器记录更改信息时,NHibernate会因受影响行数不符而抛出异常。通过在触发器中设置nocount开关,可以避免这一问题。

 

用SQLSERVER做表的触发器时,发现此时Nhibernate更新操作时会爆异常,搜了一下问题解决。

问题描述如下:

问题产生:使用Nhibernate执行更新操作(Store)一切正常,在对数据库表增加了触发器——作用:将当前更改记录的访问用户(suser_sname())及时间(getdate())写入被更改记录的特定字段——后,Nhibernate操作发生异常

异常信息:“SQL insert, update or delete failed (expected affected row count: 1, actual affected row count: 2). Possible causes: the row was modified or deleted by another user, or a trigger is reporting misleading row count.”

解决方案:在触发器脚本中添加如下语句——起始处(as 之后 begin之前)set nocount on;结尾处(end之后)set nocount off

原因分析:Nhibernate在对数据库执行更改操作时,会比较更改记录的数量与数据库返回的实际受影响记录数(也就是@@ROWCOUNT的返回值),如果两者不一致,就会引发上述异常。而让数据库返回的实际受影响记录数发生变化的原因,就是在触发器中执行了Update、Insert或Delete语句。而nocount开关的作用,就是让SQL Server在执行数据更改操作后不返回受影响记录数。只要在触发器脚本中执行数据库更改操作前打开nocount开关,就可以让Nhibernate得到正常的预期结果,进而消除此异常。

特别感谢:UNO

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值