Подтвердить что ты не робот

Как работает DataReader?

Я думал, что SQLDataReader не должен работать, если нет соединения с SQLServer.

Я экспериментировал с этим сценарием. Я выполняю ExecuteReader, а затем останавливаю службу SQLServer и пытаюсь выполнить итерацию через DataReader. То, что я ожидал, было исключением, но оно давало результаты один за другим. В идеале DataReader должен читать одну строку за раз из потока, который подключается к серверу БД, и который должен генерировать исключение, если мы отключим сервер БД?

Я не знаю, что мне здесь не хватает.

4b9b3361

Ответ 1

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

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

Ответ 2

Считыватель данных читает запись за раз, но читает ее из базового драйвера базы данных. Драйвер базы данных считывает данные из базы данных в блоках, обычно используя буфер размером 8 килобайт.

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

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

Ответ 3

Основной тип подключения может повлиять на объем данных, предоставленных за раз. Для небольшого объема данных с использованием разъема общей памяти вполне возможно, что все данные отправляются вместе.

Общая память - это протокол по умолчанию, когда клиент и сервер находятся на одной машине.

Ответ 4

Он читает их, поскольку у него есть время в фоновом режиме. Когда вы перешли на SQL Server и закрыли соединение, все данные были перенесены в фоновом режиме. Что происходит, когда вы выполняете чтение, это то, что он вызывает SQL Server и сообщает ему, чтобы начать отправку результатов. Как только запрос выполняется (корректно обрабатывается, запрос действителен), но до его завершения он возвращается. В этот момент вы можете начать вызов метода чтения. Тем не менее, он по-прежнему считывает и буферизует данные в фоновом режиме, поэтому, когда вы снова вызываете чтение, следующая строка готова, ожидая в буфере, и ей не нужно обращаться к базе данных.