zoukankan      html  css  js  c++  java
  • 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方法进行转换,这样才能使用"+"连接,然后输出。 

  • 相关阅读:
    datatables 自定义排序
    nginx 高并发配置参数
    查看域名https证书到期时间
    Python七大原则,24种设计模式
    scrapy RuntimeError: maximum recursion depth exceeded while calling a Python object 超出python最大递归数异常
    scrapy 用pycharm调试
    修改Mysql 字符集,支持Emoji表情
    redis资料
    mysql 开启日志与性能调优
    python 版本号比较 重载运算符
  • 原文地址:https://www.cnblogs.com/panpanwelcome/p/5531271.html
Copyright © 2011-2022 走看看