一个项目在运行中突然产生大量的错误邮件,所有的错误信息均为:
Batch update returned unexpected row count from update; actual row count: 2; expected: 1---- at NHibernate.AdoNet.Expectations.VerifyOutcomeBatched(Int32 expectedRowCount, Int32 rowCount) at NHibernate.AdoNet.SqlClientBatchingBatcher.DoExecuteBatch(IDbCommand ps) at NHibernate.AdoNet.AbstractBatcher.ExecuteBatchWithTiming(IDbCommand ps) at NHibernate.AdoNet.AbstractBatcher.ExecuteBatch() at NHibernate.Engine.ActionQueue.ExecuteActions(IList list) at NHibernate.Engine.ActionQueue.ExecuteActions() at NHibernate.Event.Default.AbstractFlushingEventListener.PerformExecutions(IEventSource session) at NHibernate.Event.Default.DefaultFlushEventListener.OnFlush(FlushEvent event) at NHibernate.Impl.SessionImpl.Flush() at NHibernate.Transaction.AdoTransaction.Commit() ....
1) 网上很多资料说是给自增长列赋了值,或者更改映射文件的<generator class="native" />为:<generator class="increment"/>, 但是早先并没有这个错误,因此应该不是配置或者赋值的问题,更何况这个是new了一个对象保存的,不存在赋值Id的问题。
2) 数据也没有问题,因为Save的时候并没有报错,而是在commit的时候报错,追踪数据库,显示保存的命令已经完成,没有任何错误。
3) 后经排除,是一个员工在一张表上添加了一个Insert的Trigger, 删除后正常。
4) 经测试,在表上加入update的触发器在保存的时候一样也会引起该错误。
5) 虽然可在在触发器上添加SET NOCOUNT ON/OFF语句避免错误,但触发器在Nhibernate进行Save(insert)的时候得到的日志记录会有两条,一条是Insert, 一条是update。
以下是触发器的示例:
/*
Created by: Eiwing
Created On: 2012-07-05
Objective:
*/
CREATE TRIGGER trg_SaveOrUpdItemsLineNum
ON items
FOR INSERT,UPDATE
AS
BEGIN
IF EXISTS(SELECT 1 FROM inserted) AND NOT EXISTS(SELECT 1 FROM deleted)
BEGIN
SET NOCOUNT ON
INSERT INTO dbo.log_sql( createdon ,sqltext ,oid ,[type] ,sqltype)
SELECT GETDATE(),'Insert Line no:' + INSERTED.line_number, INSERTED.id,'INSERT','INSERT'
FROM INSERTED
SET NOCOUNT OFF
END
IF EXISTS(SELECT 1 FROM inserted) AND EXISTS(SELECT 1 FROM deleted)
BEGIN
SET NOCOUNT ON
INSERT INTO dbo.og_sql( createdon ,sqltext ,oid ,[type] ,sqltype)
SELECT GETDATE(),'UPDATE Line no: From: '+ line_number+ ' To:' + INSERTED.line_number , INSERTED.id,'UPDATE','UPDATE'
FROM inserted, deleted
WHERE inserted.id = deleted.id;
SET NOCOUNT OFF
END
END