DataReader

含义

  使用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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值