Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/asp.net/37.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Asp.net 如果SqlDatareader一次获取一条记录,而不是一次获取一个字段,那么惰性加载模式就不存在了’;t…;_Asp.net_Design Patterns_Lazy Loading - Fatal编程技术网

Asp.net 如果SqlDatareader一次获取一条记录,而不是一次获取一个字段,那么惰性加载模式就不存在了’;t…;

Asp.net 如果SqlDatareader一次获取一条记录,而不是一次获取一个字段,那么惰性加载模式就不存在了’;t…;,asp.net,design-patterns,lazy-loading,Asp.net,Design Patterns,Lazy Loading,SqlDataReader是一次从DB中获取一条记录还是一次从一个字段中获取一条记录 假设以下查询返回一行: select columns_1, column_2, column_3 from some_Table 假设读卡器(读卡器是SqlCommand.ExecuteReader()返回的实例) )在关闭连接之前,仅读取列_3: readerS[“column_3”].ToString(); 现在,读卡器是否只从SQLServer获取一个“column_3”值,还是将获取所有3列


SqlDataReader是一次从DB中获取一条记录还是一次从一个字段中获取一条记录


假设以下查询返回一行:

select columns_1, column_2, column_3
from   some_Table
假设读卡器(读卡器是SqlCommand.ExecuteReader()返回的实例) )在关闭连接之前,仅读取列_3:

readerS[“column_3”].ToString();

现在,读卡器是否只从SQLServer获取一个“column_3”值,还是将获取所有3列,即使它只读取一列


我问这个问题的原因是因为我正在读一本关于网站编程的书,作者提到他将编写DLL对象以使用延迟加载模式

简言之,当创建DLL对象时,将执行一个DB查询(通过DAL),该查询从各个列检索数据,并用它填充DLL对象的属性。由于其中一个字段(称为“L”)可能包含大量文本,作者决定仅在第一次读取该属性时检索该字段


但当我查看作者用来检索列和填充DLL对象属性的存储过程时(属性L除外,它不会被填充),我注意到该过程也检索了L列,即使它不会被用来填充相应的属性。现在,如果DataReader检索整行,而不仅仅是我们实际读取的字段,那么作者并没有真正实现延迟加载模式

我相信数据读取器只能在行级别工作,不能逐个字段工作

如果没有看到代码,我的猜测是,在填充类的属性时,延迟加载将起作用,而不是从数据库中提取数据


延迟加载是指在某个对象尝试访问该属性之前,不会使用数据库中的数据填充该类属性。在本例中,在调用“L”属性的get方法之前,不会加载“L”。

我不知道作者是如何实现该模式的,但DataReader会逐行而不是逐列检索结果。

作者基本上就是这样做的。基本上,当第一次访问“L”属性时,将调用从数据库检索“L”的适当方法。但是,由于用于填充其他类属性(在创建DLL对象时填充的类属性)的过程也会检索“L”,因此…看起来我并没有收到您的所有评论,但我假设您说对象中有一个构造函数,它使用数据库中的值加载所有属性。如果是这种情况,那么作者没有实现延迟加载。如果他没有加载所有的,那么他就会填充构造函数中的所有属性。对象的构造函数不使用DB值加载“L”属性,但它使用DB中的值加载所有其他属性。但问题是,DB查询(用于检索此数据)也返回“L”字段,因此DataReader也检索“L”列,即使它没有读取该列。“L”属性没有立即与“L”列中的值一起加载是完全正确的,就像我说的,这正是延迟加载的本质。阅读您之前的评论,您似乎觉得在首次访问“L”属性时,应该单独加载“L”列,对吗?如果是这样,我认为这将是一个错误,因为它至少会向数据库添加另一个不需要的调用。我能看到这可能是可访问的唯一方法是如果“L”属性很少被访问。