Если SqlDatareader выбирает одну запись за раз, а не одно поле за раз, тогда шаблон отложенной загрузки не был… - PullRequest
1 голос
/ 21 июля 2009


Выбирает ли SqlDataReader по одной записи за раз из БД или по одному полю за раз?


Предположим, следующий запрос возвращает одну строку:

select columns_1, column_2, column_3
from   some_Table

и предположим, что readerS ( readerS - это экземпляр, возвращаемый SqlCommand.ExecuteReader () ) читает только column_3 перед закрытием соединения:

readerS[“column_3”].ToString();


Теперь readerS будет извлекать с сервера sql только значение «column_3» или будет выбирать все 3 столбца, даже если он будет читать только один?


Причина, по которой я спрашиваю об этом, заключается в том, что я сейчас читаю книгу по программированию веб-сайтов, и автор упоминает, что он будет кодировать объекты DLL, чтобы использовать шаблон отложенной загрузки.

Вкратце - когда создается объект DLL, выполняется запрос к БД (через DAL), который извлекает данные из различных столбцов и вместе с этим заполняет свойства нашего объекта DLL. Поскольку одно из полей (назовите его «L») может содержать довольно значительный объем текста, автор решил извлечь это поле только при первом чтении этого свойства.

Но когда я посмотрел на хранимую процедуру, используемую автором для извлечения столбцов и заполнения свойств объекта DLL (за исключением свойства L , которое не заполняется), я заметил, что процедура также извлекается L , даже если он не будет использоваться для заполнения соответствующего свойства. Теперь, если DataReader извлекает целую строку, а не только поле, которое мы на самом деле читаем, то автор действительно не реализовал шаблон отложенной загрузки?!

Ответы [ 2 ]

1 голос
/ 22 июля 2009

Я не знаю, как автор реализовал шаблон, но DataReader извлекает результат строка за строкой, а не столбец за столбцом.

1 голос
/ 22 июля 2009

Я считаю, что считыватель данных работает только на уровне строк, а не по полям.

Не видя код, я думаю, что ленивая загрузка включается при заполнении свойств класса, а не при извлечении данных из базы данных.

Ленивая загрузка состояла бы в том, что свойство класса не заполняется данными из базы данных, пока что-то явно не попытается получить доступ к свойству. В этом случае «L» не загружается, пока не будет вызван метод get свойства «L».

...