当前位置 主页 > 服务器问题 > win服务器问题汇总 >
DataSet与DataReader
当设计应用程序时,要考虑应用程序所需功能的等级,以确定使用DataSet或者是DataReader。
要通过应用程序执行以下操作,就要使用DataSet:
1) 在结果的多个离散表之间进行导航。
2) 操作来自多个数据源(例如,来自多个数据库、一个XML文件和一个电子表格的混合数据)的数据。
3) 在各层之间交换数据或使用XML Web服务。与DataReader不同的是,DataSet能传递给远程客户端。
4) 重用同样的记录集合,以便通过缓存获得性能改善(例如排序、搜索或筛选数据)。
5) 每条记录都需要执行大量处理。对使用DataReader返回的每一行进行扩展处理会延长服务于DataReader的连接的必要时间,这影响了性能。
6) 使用XML操作对数据进行操作,例如可扩展样式表语言转换(XSLT转换)或XPath查询。
对于下列情况,要在应用程序中使用DataReader:
1) 不需要缓存数据。
2) 要处理的结果集太大,内存中放不下。
3) 一旦需要以仅向前、只读方式快速访问数据。
注填充DataSet时,DataAdapter使用DataReader。因此,使用DataAdapter取代DataSet提升的性能表现为节省了DataSet占用内存和填充DataSet需要的循环。一般来说,此性能提升只是象征性的,因此,设计决策应以所需功能为基础。
使用强类型DataSet的好处
DataSet的另一个好处是可被继承以创建一个强类型DataSet。强类型DataSet的好处包括设计时类型检查,以及Microsoft Visual Studio.NET用于强类型DataSet语句结束所带来的好处。修改了DataSet的架构或关系结构后,就可以创建一个强类型DataSet,将行和列作为对象的属性公开,而不是作为集合中的项公开。例如,不公开客户表中行的姓名列,而公开Customer对象的Name属性。类型化DataSet从DataSet类派生,因此不会牺牲DataSet的任何功能。也就是说,类型化DataSet仍能远程访问,并作为数据绑定控件(例如DataGrid)的数据源提供。如果架构事先不可知,仍能受益于通用DataSet的功能,但却不能受益于强类型DataSet的附加功能。
处理强类型DataSet中的空引用
使用强类型DataSet时,可以使用DataSet的XML架构定义语言(XSD)架构来确保强类型DataSet可以正确处理空引用。nullValue标识符使您可用一个指定的值String.Empty代替DBNull、保留空引用或引发异常。选择哪个选项取决于应用程序的上下文。默认情况下,如果遇到空引用,就会引发异常。
刷新DataSet中的数据
如果想用服务器上的更新值刷新DataSet中的值,就使用DataAdapter.Fill。如果有在DataTable上定义的主键,DataAdapter.Fill会根据主键进行新行匹配,并且当更改到现有行时应用服务器上的值。即使刷新之前修改了这些数据,刷新行的RowState仍被设置为Unchanged。注意,如果没有为DataTable定义主键,DataAdapter.Fill就用可能重复的主键值添加新行。
如果想用来自服务器的当前值刷新表,并同时保留对表中的行所做的任何更改,必须首先用DataAdapter.Fill填充表,并填充一个新的DataTable,然后用preserveChanges值true将DataTable合并到DataSet之中。
在DataSet中搜索数据
在DataSet中查询与特定条件相匹配的行时,可以利用基于索引的查找提高搜索性能。当将PrimaryKey值赋给DataTable时,会创建一个索引。当给DataTable创建DataView时,也会创建一个索引。下面是一些利用基于索引进行查找的技巧。
1) 如果对组成DataTable的PrimaryKey的列进行查询,要使用DataTable.Rows.Find而不是DataTable.Select。
2) 对于涉及到非主键列的查询,可以使用DataView为数据的多个查询提高性能。当将排序顺序应用到DataView时,就会建立一个搜索时使用的索引。DataView公开Find和FindRows方法,以便查询基础DataTable中的数据。