В моей текущей задаче мне нужно взять какой-то существующий устаревший код (который использует raw ADO) и заставить его работать в NHibernate. Я хочу сохранить исходные запросы sql как есть, чтобы обеспечить точно такое же поведение.Как предотвратить NHibernate ISession для изменения соединения после выполнения каждого запроса?
Это то, что исходный код делает:
- Скопируйте все из таблицы А для временной таблицы #A (с помощью «вставить» заявление)
- Выполнить внешнюю утилиту BCP (через командную строку), которая является копирует все из файла резервной копии (.tbl) в таблице а,
- Скопируйте все из #A до а
(ради обсуждения, давайте предположим, что это вполне логично, и это то, что требуется сделать пе)
Проблема:
Я не могу запустить 1 + 3 в одном операторе, потому что у меня есть BCP вызов в середине. Поэтому я вынужден выполнять три отдельных звонка. Итак, я звоню 1, затем 2, затем 3 ... и получаю ошибку о недопустимом имени объекта #A.
Что на самом деле происходит? По-видимому, после каждого выполнения запроса NHibernate перерабатывает соединение ->, которое делает временную таблицу #A удаленной сразу после выполнения 1 (временные таблицы живут до тех пор, пока соединение не будет открыто).
Мне нужно как-то преодолеть эту проблему. В идеале, я хотел бы как-то сказать NHibernate постоянно поддерживать такое же соединение в течение этого процесса.
Спасибо!
P.S. Я попытался выполнить транзакцию 1 + 2 + 3. Это приводит к тупиковой ситуации с BCP (независимо от того, который IsolationLevel)
В sqlserver вы можете создавать временные таблицы глобального масштаба. (## A вместо #A). Это может решить вашу проблему.(Но также могут вводить проблемы параллелизма, в зависимости от того, как они используются). http://stackoverflow.com/questions/18614344/scope-of-temporary-tables-in-sql-server-2012 –
Также вы можете просто получить доступ к свойству 'ISession.Connection' и сохранить исходный код ADO? –