Исключение тайм-аута заставляет SqlDataReader закрываться?

Без больше информации трудно точно определить проблему, но первопричина состоит в том, что Вы, скорее всего, скомпилировали класс против различной версии класса, который пропускает метод, чем тот, который Вы используете при выполнении его.

Взгляд на отслеживание стека... Если исключение появляется при вызове метода на объекте в библиотеке, Вы, скорее всего, используете отдельные версии библиотеки при компиляции и выполнении. Удостоверьтесь, что у Вас есть правильная версия оба места.

, Если исключение появляется при назывании метода на объектах инстанцированным классами Вы сделанный, тогда Ваш процесс сборки, кажется, является дефектным. Удостоверьтесь файлы класса, которые Вы на самом деле выполняете, обновляются, когда Вы компилируете.

9
задан Paulie 12 November 2009 в 02:00
поделиться

2 ответа

Похоже, что у вашей SqlCommand истекает время ожидания - когда вы вызываете ExecuteReader , связанная команда остается открытой и будет уязвима для тайм-аутов, пока вы не закончите чтение. Как сказано в документации SqlCommand.CommandTimeout :

Это свойство является совокупным тайм-аут для всех сетевых чтений во время выполнение команды или обработка полученные результаты. Тайм-аут все еще может произойти после возврата первой строки и не включает время обработки пользователем, только время сетевого чтения.

По истечении времени ожидания команда закрывает считыватель, из которого вы не можете восстановиться.

Первое, что нужно попытаться решить, - резко увеличить CommandTimeout , просто чтобы убедиться, что вы можете продолжить.

Затем, если вы еще этого не сделали, может помочь перегрузка ExecuteReader , которая позволяет вам указать CommandBehavior , и передайте CommandBehavior.SequentialAccess (согласно рекомендации в теме MSDN «Получение больших данных (ADO.NET) »).

Наконец, вы также можете попробовать нарушить чтение на куски записей.

14
ответ дан 4 December 2019 в 13:47
поделиться

Если уровень серьезности ошибки SQL меньше 17, вы можете установить SqlConnection.FireInfoMessageEventOnUserErrors = true , чтобы обработать исключение как предупреждение. Все, что выше уровня серьезности 17, приведет к закрытию соединения , несмотря ни на что.

1
ответ дан 4 December 2019 в 13:47
поделиться
Другие вопросы по тегам:

Похожие вопросы: