我有一个存储过程,用于通过链接服务器从另一个系统同步数据。我在使用 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/