2009-11-21 5 views
0

Я некоторые VB.N код, который создает экземпляр TransactionScope:инстанцирование TransactionScope возвращает нуль

LoggingUtility.LogDebug("UpdateCallTable", "SatComCallDataImporter", "About to associate call data with contracts") 
Using ts = New TransactionScope() 
    LoggingUtility.LogDebug("UpdateCallTable", "SatComCallDataImporter", "Getting all unimported SatCom calls") 

Мое приложение бросает исключение на призыв к созданию нового TransactionScope, с «ссылкой на объекте не установлен к экземпляру объекта. ". Исключение не бросается на мою машину разработки или мою тестовую машину; только на машине для производства клиентов, и я понятия не имею, почему. Я разместил строки отладки непосредственно до и после этой строки, поэтому я уверен, что эта строка вызывает проблему.

A использовали TransactionScopes во всем приложении, и это единственное место, исключающее исключение на клиентской машине.

«О соединении данных вызова с контрактами» записывается в журнал, а следующая запись журнала - это «Ссылка на объект, не установленная на экземпляр объекта».

Код работает нормально, если я переведу его из транзакции.

Я боролся с этим в течение 4 дней и не стал ближе.

+0

Глупый меня. Ошибка выкидывала транзакцию, поэтому, конечно, мои журналы отладки не писали (в базу данных). Фактической причиной была разница между спецификацией импорта и импортируемыми данными. Поле, которое никогда не должно было быть нулевым, на самом деле было нулевым. Я никогда не подбирал это при тестировании, потому что у меня был правильный пример файла образца для тестирования, а не реальных данных. Звучит слишком очевидно. –

+0

ARgg, сделано это один. Еще лучше, если вы попытаетесь ввести логику в «если прервано это сделать», и вы в конечном итоге поддерживаете все это. FYI New TransactionScope (TransactionScopeOption.Supress) позволит вам делать вещи в БД за пределами текущей транзакции. – Spence

ответ

1

Возможно, у вас есть проблема с MSDTC?

Я бы склонялся скорее к ошибке кодирования, потому что объект TransactionScope должен быть инициализирован и не равен null, но он будет указывать на ошибку.

Возможно, показывая нам, что код может помочь нам дальше?

ОБНОВЛЕНИЕ: У меня был опыт работы с механизмами ведения журнала, которые не могли регистрировать строку перед исключением, что иногда вызвано переустановкой режима освобождения, или подпрограмма не активируется активно, и приложение неожиданно разбивается, прежде чем оно сможет завершить работу.

Я предлагаю разместить строку ведения журнала непосредственно после использования оператора(), чтобы утверждать, что TransactionScope не является нулевым. Учитывая способ, которым вы использовали код, НЕВОЗМОЖНО, чтобы результат этого кода возвращал значение null, конструктор должен выдать исключение, если конструктор завершился неудачно, иначе у вас будет область с ненулевой транзакцией.

Возможно, немного больше кода, и этот тест может помочь еще?

+0

Счастливый, чтобы показать код, если он помогает, но это строка кода, который терпит неудачу. Окружающие линии - это линии отладки. Я проверил настройки MSDTC на всех машинах, и они идентичны. –

+0

Обновлено мой ответ – Spence

+0

На самом деле положите строку, в которой указано If IsNothing (ts), а затем выбросите новый NullReferenceException() Добавьте попытку поймать его! – Spence

Смежные вопросы