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”属性很少被访问。