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