如何执行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,但问题是数据库中的数据未更新。
NH是否不按照List方法更新数据库? 是否可以使用ExecuteUpdate方法完成相同的操作?我找不到如何检索除更新行数之外的其他值。
非常感谢任何帮助,谢谢。
答案 0 :(得分:2)
我怀疑,有(在你的代码中)一些事务处理。并且,主要是因为这种观察:
... SQL分析器显示UPDATE查询被发送到数据库,但不知何故未应用更改...
在这种情况下会有 ROLLBACK 。
因此,请尝试检查是否存在某个工作单元或Web请求事务管理。并且很可能上面的代码将是最终未提交的操作的一部分。
为什么C#值似乎在更新时会被回滚?因为执行了SQL语句,所以返回值...并存储在C#变量中。然后,只有在DB级别上,所有更改都将被还原。