在NHibernate中调用Session.CreateSQLQuery ExecuteUpdate失败

时间:2008-12-10 18:42:23

标签: c# nhibernate exception

我有一个存储过程,用于通过链接服务器同步来自另一个系统的数据。我在使用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。之前失败了,但我认为这也与线程问题有关。我希望尽快回到那个尝试。

1 个答案:

答案 0 :(得分:4)

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

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