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难觅踪影。

SqlDataReader和SqlDataAdapter的更多相关文章

  1. SqlDataReader、SqlDataAdapter與SqlCommand的 区别

    1.SqlDataReader,在线应用,需要conn.open(),使用完之后要关闭. SqlConnection conn = new SqlConnection(connStr); //conn ...

  2. C#中ExecuteReader、ExecuteNonQuery、ExecuteScalar、SqlDataReader、SqlDataAdapter应该怎么用?

    C#中ExecuteReader.ExecuteNonQuery.ExecuteScalar.SqlDataReader.SqlDataAdapter应该怎么用? (2013-10-16 13:21: ...

  3. 使用SqlDataReader和SqlDataAdapter的注意

    1.当SqlDataReader没有关闭之前,数据库连接会一直保持open状态,所以在使用SqlDataReader时,使用完毕应该马上调用SqlDataReader.Close()关闭它. 2.一个 ...

  4. C#中ExecuteReader、ExecuteNonQuery、ExecuteScalar、SqlDataReader、SqlDataAdapter的区别

    ExecuteNonQuery()执行命令对象的SQL语句,返回一个int 类型的变量,返回数据库操作之后影响的行数.适合用来验证对数据库进行增删改的情况. 2.ExecuteScalar()也可以执 ...

  5. 关于SqlDataReader使用的一点疑惑

    C#中的SqlDataReader类(System.Data.SqlClient)是用来在保持打开数据库连接的状态下取数据用的 用法如下图: “保持与数据库的连接”这个特性也是SqlDataReade ...

  6. 如何从SqlDataReader中获取DataRow

    1.前言使用SqlDataReader较之SqlDataAdapter速度上快,因为读取记录是一行一行的来,但是往往也感觉那么蹩脚.例如经常用到的如何从SqlDataReader中获取DataRow呢 ...

  7. 黑马程序员_ADO.Net(ExecuteReader,Sql注入与参数添加,DataSet,总结DataSet与SqlDataReader )

    转自https://blog.csdn.net/u010796875/article/details/17386131 一.执行有多行结果集的用ExecuteReader SqlDateReader  ...

  8. 如何取消 SqlDataAdapter.Fill() 的执行(转载)

    问 Scenario: We have a DataGridView which is attached to DataAdapter (datatable), we load the data in ...

  9. CYQ.Data V5 从入门到放弃ORM系列:框架的优势

    前言: 框架开源后,学习使用的人越来越多了,所以我也更加积极的用代码回应了. 在框架完成了:数据库读写分离功能 和 分布式缓存功能 后: 经过三天三夜的不眠不休,终于完成框架第三个重量级的功能:自动化 ...

随机推荐

  1. CFD冲蚀模拟的一些理论

    [TOC] 在CFD中计算颗粒对固体壁面的冲蚀往往采用冲蚀模型(Erosion Model). 1 冲蚀速率(Erosion Rate) 冲蚀速率定义为壁面材料在单位时间单位面积上损失的质量(单位:\ ...

  2. iOS开发常用代码块(第二弹)

    GCD定时器 dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, ); dispat ...

  3. Python 字符串相加问题

    今天在用Python拼接字符串时碰到个问题,从数据库取出来的数据以及获取到的时间等数据拼成了一个字符串a,将字符串a与自定义的字符串b拼接时一直中断,无法继续执行,也没有报错,将数据库取出数据变成自定 ...

  4. mysql小技巧

    将一列值赋予另一列 会遇到新增一列, 需要用其他列的值来初始化这一列 或者根据业务条件把某行的某列值直接赋予到其他列. 行号 列1 列2 1 aaa ddd 2 bbb ccc UPDATE 表 SE ...

  5. pcl曲面网格模型的三种显示方式

    pcl网格模型有三种可选的显示模式,分别是面片模式(surface)显示,线框图模式(wireframe)显示,点模式(point)显示.默认为面片模式进行显示.设置函数分别为: void pcl:: ...

  6. HTTPf服务器(3)

    功能完整的HTTP服务器 导语 这个一个功能完备的HTTP服务器.它可以提供一个完整的文档输,包括图像,applet,HTML文件,文本文件.它与SingleFileHttpServer非常相似,只不 ...

  7. 【Kindle】pdf转mobi适合kindle查看格式

    pdf转mobi适合kindle查看格式 1.用到软件:福昕风腾PDF套件,切白边,PDF-Viewer,导出png图片ChainLP,图片转换为mobi文件<期间要下载kindlegen.ex ...

  8. 协程--gevent模块(单线程高并发)

    先恶补一下知识点,上节回顾 上下文切换:当CPU从执行一个线程切换到执行另外一个线程的时候,它需要先存储当前线程的本地的数据,程序指针等,然后载入另一个线程的本地数据,程序指针等,最后才开始执行.这种 ...

  9. dubbo 配置解析

    1.dubbo 常用配置 <dubbo:service/> 服务配置,用于暴露一个服务,定义服务的元信息,一个服务可以用多个协议暴露,一个服务也可以注册到多个注册中心.eg.<dub ...

  10. 【HDU 3037】Saving Beans Lucas定理模板

    http://acm.hdu.edu.cn/showproblem.php?pid=3037 Lucas定理模板. 现在才写,noip滚粗前兆QAQ #include<cstdio> #i ...