执行UPDATE并返回刚刚使用NHibernate CreateSQLQuery方法更新的记录?

时间:2014-06-01 17:38:41

标签: c# sql sql-server nhibernate

如何执行SQL UPDATE语句并返回刚刚使用NHibernate CreateSQLQuery方法更新的记录?

我正在使用OUTPUT INSERTED.Id子句来获取刚刚插入的值的id,我只是为了简单而得到了id。

我的代码如下:

const string SQL =
            @"UPDATE Agent 
            SET Status = 'RESERVED' 
            OUTPUT INSERTED.Id 
            WHERE Id = (SELECT TOP 1 Id FROM Agent WHERE Status = 'ONLINE' ORDER BY StatusSetAt)";

var agentId = Session.CreateSQLQuery(SQL)
                     .AddScalar("Id", NHibernateUtil.String)
                     .List<string>()
                     .SingleOrDefault();

List方法返回正确的agentId,但问题是数据库中的数据未更新。

  • SQL查询有效(它在SSMS中执行时执行更新)。
  • SQL分析器显示UPDATE查询已发送到数据库,但不会以某种方式应用更改。

NH是否不按照List方法更新数据库? 是否可以使用ExecuteUpdate方法完成相同的操作?我找不到如何检索除更新行数之外的其他值。

非常感谢任何帮助,谢谢。

1 个答案:

答案 0 :(得分:2)

我怀疑,有(在你的代码中)一些事务处理。并且,主要是因为这种观察:

  

... SQL分析器显示UPDATE查询被发送到数据库,但不知何故未应用更改...

在这种情况下会有 ROLLBACK

因此,请尝试检查是否存在某个工作单元或Web请求事务管理。并且很可能上面的代码将是最终未提交的操作的一部分。

为什么C#值似乎在更新时会被回滚?因为执行了SQL语句,所以返回值...并存储在C#变量中。然后,只有在DB级别上,所有更改都将被还原。