2008-12-10 51 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的開發者之一)。