SqlDataSource控件将根据DataSourceMode属性的值以两种方式之一包含数据库中的数据:DataReader或者DataSet(默认值)。DataReader流出信息,而DataSet则将值保留在内存中并允许数据绑定控件执行诸如排序和分页的任务。这种区别对于Web应用程序并不重要,因为终端用户代码永远不会访问底层的DataSet或DataReader。在请求结束时会丢弃DataSet或DataReader,因此它不会跨多个请求保持在内存中。唯一决定使用数据源控件写数据能力的方式是定义Update–,Delete–或Insert–命令,第11章和第12章将介绍相关内容。不论数据源是否从SelectMethod返回DataSet或DataReader,这种方法都有效。
需要权衡性能、表示方面的功能以及是否使用缓存等几方面,表3-2中对此进行了总结。会有很多种情况发生,但是在最常见的情况下,DataReader将比DataSet快,并且在IIS服务器上使用非常少的内存。按照一般的规则,当数据源控件只填充列表或数据绑定控件,而且这种列表或数据绑定控件不需要进行缓存、分页和动态排序的时候,应该使用DataReader。如果数据绑定控件将提供记录的排序或分页,也应该使用DataReader,在这种情况下,将需要接受使用DataSet的成本(在DataSourceMode没有显式设置时,为默认值)。如需获得更多关于分页和排序行为的信息,请参阅第7章。最后,对于缓存情况,如同第17章中所描述,需要使用DataSet。
表 3-2
值 | 优 点 | 注 意 事 项 |
DataReader | 较为快速 | 不支持缓存、分页和动态排序 |
DataSet | 支持缓存、排序和分页 | 较慢 |
在如下的“试一试”中将看到这些区别。
试一试 #4—— 设置DataSet和DataReader的SqlDataSource DataSourceMode
在这个简短的练习中,针对绑定到DropDownList的SqlDataSource,将设置数据源模式为DataReader。然后,将添加GridView并看到分页将在其数据源控件从DataSet(默认值)改为DataReader模式时失败。这里没有深入讨论分页和排序,但在第1章的第一个演示中涉及到分页和排序。
(1) 创建名为TIO-0304-DataMode-1.aspx的页面。在Design视图中,拖放一个DropDownList控件至页面。选择Data Source,然后选择New,并且设置其为使用在本章前面的试一试“在Web.config中保存连接字符串”中创建的MdfNorthwind连接。这一次使用Shippers表以及ShipperID和CompanyName。返回到DropDownList向导中,设置显示CompanyName的字段和显示ShipperID值的字段。
因为这种信息几乎不会改变,只需要尽可能快地将其放入页面中。选择数据源控件,在Properties窗口中(如果Properties窗口不可见,则按F4键)将DataSourceMode属性改为DataReader。运行该页面,然而现在还不能够感觉到DataReader的快速。
(2) 现在将演示一种错误,这种错误来源于DataSourceMode属性和在GirdView控件中使用分页功能之间的不匹配。将一个GridView控件拖放到页面上,配置Data Source为新的数据库,保留SqlDataSource2的默认名。使用MdfNorthwind连接,选择名为Products的表以及表中的ProductID和Name字段。单击Next按钮,然后单击Finish按钮。默认情况下,SqlDataSource控件为DataSet模式。
选中GridView,在通用任务面板中启用分页。保存,运行,并且在浏览器中观察到页面加载没有任何问题,GridView中的分页正确工作。
(3) 关闭浏览器,返回到VWD设计模式中的页面。选择SqlDataSource2控件,并且查看Properties窗口。查找DataSourceMode(在Designer组下),双击它,将选项改为DataReader。将该页面保存为TIO-0304-DataMode-2,并且在浏览器中查看页面时,请注意出现的错误。
示例说明 #4——设置DataSet和DataReader的SqlDataSource DataSourceMode
DataReader速度更快。但是,SqlDataSource在使用DataReader模式时并不支持分页或者排序。因为对于DropDownList来说,将数据快速提供给相对静态控件的能力是理想的情况,在第(1)步中将列表的数据源控件设置为DataReader。在第(2)步中,可以看到默认数据模式为DataSet。当切换至DataReader后,分页将失败。请注意在很多时候还是需要使用DataReader模式,例如快速地填充ListBox或者BulletedList。