• C#与数据库访问技术总结(十三)之DataReader对象


    DataReader对象与数据获取

    DataReader对象以“基于连接”的方式来访问数据库。

    也就是说,在访问数据库、执行SQL操作时,DataReader要求一直连在数据库上。

    这将会给数据库的连接负载带来一定的压力,但DataReader对象的工作方式将在很大程度上减轻这种压力。(感觉这不是前后矛盾了?

    DataReader对象的常用属性

    DataReader对象提供了用顺序的、只读的方式读取用Command对象获得的数据结果集。

    由于DataReader只执行读操作,并且每次只在内存缓冲区里存储结果集中的一条数据,所以使用DataReader对象的效率比较高,如果要查询大量数据,同时不需要随机访问和修改数据,DataReader是优先的选择。

        DataReader对象有以下常用属性。  

    FieldCount属性:该属性用来表示由DataReader得到的一行数据中的字段数

    HasRows属性:该属性用来表示DataReader是否包含数据

    IsClosed属性:该属性用来表示DataReader对象是否关闭

    DataReader对象的常用方法

    同样,在SQL Server Data Provider里的DataReader对象叫SqlDataReader,而在OLE DB Data Provider里叫OleDbDataReader。

    DataReader对象使用指针的方式来管理所连接的结果集,它的常用方法有关闭方法、读取记录集下一条记录和读取下一个记录集的方法、读取记录集中字段和记录的方法,以及判断记录集是为空的方法。

        1.Close方法

        Close方法不带参数,无返回值,用来关闭DataReader对象。

    由于DataReader在执行SQL命令时一直要保持同数据库的连接,所以在DataReader对象开启的状态下,该对象所对应的Connection连接对象不能用来执行其他的操作。

    所以,在使用完DataReader对象时,一定要使用Close方法关闭该DataReader对象,否则不仅会影响到数据库连接的效率,更会阻止其他对象使用Connection连接对象来访问数据库。

       2.bool Read()方法

        bool Read()方法会让记录指针指向本结果集中的下一条记录,返回值是true或false。

    当Command的ExecuteReader方法返回DataReader对象后,须用Read方法来获得第一条记录;

    当读好一条记录想获得下一下记录时,也可以用Read方法。

    如果当前记录已经是最后一条,调用Read方法将返回false。

    也就是说,只要该方法返回true,则可以访问当前记录所包含的字段。

        3.bool NextResult()方法

        bool NextResult()方法会让记录指针指向下一个结果集

    当调用该方法获得下一个结果集后,依然要用Read方法来开始访问该结果集。

        4.Object GetValue(int i)方法

        ObjectGetValue(int i)方法根据传入的列的索引值,返回当前记录行里指定列的值

    由于事先无法预知返回列的数据类型,所以该方法使用Object类型来接收返回数据。

        5.int GetValues(Object[] values)方法

        int GetValues(Object[] values)方法会把当前记录行里所有的数据(一条记录)保存到一个数组里并返回

    可以使用FieldCount属性来获知记录里字段的总数,据此定义接收返回值的数组长度。

        6.获得指定宇段的方法

        获得指定字段的方法有GetString、GetChar、GetInt32等,这些方法都带有一个表示列索引的参数,返回均是Object类型。

    用户可以根据字段的类型,通过输入列索引,分别调用上述方法,获得指定列的值。

    例如,在数据库里,id的列索引是0,通过

     string id=GetString(0); 

        代码可以获得id的值。

        7.返回列的数据类型和列名的方法

    可以调用GetDataTypeName()方法,通过输入列索引,获得该列的类型

    这个方法的定义是:

    string GetDataTypeName( int i)

    可以调用GetName()方法,通过输入列索引,获得该列的名称

    这个方法的定义是:

    string GetName(int i); 

        综合使用上述两方法,可以获得数据表里列名和列的字段。

       8.bool IsDBNull(int i)方法:

        bool IsDBNull(int i)方法的参数用来指定列的索引号,该方法用来判断指定索引号的列的值是否为空,返回Tree或False。

    DataReader对象访问数据库代码示例

    下面的代码将说明如何利用DataReader对象获得并访问结果集。 

    //连接字符串
    private static string strConnect=" data source=localhost;uid=sa;pwd=aspent;database=LOGINDB"
    SqlConnetion objConnection =new SqlConnection(strConnect);
    SqlCommand objCommand =new SqlCommand( " ",objConnection);
    // 设置查询类的SQL语句
    objCommand.CommandText= " SELECT *FROM USERS ";
    try
    {
        //打开数据库连接
      if( objConnection.State == ConnectionState. Closed )
      {
         objConnection.Open();
      }
      //获取运行结果
      SqlDataReader result=objCommand.ExecuteReader();
      //如果DataRead对象成功获得数据,返回true,否则返回false
      If(result.Read()==true)
      {
         //输出结果集中的各个字段
         Response.Write(result["USERID"].ToString());
         Response.Write(result["NICKNAME"].ToString());
         Response.Write(result["USERROLE"].ToString());
      }
    }
    catch(SqlException e)
    {
         Response.Write(e.Message.ToString());
    }
    finally
    {
      //关闭数据库连接
      if(objConnection.State == ConnectionState.Open)
      {
         objConnection.Close();
      }
      //关闭DataRead对象
      if(result.IsClosed == false)
      {
         reuslt.Close();
      }
    }

    DataReader提供未缓冲的数据流,该数据流使过程逻辑可以有效地按顺序处理从数据源中返回的结果。

    由于数据不在内存中缓存,所以在检索大量数据时,DataReader是一种适合的选择。

    另外值得注意的是,DataReader在读取数据时,限制每次只能读一条,这样无疑提高了读取效率,一般适用于返回结果只有一条数据的情况。

    如果返回的是多条记录,就要慎用此对象。

  • 相关阅读:
    vue 动态生成 el-checkbox-group,动态绑定v-model的解决方法
    vue 弹窗内scrollTop取值为0的问题
    软件工程课程学习心得
    《软件工程》学习总结及获奖感言
    软件工程课程心得及小黄衫获奖感想
    Prometheus + Alertmanager 实现企业微信告警
    二进制安装Prometheus
    zabbix机器人告警配置流程
    c++不同平台崩溃解析总结
    c++跨平台开发技术总结
  • 原文地址:https://www.cnblogs.com/zi-xing/p/4056527.html
Copyright © 2020-2023  润新知