Вызов Session.CreateSQLQuery ExecuteUpdate завершается неудачно в NHibernate - PullRequest
4 голосов
/ 10 декабря 2008

У меня есть хранимая процедура, которая используется для синхронизации данных из другой системы через связанный сервер. Я выполняю этот вызов с помощью 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. Раньше это не удавалось, но я думаю, что это было связано и с проблемой потоков. Я надеюсь вскоре вернуться к этой попытке.

1 Ответ

4 голосов
/ 14 декабря 2008

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...