Свойство SqlDataReader Item теряет соединение - PullRequest
0 голосов
/ 11 марта 2020

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...