[C#] Как работает DataReader?


Answers

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

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

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

Question

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

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

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




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