本文转载自:http://www.cnblogs.com/xinaixia/p/4920630.html

1. 获取数据的方式
[1]DataReader 为在线操作数据, DataReader会一直占用SqlConnection连接,在其获得数据过程中其它操作不可以再使用SqlConnection连接对象。

代码如下:
while(datareader.read())
{
..............
}
dataview.datasource=datareader;
dataview.databind();

[2]DataSet为离线操作数据,DataSet会将数据一次性读入内存,然后断开连接,这时其它操作就可以使用SqlConnection连接对象。
后台代码如下:

   public string test = "";
  protected void Page_Load(object sender, EventArgs e)
  {
    DataSet ds=new DataSet();//这里是你的数据,我就不写了
    test = "<table>";
    for (int i = 0; i < ds.Tables[0].Rows; i++)
    {
      test+="<tr><td>"+ds.Tables[0].Rows[i]["你要的字段"].ToString()+"</td></tr>"
    }
    test+="</table>";
  }

页面代码如下:

<form id="form1" runat="server">
<%=test %>
</form>

  由于DataReader一次只读取一行数据,所以占用内存较小。但DataReader为只进且只读的,也就是只能单方向向前读取,如果你想回头去读取上一条数据是不允许的,并且不允许其修改数据。
  由于DataSet一次性读取所有数据,所以比较消耗资源,但也提高了灵活性,在断开数据库连接情况下你可以对数据进行任何增删改查,按照任意的顺序读取数据,并可以将其写回到数据库。
    有一点需要注意,DataReader一次读取一行并不意味着这时在数据库中的数据被修改,可以读到新的数据,这是数据库层面的保护.

2.获取数据的机制
  DataReader是通过IDbCommand.ExecuteReader来读取数据。
  DataSet则是通过DbDataAdapter.Fill来填充数据。
  所以DataReader在获取数据时不能关闭连接。而DataSet则可以,因为DbDataAdapter已经将数据读取到应用程序服务器中,所以在使用DataReader时一定要注意,及时关闭连接。

3.其它区别
  DataReader读取速度快于DataSet。
  DataReader是数据提供者类,DataSet是一般性类,借助于DbDataAdapter来填充数据。
  因为DataSet是离线操作数据,所以在事务中使用锁时要注意,因为DataSet填充数据后会断开连接,也就会释放锁。

4.使用DataReader可以提高执行效率,有两种方式可以提高代码的性能:一种是基于序号的查找,一个是使用适当的Get方法来查找。

  因为查询出来的结果一般都不会改变,除非再次改动查询语句,因此可以通过定位列的位置来查找记录。用这种方法有一个问题,就是可能知道一列的名称而不知道其所在的位置,这个问题的解决方案是通过调用DataReader 对象的GetOrdinal()方法,此方法接收一个列名并返回此列名所在的列号。例:

代码如下:
int id = reader.GetOrdinal("CategoryName");
while (reader.Read())
{
  Response.Write(reader.GetInt32(0).ToString() + " " + reader.GetString(1).ToString() + "<br />");
  reader.Close();
}

  DataReader的GetInt32()和GetString()通过接收一个列号来返回一个列的值,这两种是最常用的,其中还有很多其它的类型。
  

注意:

  DataReader对象在调用其 Close() 方法关闭 DataReader 对象,然后调用 SqlConnection 对象的 Close 方法关闭与数据库的连接,如果在没有关闭之前又重新打开第二个连接,则会产生一条异常信息,如:并发问题。使用完SqlDataReader后,可以在程序中显示的调用 数据库连接对象的 Close() 方法关闭连接,也可以在调用Command对象的ExecuteReader方法时传递 CommandBehavior.CloseConnection 这个枚举变量,这样在调用SqlDataReader的 Close 方法时会自动关闭数据库连接。

     //未式关闭连接
public SysFunction GetModelById(string id)
{
SqlConnection conn = new SqlConnection(ConfigurationManager.ConnectionStrings["sqlConStr"].ToString());
conn.Open();
SqlCommand cmd = new SqlCommand("SELECT * FROM SysFunction WHERE FunctionId =" + id, conn); SqlDataReader dataReader = cmd.ExecuteReader();
SysFunction model = new SysFunction();
while (dataReader.Read())
{
model.FunctionName = dataReader["FunctionName"].ToString();
model.FunctionCode = dataReader["FunctionCode"].ToString();
} dataReader.Close();
dataReader.Dispose();
string drState = dataReader.IsClosed.ToString(); //True
string connState = conn.State.ToString(); //Open
return model; }      //调用Connection 对象的 Close() 方法显式关闭连接
public SysFunction GetModelById(string id)
{
SqlConnection conn = new SqlConnection(ConfigurationManager.ConnectionStrings["sqlConStr"].ToString());
conn.Open();
SqlCommand cmd = new SqlCommand("SELECT * FROM SysFunction WHERE FunctionId =" + id, conn); SqlDataReader dataReader = cmd.ExecuteReader();
SysFunction model = new SysFunction();
while (dataReader.Read())
{
model.FunctionName = dataReader["FunctionName"].ToString();
model.FunctionCode = dataReader["FunctionCode"].ToString();
} dataReader.Close();
dataReader.Dispose();
       conn.Close(); //显式关闭连接 string drState = dataReader.IsClosed.ToString(); //True
string connState = conn.State.ToString(); //Close
return model; }      //调用Command 对象的 ExecuteReader() 方法时传递 CommandBehavior.CloseConnection 参数
public SysFunction GetModelById(string id)
{
SqlConnection conn = new SqlConnection(ConfigurationManager.ConnectionStrings["sqlConStr"].ToString());
conn.Open();
SqlCommand cmd = new SqlCommand("SELECT * FROM SysFunction WHERE FunctionId =" + id, conn); //执行该cmd时,如果关闭关联的 DataReader 对象,则关联的 Connection 对象也将关闭
SqlDataReader dataReader = cmd.ExecuteReader(CommandBehavior.CloseConnection);
SysFunction model = new SysFunction();
while (dataReader.Read())
{
model.FunctionName = dataReader["FunctionName"].ToString();
model.FunctionCode = dataReader["FunctionCode"].ToString();
} dataReader.Close();
dataReader.Dispose(); string drState = dataReader.IsClosed.ToString(); //True
string connState = conn.State.ToString(); //Close
return model; }

C# 之 DataReader 和 DataSet 的区别的更多相关文章

  1. Data Base sqlServer DataReader与DataSet的区别

    sqlServer   DataReader与DataSet的区别 从以下这几个方面比较: 1.与数据库连接: DataReader:面向连接,只读,只进,只能向前读,读完数据就断开连接: DataS ...

  2. sqlServer DataReader与DataSet的区别

    sqlServer   DataReader与DataSet的区别 从以下这几个方面比较: 1.与数据库连接: DataReader:面向连接,只读,只进,只能向前读,读完数据就断开连接: DataS ...

  3. DataReader 和 DataSet 的区别

    摘自:http://www.cnblogs.com/zhjjNo1/archive/2009/08/26/1554420.html 第一种解释 DataReader和DataSet最大的区别在于,Da ...

  4. DataReader和DataSet的区别以及使用

    DataReader和DataSet这两个对象都可以将检索的关系数据存储在内存中.它们在功能使用方面非常相似,但是它们不可以相互替换. 主要区别如表所示:   DataReader DataSet 数 ...

  5. ADO.NET_包括DataReader和dataSet的使用

    今天总结了一下ADO.NET编程中DataReader和dataSet两个比较重要的对象的使用,完成了combobox,listbox,以及fpSpread动态添加数据的测试,对使用sqlComman ...

  6. datareader 和dataset 区别

    ADO.NET2.0提供了两个用于检索关系数据的对象:DataSet和DataReader.并且这两个对象都可以将检索的关系数据存储在内存中.在软件开发过程中经常用到这两个控件,由于这两个控件在使用和 ...

  7. DataReader和DataSet区别

    可以使用DataReader类的对象或DataSet类的对象从数据库读取数据,但它们是有区别的,归纳起来大致有以下几条: 1.       DataReader是数据管理提供者类,而DataSet是一 ...

  8. C#中对象,字符串,dataTable、DataReader、DataSet,对象集合转换成Json字符串方法。

    C#中对象,字符串,dataTable.DataReader.DataSet,对象集合转换成Json字符串方法. public class ConvertJson { #region 私有方法 /// ...

  9. Spark RDD、DataFrame和DataSet的区别

    版权声明:本文为博主原创文章,未经博主允许不得转载.   目录(?)[+]   转载请标明出处:小帆的帆的专栏 RDD 优点: 编译时类型安全 编译时就能检查出类型错误 面向对象的编程风格 直接通过类 ...

随机推荐

  1. ASP.NET Core Docker部署

    前言 在前面文章中,介绍了 ASP.NET Core在 macOS,Linux 上基于Nginx和Jexus的发布和部署,本篇文章主要是如何在Docker容器中运行ASP.NET Core应用程序. ...

  2. ABP理论学习之授权(Authorization)

    返回总目录 本篇目录 介绍 定义权限 检查权限 使用AbpAuthorize特性 使用IPermissionChecker Razor视图 客户端(Javascript) 权限管理者 介绍 几乎所有的 ...

  3. TCP状态

    TCP状态 TCP连接中包含不同的状态,如何通过状态来判断程序问题尤为重要. 三次握手 图中的connection部分为三次握手. 四次握手 图中的close部分为四次握手. CLOSE_WAIT 服 ...

  4. lua中清空目录和递归创建目录

    lua中的 lfs.mkdir lfs.rmdir只能针对单个目录,且lfs.rmdir不能清空文件夹 于是我想到了使用os.execute 递归创建目录如下os.execute("mkdi ...

  5. MySQL_01之MySQL数据库基础

    1.通过SQL(结构化查询语言)操作数据库: DDL:数据定义语言,创建库,创建表,选择: DML:数据操作语言,完成数据增删改: DQL:数据查询语言,完成数据查询: DCL:数据控制语言,授权.回 ...

  6. javascript命名规范

    javascript命名规范 3.命名 命名的方法通常有以下几类: a).命名法说明 1).camel命名法,形如thisIsAnApple 2).pascal命名法,形如ThisIsAnApple ...

  7. Spring注入JPA+JPA事务管理

    本例实现的是Spring注入JPA 和 使用JPA事务管理.JPA是sun公司开发的一项新的规范标准.在本质上来说,JPA可以看作是Hibernate的一个子集:然而从功能上来说,Hibernate是 ...

  8. Css概要与选择器,刻度单位

    目录 一.CSS3概要 1.1.特点 1.2.效果演示 1.3.帮助文档与学习 二.选择器 1.1.基础的选择器 1.2.组合选择器 1.3.属性选择器 1.4.伪类 1.5.伪元素 三.特殊性(优先 ...

  9. Ucos系统任务间的通信详解

    物联网开发中,ucos系统任务间的通信是指,两个任务之间有数据的交互,具体的一起来看看吧. 1)消息邮箱 我们还是提供两个任务Task1和Task2,假设我们还是解决刚刚的问题,Task1进行按键扫描 ...

  10. 【解决】Word 在试图打开文件时遇到错误 请尝试下列方法:* xxx * xxx * xxx

    有好几种情况,我先说我的这个情况 1.word设置不当导致 看图: 然后就能打开了~ 2.word格式问题,比如原来是doc,被人手动改成docx~~~ 解决方法:改回来 3.word版本不兼容,比如 ...