• DataReader使用


    一、DataReader含义

    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的列的序号

    示例一:展示sqlDataReader读取数据

      private void Form2_Load(object sender, EventArgs e)
            {
                string dataStr = "";
                string con = "Data Source=210.26.*.*;Initial Catalog=Test;User ID=sa;Password=****";
                SqlConnection sqlcon = new SqlConnection(con);
                string sql = "select * from Student";
                sqlcon.Open();
                SqlCommand sqlcom = new SqlCommand(sql, sqlcon);
                SqlDataReader sqlrd = sqlcom.ExecuteReader();
                dataStr += "获取DataReader对象包含的记录行数,注意这里DataReader的结构跟数据库的结构是不一样的,它把数据库的一行转换成了一列:" + sqlrd.FieldCount;
                dataStr += "
    ";
                dataStr += "获取序号为0的列的来源数据类型名:" + sqlrd.GetDataTypeName(0);
                dataStr += "
    ";
                dataStr += "获取序号为0的列的数据类型:" + sqlrd.GetFieldType(0);
                dataStr += "
    ";
                dataStr += "获取序列号为0的列的字段名:" + sqlrd.GetName(0);
                dataStr += "
    ";
                dataStr += "获取字段名为HomeAddress的列的序号:" + sqlrd.GetOrdinal("HomeAddress");
                dataStr += "
    ";
                while (sqlrd.Read())
                {
                    dataStr += "
    ";
                    dataStr += sqlrd["ID"] + "," + sqlrd["StudenTnAME"] + "," + sqlrd["HomeAddress"] + "," + sqlrd["Content"];
                    dataStr += "这里是运用GetValue()的方法提取显示数据的:";
                    dataStr += "
    ";
                    for (int i = 0; i < sqlrd.FieldCount; i++)//这里通过循环取出数据,其实就是循环使用GetValue()方法
                    {
                        dataStr += sqlrd.GetValue(i);//这个是一步一步取数据,用的是GetValue()方法,相比于GetValues,GetValues是一步到位,只要循环数组就好
                        dataStr += "
    ";
                    }
                }
                sqlrd.Close();
                sqlcon.Close();
              
            }

    示例二:SqlDataReader相关操作

     static string con = "Data Source=210.26.*.*;Initial Catalog=Test;User ID=sa;Password=*****";
            SqlConnection conn = new SqlConnection(con);        
            //**************************************
             //*演示DataReader的两种取值方法
             //**************************************
             public void basicReader()
             {
              string sql="select * from Student";
              SqlCommand cmd; 
              cmd = conn.CreateCommand();
              cmd.CommandText = sql;
              conn.Open();
              SqlDataReader reader = cmd.ExecuteReader();
              while(reader.Read())
              {
                  Console.WriteLine("ID:{0}\StudenTnAME:{1}\HomeAddress:{2},\Content:{3}", reader.GetInt32(0).ToString(), reader.GetString(1), reader[2].ToString(), reader["Content"].ToString());
              }
              reader.Close();
              conn.Close();
    
             }
     
             //**************************************
             //*演示带参数查询的操作,使用SqlCilent
             //**************************************
             public void hasParamReader()
             {
              SqlCommand cmd; 
              cmd = conn.CreateCommand();
              string sql = "select StudenTnAME,HomeAddress,Content from Student where ID> @id";
              cmd.CommandText = sql;
              SqlParameter param = new SqlParameter("@id",SqlDbType.Int,4);
              param.Value = 2;
              cmd.Parameters.Add(param);
              conn.Open();
              //当关闭reader的时候同时关闭数据库连接
              SqlDataReader reader = cmd.ExecuteReader(CommandBehavior.CloseConnection);
              while(reader.Read())
              {
               Console.WriteLine("StudenTnAME:{0}\HomeAddress:{1}\Content:{2}",reader.GetString(0),reader.GetString(1),reader.GetString(2));
              }
              //无需关闭conn,系统会自动调用这个方法来关闭conn的。
              reader.Close(); 
             }
     
             //**************************************
             //*演示存储过程的输出参数
             //**************************************
             public void outParamShow()
             {
              SqlCommand cmd; 
              cmd = conn.CreateCommand();
              cmd.CommandText = "GetInfo";
              cmd.CommandType = CommandType.StoredProcedure;
              SqlParameter param = cmd.Parameters.Add("@id",16);
              param = cmd.Parameters.Add("@Fname",SqlDbType.VarChar,8);
              param.Direction = ParameterDirection.Output;
              conn.Open();
              cmd.ExecuteNonQuery();
              string Fname = cmd.Parameters["@Fname"].Value.ToString();
              Console.WriteLine(Fname);
              conn.Close();
             }
     
             //**************************************
             //*演示读取多个无关记录集
             //************************************** 
             public void multiResult()
             {
              SqlCommand cmd; 
              cmd = conn.CreateCommand();
              string sqla = "select StudenTnAME from Student";
              string sqlb = "select HomeAddress from Student";
              cmd.CommandText = sqla + ";" + sqlb;
              conn.Open();
              SqlDataReader reader= cmd.ExecuteReader();
              int i = 1;
              do
              {
               Console.WriteLine("" + i.ToString() + "个记录集内容如下:\n");
               while(reader.Read())
               {
                Console.WriteLine(reader[0].ToString() + "\t");
               }
               i++;
              }while(reader.NextResult()); //NextResult()移动到下一个记录集
              reader.Close();
              conn.Close();
             }
  • 相关阅读:
    回归树模型分析纪录片播放量影响因素|数据分享
    拓端tecdat|Python进行多输出(多因变量)回归:集成学习梯度提升决策树GRADIENT BOOSTING REGRESSOR回归训练和预测可视化
    【视频】向量自回归VAR数学原理及R软件经济数据脉冲响应分析实例
    拓端tecdat|R语言单变量和多变量(多元)动态条件相关系数DCCGARCH模型分析股票收益率金融时间序列数据波动率
    拓端tecdat|R语言IRT理论:扩展Rasch模型等级量表模型lltm、 rsm 和 pcm模型分析心理和教育测验数据可视化
    RustSqlx极简教程
    Rust极简教程
    PHP ...语法糖的应用
    springcloud 搭建gateway 遇到一个小坑
    电子时钟滚动效果实现
  • 原文地址:https://www.cnblogs.com/yieryi/p/4618712.html
Copyright © 2020-2023  润新知