含义

  使用DataReader是一个比较节省服务器资源的选择。DataReader提供了一种只读的、只向前的数据访问方法,因此在访问比较复杂的数据,或者只是想显示某些数据时,DataReader再适合不过了。

  datareader对象提供只读单向数据的快速传递,单向:您只能依次读取下一条数据;只读:DataReader中的数据是只读的,不能修改;相对地,DataSet中的数据可以任意读取和修改。

  DataReader相比于DataSet,DataReader是一个抽象类,所以不能用DataReader DR = new DataReader(),来构造函数创建对象,如果要创建一个DataReader对象,必须通过command对象的ExecuteReader方 法。

DataReader对象访问数据的方式,只能顺序读取数据,而且不能写入数据(这点DataSet占据绝对的优势),所谓的顺序读取数据是将数据表中的 行从头至尾一次读出。DataReader被创建时,纪录指针在表的最前端,可以使用Read方法每次从表中读取一条纪录。

DataSet存的是二维数组,而DataReader存的是一维数组。而且DataSet采用的是非连接的传输模式访问数据源,一旦用户所请求的数据读入DataSet,与数据库的连接就关闭,而DataReader则要时刻保持与数据库连接状态。

优点

  节省服务器资源,占用内存少

  指针方式,只读、单向

重要属性

  FieldCount: 只读,表示纪录中有多少字段
  HasMoreResults: 表示是否有多个结果,本属性和SQL Script 搭配使用。
  HasMoreRows: 只读,表示是否还有资料未读取
  IsClosed: 只读,表示DataReader 是否关闭
  Item: 只读,本对象是集合对象,以键值(Key)或索引值(Index)的方式取得纪录中某个字段的数据
  RowFetchCount: 用来设定一次取回多少笔记录,预设值为1 笔

常用方法

  Close():关闭DataReader对象

  GetValue(col):获取序号为col的列的值

  GetValues(values):获取所有字段的值,并将字段值存放到values数组中。

    GetValues(values)方法原来我不会用,特别是对于这个values数组是哪里来的,以及如果自定义该定义为什么类型呢,后来百度就知道 了,用这个方法之前,Object[] values = new Object[sqlrd.FieldCount];这个是定义values数组的方法前提。

  Read():读取下一条纪录,返回布尔型,返回true,则表示有下一条纪录。一般这个方法与while()循环一起用。是DataReader对象最重要的一个方法。

  GetDataTypeName(col) :获取序号为col的列的来源数据类型名

  GetFieldType(col) :获取序号为col的列的数据类型,一般显示会是System.**

  GetName(col): 获取序号为col的列的字段名

  GetOrdinal(name) :获取字段名为name的列的序号

示例

   SqlConnection Conn = new SqlConnection("server=.;database=northwind;uid=sa;pwd=chengbo;");
      SqlCommand Comm = new SqlCommand("SELECT EmployeeID, LastName, BirthDate FROM Employees", Conn);
 
      try
      {
        Conn.Open();
        SqlDataReader reader = Comm.ExecuteReader();
        while(reader.Read())
        {
          //此处使用序数索引器
          Response.Write("<P>" + reader[0] + "&nbsp;" + reader[1] + "&nbsp;" + reader[2] + "</P>");
        }
        reader.Close();
      }
      catch(SqlException ex)
      {
        Response.Write(ex.Message);
      }
      finally
      {
        Conn.Close();
      }

  

  上面的代码使用的是序数索引器,还可以使用列名索引器:

Response.Write("<P>" + reader["EmployeeID"] + "&nbsp;" + reader["LastName"] + "&nbsp;" + reader["BirthDate"] + "</P>");

  此外,还可以使用类型访问方法:

Response.Write("<P>" + reader.GetSqlInt32(0).ToString() + "&nbsp;" + reader.GetSqlString(1).ToString() + "&nbsp;" + reader.GetSqlDateTime(2).ToString() + "</P>");

  三种方法最终的结果都一样,但是哪种方法性能更好,速度更快呢?

  答案是

类型访问 > 序数索引器 > 列名索引器

  序数索引是通过列的序数来访问列值的,这种方法不必从行中查找列,而是直接跳到指定的列中进行访问,因而比较省资源,速度较快。

  列名索引是通过列的名称来访问列值的,这种方法虽然速度一般,但是它使得代码更易读,因而更易维护,降低了成本。

  类型访问和序数索引比较相像,它也包含序数,但它同时指定了数据类型,减少了额外的工作,因而使速度更快,类型更安全。

  这里要提到的是,由于我们使用的是MSDE(SQL Server 2000),而.Net Framework提供了专门为SQL Server 7.0及以上版本设计的优化类型方法,所以我们使用了GetSqlInt32、GetSqlString、GetSqlDateTime等优化方法,更为 通用的是GetInt32、GetString、GetDateTime等。

  GetSqlInt32、GetSqlString、GetSqlDateTime等方法返回的是SqlTypes对象,比 如,GetSqlInt32方法返回的是System.Data.SqlTypes.SqlInt32类型而不是System.Int32对象,后者才是 GetInt32方法返回的对象,所以我们在每个方法后再调用了ToString方法进行转换,这样才能使用"+"连接,然后输出。

转载于:https://www.cnblogs.com/panpanwelcome/p/5531271.html

DataReader相关推荐

  1. 用DataReader还是DataSet?

    作者:Jonathan Goodyear        出处:网络 我经常听到有人问这个问题:"在ASP.NET Web应用程序中我应该用DataReader类还是DataSet类呢?&qu ...

  2. C#使用ExecuteReader返回DataReader既有查询结果集又有输出参数或返回值的使用注意事项...

    Command 对象公开了几个可用于执行所需操作的 Execute 方法.当以数据流的形式返回结果时,使用 ExecuteReader 可返回 DataReader 对象.使用 ExecuteScal ...

  3. DataReader和DataSet区别

    第一种解释 DataReader和DataSet最大的区别在于,DataReader使用时始终占用SqlConnection,在线操作数据库..任何对SqlConnection的操作都会引发DataR ...

  4. 使用DataReader、DataSet、DataAdapter和DataView

    使用DataReader.DataSet.DataAdapter和DataView ADO.NET提供两个对象用于检索关系型数据并把它存储在内存中,分别是DataSet和DataReader.Data ...

  5. DataReader方式 获取数据

    /// /// 得到一个对象实体 DataReader方式 /// /// /// 成功返回对象模型,失败返回null public DotNet.Model.Base_Department GetM ...

  6. DataReader 要在事务提交前 CLOSE 掉 否则会报一个:已有打开的与此命令相关联的 DataReader,必须首先将它关闭。...

    DataReader 要在事务提交前 CLOSE 掉 否则会报一个:已有打开的与此命令相关联的 DataReader,必须首先将它关闭. 转载于:https://www.cnblogs.com/run ...

  7. c#中datareader中HasRows属性和Read方法的区别

    datareader.HasRows 属性获取一个值,该值指示 SqlDataReader 是否包含一行或多行,如果是则返回true,否则返回false;         datareader.rea ...

  8. GridView绑定数据源 绑定DataReader /DataSet /DataTable

    有一个GridView1 <asp:GridView ID="GridView1" runat="server"></asp:GridView ...

  9. 已有打开的与此 Command 相关联的 DataReader,必须首先将它关闭

    已有打开的与此 Command 相关联的 DataReader,必须首先将它关闭 引用:   http://www.cnblogs.com/maxao/archive/2011/03/18/19881 ...

  10. ASP.NET 2.0 - 选用DataSet或DataReader

    我们在之前的一篇文章提到如何善用「善用 DataSourceMode 属性」(http://www.cnblogs.com/liminzhang/archive/2006/12/18/595332.h ...

最新文章

  1. mysql information schema_[MySql技术]MySQL中information_schema是什么
  2. C语言实现常用数据结构——队列
  3. Butterknife 的简单使用 和 配合 Butterknife的插件 Zelezny
  4. HALCON 1D Measure 算子初识
  5. 让其他CMS黯然失色的we7CMS
  6. android 距离设置多少dp核实,【Android学习】android布局中几个距离单位的区别:px、dp、sp...
  7. ld cannot find an existing library
  8. weiphp看版本_安装WeiPHP
  9. SQL Server远程连接操作
  10. 消息队列的使用场景(转载c)
  11. 【JavsScript】作用域链
  12. SSD——样本正负比控制+多尺度检测 (目标检测)(one-stage)(深度学习)(ECCV 2016)
  13. 疯狂Java讲义(一)
  14. 基于FBMC的调制解调系统
  15. c语言多个大写变小写字母,c语言大写字母转换成小写字母
  16. kafka-manger监控部署
  17. 用HTML+CSS做一个简单好看的环保网页
  18. 剑指Offer对答如流系列 - 用两个栈实现队列
  19. Kali + Win10双系统下的grub问题
  20. (附源码)ssm招聘网站 毕业设计 250858

热门文章

  1. java基础学习(一)
  2. 操作系统面试题(三)
  3. 3 判断是否为合法的URL
  4. Swustoj(594)Maximum Tape Utilization Ratio(最容易懂的题解)
  5. 数字后端基本概念介绍Utilization
  6. 最小二乘中的误差项的方差齐性
  7. C# 使用Aspose.Words实现数据导出自定义word
  8. 2020大学生喜爱雇主榜单揭晓:新东方、字节跳动和小米招聘量最大
  9. 哈佛大学开放课程:《公正:该如何做是好?》4
  10. A. Maomao's candy