SqlDataReader和SqlDataAdapter
转自:http://blog.csdn.net/chensirbbk/article/details/6225318
SqlDataReader 高效,功能弱,只读访问 SqlDataAdapter 强大,要求资源也大一点
SqlDataReader 只能在保持跟数据库连接的状态下才可以读取。。。
SqlDataAdapter 大多情况下是一次性读取一个表,然后填充到DataSet中,然后就可以断开跟数据库的连接了。
两者区别主要是 在线 和 离线 的区别。。。。。
一: SqlDataReader rd; rd=cmd.ExecuteReader();
比较高效,如果只是显示数据,当然要用这个
二: SqlDataAdapter adapter=new SqlDataAdapter(cmd); ADO.Net里有两类,连线 离线 离线的就是DataSet等,可以把数据取出来放进去,然后断开连接,节省服务器资源 当你在本地做了更改后,再连上数据库进行更新 这种取数据和更新数据的工作就是由SqlDataAdapter做的,他是“延长的电线”--这个比喻好像出自《ado.net技术内幕》
SqlDataReader //基于连接,只读访问 适合数据量较小 SqlDataAdapter //基于非连接,适于数据量较大时,可以另行修改,最后再把修改结果返回给数据库。要求资源也大一点
SqlDataReader像一个链表一样,只能往一个方向读数据 SqlDataAdapter的功能就像他们说得非常强大了
1.SqlDataReader返回的是一个数据读写器,只能一条条的读,操作起来不灵活,一般在只读的时候才用到。 2.SqlDataAdapter返回的是数据集或者表,可以对其中的数据作任意操作
SqlDataReader是个数据读取器,向前不可后退、每次只读取一条。速度快,现代项目里面用它用得最多。 DataSet是个内存数据库,它与其它两个是根本不一样的。 SqlDataAdapter是个数据适配器,工作于DataSet和数据库之间,负责将数据从数据源读出来放在DataSet中,或将DataSet中的更改更新回数据库。
所以以上可以综合成两种模式:1是SqlDataReader一条一条读(通常这后面会跟有实体转化相关的);2是使用SqlDataAdapter和DataSet。
上面两种方案中,比较如下: 1.性能。DataSet中的数据完全保存在内存中,所以会占用内存。但是通常情况下DataReader读出的数据实例化以后也是在内存中的,所以两者没有多大区别。但是,当数据量极大的情况下,使用DataSet时,不论是你分页还是不分页,它的效率之低,和SqlDataReader相比都是不可同日而语的,尤其是你在分页情况下,使用DataReader可以只读所需数据,网络流量可以很小,但是DataAdapter还是必须全部读出,网络流量你很难优化,除非你自己去深入控制。 2.方便。DataSet数据保存在内存中,可以用Adapter一次性填充,乍看方便不少,其实不然。由于dataset中的数据都是弱类型的,你用的时候不得不大量使用索引、强制类型转换、类型转换来完成读取任务,麻烦而且易错。从这方便来说,在读取数据时那么一点方便是不可取的。 3.离线。DataSet是离线的,数据读取后可以关闭数据库连接,但是DataReader则必须在使用数据的时候一直连接数据库。现在的项目中大多使用实体(Entity)来保存从DataReader中读取的数据,也能实现离线的目的,虽然麻烦一点,但是后期很方便使用。
ADO.NET提供以下两个对象,用于检索关系数据并将其存储在内存中:DataSet和DataReader。 DataSet提供一个内存中数据的关系表示形式,一整套包括一些表在内的数据(这些表包含数据、对数据进行排序并约束数据),以及表之间的关系。 DataReader提供一个来自数据库的快速、仅向前、只读数据流。当使用DataSet时,经常会利用DataAdapter(也可能是CommandBuilder)与数据源进行交互。当使用DataSet时,也可以利用DataView对DataSet中的数据应用排序和筛选。也可以从DataSet继承,创建强类型DataSet,用于将表、行和列作为强类型对象属性公开。当设计应用程序时,要考虑应用程序所需功能的等级,以确定使用DataSet或者是DataReader。要通过应用程序执行以下操作,就要使用DataSet: l 在结果的多个离散表之间进行导航。 l 操作来自多个数据源(例如,来自多个数据库、一个XML文件和一个电子表格的混合数据)的数据。 l 在各层之间交换数据或使用XML Web服务。与DataReader不同的是,DataSet能传递给远程客户端。 l 重用同样的记录集合,以便通过缓存获得性能改善(例如排序、搜索或筛选数据)。 l 每条记录都需要执行大量处理。对使用DataReader返回的每一行进行扩展处理会延长服务于DataReader的连接的必要时间,这影响了性能。 l 使用XML操作对数据进行操作,例如可扩展样式表语言转换(XSLT转换)或XPath查询。 对于下列情况,要在应用程序中使用DataReader: l 不需要缓存数据。 l 要处理的结果集太大,内存中放不下。 l 一旦需要以仅向前、只读方式快速访问数据。 注:填充DataSet时,DataAdapter使用DataReader。因此,使用DataAdapter取代DataSet提升的性能表现为节省了DataSet占用内存和填充DataSet需要的循环。一般来说,此性能提升只是象征性的,因此,设计决策应以所需功能为基础。 大型项目中,DataReader几乎是首选,DataSet难觅踪影。
本文部分转载:http://blog.csdn.net/ququhu/archive/2005/02/25/301359.aspx