DataReader、DataSet、DataAdapter和DataView使用介绍
程序员文章站
2023-12-09 23:43:45
ado.net提供两个对象用于检索关系型数据并把它存储在内存中,分别是dataset和datareader。dataset提供内存中关系数据的表现--包括表和次序、约束等表...
ado.net提供两个对象用于检索关系型数据并把它存储在内存中,分别是dataset和datareader。dataset提供内存中关系数据的表现--包括表和次序、约束等表间的关系的完整数据集合。datareader提供快速、只向前、只读的来自数据库的数据流。
使用dataset时,一般使用dataadapter(也可能是commandbuilder)与数据源交互,用dataview对dataset中的数据进行排序和过滤。dataset可以被继承来建立强化类型的dataset,用于暴露表、行、列作为强化类型对象属性。
下面的内容包含什么时候使用dataset或datareader,以及怎样优化访问它们所包含的数据,也包括怎样优化dataadapter和dataview的使用(也包括commandbuilder)。
dataset与datareader的对比
在设计应用程序时,决定使用dataset还是datareader需要考虑应用程序需要的功能。
使用dataset是为了实现应用程序的下述功能:
l 操作结果中的多个分离的表。
2 操作来自多个源(例如来自多个数据库、xml文件和电子表格的混合数据)的数据。
3 在层之间交换数据或使用xml web服务。与datareader 不同,dataset能被传递到远程客户端。
4 通过缓冲重复使用相同的行集合以提高性能(例如排序、搜索或过滤数据)。
5 每行执行大量的处理。在使用datareader返回的行上进行扩展处理将使连接存在的时间比必要的更长,从而降低效率。
6 使用xml操作(例如xslt转换和xpath查询)维护数据。
在应用程序需要以下功能时使用datareader:
l 不需要缓冲数据。
2 正在处理的结果集太大而不能全部放入内存中。
3 需要迅速一次性访问数据,采用只向前的只读的方式。
注意:当填充dataset的时候,dataadapter使用datareader。因此使用dataadapter代替dataset获得的性能是节约了dataset消耗的内存和组装dataset所需要的周期。这种性能的提高大部分是有名无实的,因此你应该根据需要的功能为基础来做设计决定。
使用强类型dataset的好处
使用dataset的另一个好处是它能被继承用于建立强类型的dataset。强类型dataset的好处包括设计时的检查和强类型dataset 的visual studio .net语句填充。当你为dataset固定了大纲或关系结构时,就能建立强类型dataset,把行和列作为对象的属性而不是项的集合。例如,作为暴露顾客表的某一行的列名的代替,你可以暴露customer对象的 name属性。强类型的dataset衍生自dataset类,因此不会牺牲dataset的任何功能,也就是说,强类型的dataset也可以是远程的,并作为数据绑定控件(例如datagrid)的数据源提供。如果不知道大纲,也能通过使用通常的dataset获得好处,但是丧失了强类型
dataset的附加特性
在强类型dataset中处理空值
使用强类型dataset时,你能给dataset 的xml大纲定义语言(xsd)作注解以确保强类型dataset正确的处理空(null)的引用。空值(nullvalue)注释使你能用string.empty这个特定值代替dbnull、保持了空引用、或者产生一个异常。选择其中的哪个依赖于应用程序的内容,默认情况下遇到空引用将产生一个异常。
刷新dataset中的数据
如果你希望使用更新后的值从服务器刷新数据集中的值,使用dataadapter.fill。如果主键定义在数据表上,dataadapter.fill基于主键匹配新行,并把服务器的数据改成已存在的行。被刷新行的rowstate设置为unchanged,即使在刷新前它被修改过。注意如果给数据表定义了主键,dataadapter.fill添加新行可能重复主键值。
如果希望用服务器的当前值刷新一个表,并且保持表中行的改变,你必须首选使用dataadapter.fill组合它,填充一个新的数据表,接着将该数据表合并(merge)进一个数据集,并把preservechanges值设为true。
在dataset中搜索数据
在一个数据集中查询符合特定条件的行时,使用基于索引(index-based)的查看表将提高性能。给数据表指定主键(primarykey)值时,就建立了一个索引。当为数据表建立数据视图(dataview)时也建立了索引。下面是一些使用基于索引查看的技巧:
如果查询是在数据表的主键列上进行的,使用datatable.rows.find代替datatable.select。
查询非主键列,可以使用数据视图来提高多个数据查询的速度。当给数据视图添加排序时,将建立搜索时使用的索引。数据视图暴露了查询下层数据表的find和findrows方法。
如果你不是查询表的排序视图,也可以通过为数据表建立数据视图获得基于索引的查看表的好处。注意如果你执行数据上的多个查询这是唯一的好处。如果你只执行单个查询,需要建立索引的过程将因为使用索引而降低了性能。
数据视图(dataview)结构
当数据视图建立后,并且当sort、ro
使用datareader、dataset、dataadapter和dataview
ado.net提供两个对象用于检索关系型数据并把它存储在内存中,分别是dataset和datareader。dataset提供内存中关系数据的表现--包括表和次序、约束等表间的关系的完整数据集合。datareader提供快速、只向前、只读的来自数据库的数据流。
使用dataset时,一般使用dataadapter(也可能是commandbuilder)与数据源交互,用dataview对dataset中的数据进行排序和过滤。dataset可以被继承来建立强化类型的dataset,用于暴露表、行、列作为强化类型对象属性。
使用dataset时,一般使用dataadapter(也可能是commandbuilder)与数据源交互,用dataview对dataset中的数据进行排序和过滤。dataset可以被继承来建立强化类型的dataset,用于暴露表、行、列作为强化类型对象属性。
下面的内容包含什么时候使用dataset或datareader,以及怎样优化访问它们所包含的数据,也包括怎样优化dataadapter和dataview的使用(也包括commandbuilder)。
dataset与datareader的对比
在设计应用程序时,决定使用dataset还是datareader需要考虑应用程序需要的功能。
使用dataset是为了实现应用程序的下述功能:
l 操作结果中的多个分离的表。
2 操作来自多个源(例如来自多个数据库、xml文件和电子表格的混合数据)的数据。
3 在层之间交换数据或使用xml web服务。与datareader 不同,dataset能被传递到远程客户端。
4 通过缓冲重复使用相同的行集合以提高性能(例如排序、搜索或过滤数据)。
5 每行执行大量的处理。在使用datareader返回的行上进行扩展处理将使连接存在的时间比必要的更长,从而降低效率。
6 使用xml操作(例如xslt转换和xpath查询)维护数据。
在应用程序需要以下功能时使用datareader:
l 不需要缓冲数据。
2 正在处理的结果集太大而不能全部放入内存中。
3 需要迅速一次性访问数据,采用只向前的只读的方式。
注意:当填充dataset的时候,dataadapter使用datareader。因此使用dataadapter代替dataset获得的性能是节约了dataset消耗的内存和组装dataset所需要的周期。这种性能的提高大部分是有名无实的,因此你应该根据需要的功能为基础来做设计决定。
使用强类型dataset的好处
使用dataset的另一个好处是它能被继承用于建立强类型的dataset。强类型dataset的好处包括设计时的检查和强类型dataset 的visual studio .net语句填充。当你为dataset固定了大纲或关系结构时,就能建立强类型dataset,把行和列作为对象的属性而不是项的集合。例如,作为暴露顾客表的某一行的列名的代替,你可以暴露customer对象的 name属性。强类型的dataset衍生自dataset类,因此不会牺牲dataset的任何功能,也就是说,强类型的dataset也可以是远程的,并作为数据绑定控件(例如datagrid)的数据源提供。如果不知道大纲,也能通过使用通常的dataset获得好处,但是丧失了强类型
dataset的附加特性
在强类型dataset中处理空值
使用强类型dataset时,你能给dataset 的xml大纲定义语言(xsd)作注解以确保强类型dataset正确的处理空(null)的引用。空值(nullvalue)注释使你能用string.empty这个特定值代替dbnull、保持了空引用、或者产生一个异常。选择其中的哪个依赖于应用程序的内容,默认情况下遇到空引用将产生一个异常。
刷新dataset中的数据
如果你希望使用更新后的值从服务器刷新数据集中的值,使用dataadapter.fill。如果主键定义在数据表上,dataadapter.fill基于主键匹配新行,并把服务器的数据改成已存在的行。被刷新行的rowstate设置为unchanged,即使在刷新前它被修改过。注意如果给数据表定义了主键,dataadapter.fill添加新行可能重复主键值。
如果希望用服务器的当前值刷新一个表,并且保持表中行的改变,你必须首选使用dataadapter.fill组合它,填充一个新的数据表,接着将该数据表合并(merge)进一个数据集,并把preservechanges值设为true。
在dataset中搜索数据
在一个数据集中查询符合特定条件的行时,使用基于索引(index-based)的查看表将提高性能。给数据表指定主键(primarykey)值时,就建立了一个索引。当为数据表建立数据视图(dataview)时也建立了索引。下面是一些使用基于索引查看的技巧:
如果查询是在数据表的主键列上进行的,使用datatable.rows.find代替datatable.select。
查询非主键列,可以使用数据视图来提高多个数据查询的速度。当给数据视图添加排序时,将建立搜索时使用的索引。数据视图暴露了查询下层数据表的find和findrows方法。
如果你不是查询表的排序视图,也可以通过为数据表建立数据视图获得基于索引的查看表的好处。注意如果你执行数据上的多个查询这是唯一的好处。如果你只执行单个查询,需要建立索引的过程将因为使用索引而降低了性能。
数据视图(dataview)结构
当数据视图建立后,并且当sort、ro
使用datareader、dataset、dataadapter和dataview
ado.net提供两个对象用于检索关系型数据并把它存储在内存中,分别是dataset和datareader。dataset提供内存中关系数据的表现--包括表和次序、约束等表间的关系的完整数据集合。datareader提供快速、只向前、只读的来自数据库的数据流。
使用dataset时,一般使用dataadapter(也可能是commandbuilder)与数据源交互,用dataview对dataset中的数据进行排序和过滤。dataset可以被继承来建立强化类型的dataset,用于暴露表、行、列作为强化类型对象属性。