• ADO.NET中的DataReader详解


    使用特性

    原理图

    clipboard[4]

    PS:Read()使指针下移,同时销毁上一条。所以SqlDataReader是只进的。

            GetValue()是找当前行中的列

    SqlDataReader()特性。

    1)只进的  上面原理图描述了。

    2)只读的   SqlDataReader只能获取,不能修改。

    3)使用SqlDataReader必须保证,Connection的状态是打开的。

          因为结果集存储在数据库服务器中,不打开连接是找不到。

    读数据的方式

    1.reader.GetValue(0) 

    没有列名的重载。

    2.reader[1] 

    索引器就是用GetValue(0)实现的。

    3.reader["列名"] 

    内部通过GetOrdinal()实现的
    //先获取索引
    int index = reader.GetOrdinal(columnName);
    //再通过索引找到对应的列。
    reader.GetValue(index);
    /***注意***:reader["列名"]的执行效率非常差,不建议使用。
    因为如果这样的语句在循环中,循环多少次,就会执行
    多少次没用的 int index = reader.GetOrdinal(columnName);
    */
    如果项目中必须使用列名,建议这样用,千万别傻乎乎的写到循环里头。
    //把获取列名写在循环外头。
    int c1 = reader.GetOrdinal("列名");
    while(reader.Read())
    {
           object obj = reader[c1];
    }

    获取强类型数据

     

    reader.GetString(0);  
    reader.GetINT32(1);
    reader.GetDouble(2);//数据库里的float,这里要用Double。

     

    为什么要获取强类型呢?

    因为Object对象在使用时,要进行一次拆箱,要有性能损耗的。 

    DataReader读取两个结果集

    do{
              if(reader.HasRows)
              {
                   while(reader.read())
                    {     /*读数据*/
                    }
              }  
        }
    //如果有其他结果集,就继续循环!
    while(reader.NextResult());

    动态的获取强类型

    if(reader.HasRows)
    {     
           while(reader.Read())
           {    //遍历列
                for(int i =0;i<reader.FieldCount;i++)
                {     //获取数据类型
                      string dbType =reader.GetDataTypeName(i);
                      switch(dbType)
                      {
                            case "varchar":
                            case "nvarchar"
                            case "char":
                            case "nchar":
                                reader.GetString(i) ;//简写
                                break;
                            case "int":
                                   ......
                      }
                }
           }
    }

    IsDBNull

    当结果集中的列为null,并且需要用强类型获取时,需要用IsDBNull判断一下。

      string obj = reader.IsDBNull(0)? "" : reader.GetString(0);

     

     

     
  • 相关阅读:
    lvm新增脚本
    k8s 开源web操作平台
    ES6 对象数组查找某一个对象
    Git常用命令使用大全
    Failed to read session data On PHP 7.2
    解决Apache无法解析PHP问题
    使用apache htpasswd生成加密的密码文件,并使用.htaccess控制目录访问
    Apache开启关闭错误提示
    linux查找目录下的所有文件中是否含有某个字符串
    抖音60秒视频权限开通方法
  • 原文地址:https://www.cnblogs.com/mcad/p/4211264.html
Copyright © 2020-2023  润新知