У меня есть большой SQL запрос к серверу (устаревший) по нескольким таблицам, который я читаю с SqlDataReader
. Обычно он имеет ограниченное количество строк для обработки, но недавно мне пришлось использовать его в большем количестве.
После нескольких итераций объект SqlDataReader
при чтении свойства Item()
выдает SqlException
с кодом 0x80131904 и сообщением "Une erreur de niveau transport s'est produite lors de la réception des résultats du serveur. (поставщик: TCP-провайдер, ошибка: 0 - Unenectxion existante и d'ttre fermée par l'hôte distant.) "(подробнее ниже.)
Сообщение находится на моем родном языке Французский, и я не совсем уверен, какая официальная версия engli sh. После некоторого поиска в Интернете мой перевод будет следующим: «При получении результатов с сервера произошла ошибка транспортного уровня (поставщик: поставщик TCP, ошибка: 0 - существующее соединение было принудительно закрыто удаленным хостом.)»
Я попробовал еще раз: исключение было выдано в той же строке, читая то же поле. (Последующие попытки показали, что исключение может быть выдано в разных местах, но это не сильно разнится: из восьми попыток исключение было выдано только в трех разных местах.
Объект SqlDataReader
счастливо читает то же самое поле на предыдущих Read
итерациях, и проверка результатов запроса в базе данных показывает, что строка, в которую выдается исключение, не имеет конкретного значения.
Я попытался настроить выражение Where
запроса для быстрее добираемся до исключения: оно фактически читает больше строк, чем раньше, а затем выдает одно и то же исключение в другую строку (но, опять же, это было более или менее в одной и той же строке каждый раз с измененным запросом.)
Посмотрев ближе, я поставил условную точку останова в инструкции, которая выдает исключение. Оказывается, что:
- Чтение свойства
Item()
с помощью QuickWatch вызывает то же исключение. - Чтение свойства
Item()
для другого поля, которое еще не было прочитано в текущей итерации. Ион бросает то же исключение. - И наоборот, чтение свойства
Item()
для других полей, уже прочитанных в текущей итерации, не выдает никаких исключений.
Я просмотрел свойства SqlDataReader
до и после исключения. State
изменяется от Open
до Closed
(что соответствует исключению). ClientConnectionId
также изменяется, его новым значением является неудивительный ряд 0
с.
Что происходит и как я могу это предотвратить?
ПРИЛОЖЕНИЕ 1
Код, который открывает SqlDataReader, выглядит следующим образом:
Dim z_dreLecteur As IDataReader = Nothing
Dim z_dcdCommande As IDbCommand = Nothing
[...]
If TypeOf p_dcxConnexion Is SqlConnection Then
z_dcdCommande = New SqlCommand(p_strQuery, DirectCast(p_dcxConnexion, SqlConnection))
Exit Try
End If
[...]
z_dcdCommande.CommandTimeout = 600
[...]
z_dreLecteur = z_dcdCommande.ExecuteReader()
[...]
z_dcdCommande.Dispose()
p_dcxConnexion
- это параметр, уже установленный до код выше работает.
ПРИЛОЖЕНИЕ 2 Подробнее о SqlException
. Он имеет InnerException
:
- тип
System.ComponentModel.Win32Exception
, ErrorCode
-2147467259, Message
"Une-связь существует в d fer être fermée par l'hôte distant "(" Существующее соединение было принудительно закрыто удаленным хостом "), NativeErrorCode
10054.
SqlException
имеет:
ErrorCode
-2146232060, Number
10054, Message
"Une erreur de niveau transport séest product lors de la réception des résultats du serveur . (провайдер: провайдер TCP, ошибка: 0 - существует несоответствие между удаленным сервером), что, вероятно, означает «ошибка транспортного уровня при получении результатов с сервера. (провайдер: провайдер TCP»). , ошибка: 0 - существующее соединение было принудительно закрыто удаленным хостом.) "
Я могу добавить StackTrace
, если это необходимо, но это действительно громоздко, поэтому пока не буду.