Вызов Session.CreateSQLQuery ExecuteUpdate завершается неудачно в NHibernate

У меня есть хранимая процедура, которая используется для синхронизации данных из другой системы через связанный сервер. Я выполняю этот вызов с помощью NHibernate в службе Windows, которая выполняет задачи с использованием Quartz.net. Одной из этих задач является задача синхронизации данных, и в действительности это просто вызов 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 с сообщением «Недопустимая попытка вызова Read, когда читатель закрыт».

Я обнаружил, что sproc был установлен на SET NOCOUNT ON, поэтому я изменил это, и теперь я получаю другое исключение ...

«Уже есть открытый DataReader, связанный с этой командой, который должен быть закрыт первым».

Эта ошибка возникает, когда вызов sproc зафиксирован.

Любые идеи? Спасибо Стив

ОБНОВЛЕНИЕ: Некоторые из обнаруженных мной проблем связаны с доступом к объекту сеанса в нескольких потоках, чего я не ожидал. Мне удалось это исправить, но у меня не было возможности снова попробовать рекомендацию об использовании объекта Session.Connection для выполнения IDbCommand. Раньше это не удавалось, но я думаю, что это было связано и с проблемой потоков. Я надеюсь вернуться к этой попытке в ближайшее время.

10.12.2008 18:42:23
Какой код вы используете для создания своих сессий nhibernate? Это веб или это winforms?
JSC 12.12.2008 18:36:21
Мне было бы интересно узнать, как вы решили проблемы с потоками.
Perhentian 25.09.2009 10:21:46
1 ОТВЕТ
РЕШЕНИЕ

Я бы попытался выполнить sproc через session.Connection (который является IDbConnection) вместо CreateSQLQuery

ExecuteUpdate () предназначался для массовых операций (см. Эту статью Дарио Кинтана , один из разработчиков NHibernate).

4
14.12.2008 20:33:05