2008-12-10 107 views
3

我有一个存储过程用于通过链接服务器同步来自另一个系统的数据。我在使用Quartz.net运行任务的Windows服务中使用NHibernate执行此调用。这些任务之一是同步数据的任务,它实际上只是存储过程的调用:在NHibernate中调用Session.CreateSQLQuery ExecuteUpdate失败

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“无效试图调用时读取器被关闭阅读”。

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

“已经有与此命令必须先关闭相关联的打开的DataReader “。

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

任何想法? 谢谢,史蒂夫

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

+0

你用什么样的代码来创建你的nhibernate会话?它是网络还是winforms? – JSC 2008-12-12 18:36:21

回答

3

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

的executeUpdate()的目的是为批量操作(见this post by Dario Quintana,NHibernate的开发者之一)。