我有一个存储过程,用于通过链接服务器同步来自另一个系统的数据。我在使用Quartz.net运行任务的Windows服务中使用NHibernate执行此调用。其中一个任务是同步数据任务,它实际上只是sproc调用:
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失败,并显示消息“读取器关闭时无效尝试调用读取。”
我发现sproc设置为SET NOCOUNT ON所以我改变了,现在我得到了一个不同的例外......
“已经有一个与此命令关联的打开DataReader,必须先关闭它。”
提交sproc调用时会发生此错误。
有什么想法吗? 谢谢,史蒂夫
更新:我发现的一些问题与跨多个线程访问会话对象有关,这是我没想到的。我能够清理它,但没有机会再次尝试使用Session.Connection对象来执行IDbCommand。之前失败了,但我认为这也与线程问题有关。我希望尽快回到那个尝试。
答案 0 :(得分:4)
我尝试通过session.Connection(这是一个IDbConnection)而不是CreateSQLQuery来执行sproc
ExecuteUpdate()用于批量操作(参见this post by Dario Quintana,其中一个NHibernate开发者)。