触发器对记录的更改操作引起Nhibernate异常的解决

来源:互联网 发布:心理控制术 知乎 编辑:程序博客网 时间:2024/05/02 01:07

问题产生:原先使用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.”

解决方案:在触发器脚本中添加如下语句——起始处set nocount on;结尾处set nocount off

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

特别感谢:乐山乐水

原创粉丝点击