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 += "\r\n";
            dataStr += "获取序号为0的列的来源数据类型名:" + sqlrd.GetDataTypeName(0);
            dataStr += "\r\n";
            dataStr += "获取序号为0的列的数据类型:" + sqlrd.GetFieldType(0);
            dataStr += "\r\n";
            dataStr += "获取序列号为0的列的字段名:" + sqlrd.GetName(0);
            dataStr += "\r\n";
            dataStr += "获取字段名为HomeAddress的列的序号:" + sqlrd.GetOrdinal("HomeAddress");
            dataStr += "\r\n";
            while (sqlrd.Read())
            {
                dataStr += "\r\n";
                dataStr += sqlrd["ID"] + "," + sqlrd["StudenTnAME"] + "," + sqlrd["HomeAddress"] + "," + sqlrd["Content"];
                dataStr += "这里是运用GetValue()的方法提取显示数据的:";
                dataStr += "\r\n";
                for (int i = 0; i < sqlrd.FieldCount; i++)//这里通过循环取出数据,其实就是循环使用GetValue()方法
                {
                    dataStr += sqlrd.GetValue(i);//这个是一步一步取数据,用的是GetValue()方法,相比于GetValues,GetValues是一步到位,只要循环数组就好
                    dataStr += "\r\n";
                }
            }
            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();
         }
时间: 2024-10-10 20:08:53

DataReader使用的相关文章

【2016-11-2】【坚持学习】【Day17】【通过反射自动将datareader转为实体info】

通过ADO.net 查询到数据库的数据后,通过DataReader转为对象Info public class BaseInfo { /// <summary> /// 填充实体 /// </summary> /// <param name="dr"></param> public virtual void Fill(DataRow dr) { PropertyInfo[] ps = this.GetType().GetProperties

There is already an open DataReader associated with this Command which must be closed first.

解决"There is already an open DataReader associated with this Command which must be closed first." exception in EF 中 当我开启惰性加载情况下,系统会报此异常信息,出现此异常是发生于Sql server 2005. 解决方法:在数据库连接字符串中添加MARS信息为true <add name="CRGDatabase" connectionString

DataReader对象(数据读取)

DataReader对象提供了一个只进只读的数据读取器,用于从查询结果中读取数据,它每次仅能读取一行数据. [常用属性]: FieldCount:获取当前行的列数: HasRows:表明查询结果中是否还存在未被读取的数据. [常用方法]: Close:关闭SqlDataReader对象: GetName:获取指定列的名称; Read:使SqlDataReader前进到下一条记录. [使用DataReader对象对数据库进行查询操作步骤]: 1.创建Connection对象: 2.打开数据库连接:

已有打开的与此 Command 相关联的 DataReader,必须首先将它关闭。

多次用到SqlDataReader 要先关闭,再执行ExecuteNonQuery操作 每用一次需要先进行关闭,再执行新的一次,要不然就会报错“已有打开的与此 Command 相关联的 DataReader,必须首先将它关闭.” 那么如何解决呢? 方法有两种1,在ConnectionString加上MultipleActiveResultSets=true,但只适用于SQL 2005以后的版本2.选择读出SqlDataReader 中的数据给List或者arraylist之类的,之后进行关闭返回

使用DataReader读取数据

List<User> allUsers = new List<User>(); SqlConnection conn = new SqlConnection(连接字符串); SqlCommand cmd = new SqlCommand("SELECT语句",conn); conn.Open(); using(SqlDataReader rdr = cmd.ExecuteReader()){ while(rdr.Read()) { User u = new Us

【转】已有打开的与此 Command 相关联的 DataReader,必须首先将它关闭

在运用Linq to sql 或者 linq to entity等相关linq技术进行数据库访问操作时,如果发生上述异常是因为是因为.NET內部是使用DataReader作数据存取,DataReader用同一个Connection. 解决办法有两个: 1,设定ConnectionString加上MultipleActiveResultSets=true,但只适用于SQL 2005以后的版本2.先读出放置在List中 例如将 var preObj = (from a in db.ArticleEA

DataReader 和 DataSet 的区别

摘自:http://www.cnblogs.com/zhjjNo1/archive/2009/08/26/1554420.html 第一种解释 DataReader和DataSet最大的区别在于,DataReader使用时始终占用SqlConnection(俗称:非断开式连接),在线操作数据库时,任何对SqlConnection的操作都会引发DataReader的异常.因为DataReader每次只在内存中加载一条数据,所以占用的内存是很小的.由于DataReader的特殊性和高性能,所以Dat

DataReader和DataSet的区别

使用DataSet是为了实现应用程序的下述功能: 1 操作结果中的多个分离的表.    2 操作来自多个源(例如来自多个数据库.XML文件和电子表格的混合数据)的数据.    3 在层之间交换数据或使用XML Web服务.与DataReader 不同,DataSet能被传递到远程客户端.    4 通过缓冲重复使用相同的行集合以提高性能(例如排序.搜索或过滤数据).    5 每行执行大量的处理.在使用DataReader返回的行上进行扩展处理将使连接存在的时间比必要的更长,从而降低效率.   

大数据导致DataReader.Close超时的异常

公司一个数据抓取的程序,数据量极大,读取数据的用IDataReader的Read方法来进行数据处理,在测试的时候我想跑一部分数据后跳出循环,即break; 然后关闭datareader,但是在执行datareader.close()方法的时候出现了“超时异常”的错误, 查看了一下MSDN对Close方法的说明的备注 如下: 当使用 SqlDataReader 将关联的 SqlConnection 用于任何其他用途时,必须显式调用 Close 方法. Close 方法填写输出参数的值.返回值和 R

SqlHelper类编写前奏:DataReader关闭链接出现问题

SqlHelper是一个执行数据库操作的助手类,但是当我们没学过DataSet之前,要想使用using搭配SqlConnection和SqlCommand写出一个真正独立的SqlHelper都是不太可能的. 比如:一个常规的ExecuteReader方法如果使用上述做法,代码如下: using System.Data.SqlClient; namespace ExecuteScalar.libs { class SqlHelper { public static SqlDataReader Ex