c# - 在 NHibernate 中调用 Session.CreateSQLQuery ExecuteUpdate 失败

标签 c# nhibernate exception

我有一个存储过程,用于通过链接服务器从另一个系统同步数据。我在使用 Quartz.net 运行任务的 Windows 服务中使用 NHibernate 执行此调用。其中一项任务是同步数据任务,它实际上只是存储过程调用:

using(var tx = Session.BeginTransaction())  {   
    Session
        .CreateSQLQuery("exec dbo.spSyncData")
        .ExecuteUpdate();
    tx.Commit();
}

此存储过程不接受任何参数且不返回任何结果。 当这个调用完成后,我然后加载同步的数据,这样,,,

return Session.CreateCriteria(typeof(MyData))
    .Add(Restrictions.Eq("Status", Status.Waiting))
    .List<MyData>();

但是,此调用失败并出现 ADOException 消息“阅读器关闭时调用 Read 的尝试无效。”

我发现存储过程被设置为 SET NOCOUNT ON 所以我改变了它,现在我得到了一个不同的异常......

“已经有一个与此命令关联的打开的 DataReader,必须先将其关闭。”

提交 sproc 调用时会发生此错误。

有什么想法吗? 谢谢,史蒂夫

更新:我发现的一些问题与跨多个线程访问 session 对象有关,这是我没有预料到的。我能够清理它,但没有机会再次尝试使用 Session.Connection 对象执行 IDbCommand 的建议。以前失败过,但我认为这也与线程问题有关。我希望尽快回到那个尝试。

最佳答案

我会尝试通过 session.Connection(这是一个 IDbConnection)而不是 CreateSQLQuery 来执行存储过程

ExecuteUpdate() 用于批量操作(参见 this post by Dario Quintana,NHibernate 开发者之一)。

关于c# - 在 NHibernate 中调用 Session.CreateSQLQuery ExecuteUpdate 失败,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/357103/

相关文章:

c# - 更新后需要使行处于正常模式

c# - SQL Server 的 NHibernate 超时

c# - 使用导航属性的 LINQ 查询生成多个 SELECT 语句

c# - C#查看任务状态的方法

c# - 为什么即使我将 Expires 设置为 null,JWT 也会包含 EXP 声明?

nhibernate - 域驱动设计:聚集具有大量集合的根

NHibernate:如何在投影中选择根实体

asp.net - 构建excel文件使内存异常

android - SecurityException 从 Android 库中读取图片

c# - 在 VS2013 的 C# 代码中查找异常隐藏/吞噬