一、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();
dataStr += "\r\n";
dataStr += "获取序号为0的列的数据类型:" + sqlrd.GetFieldType();
dataStr += "\r\n";
dataStr += "获取序列号为0的列的字段名:" + sqlrd.GetName();
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 = ; 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().ToString(), reader.GetString(), reader[].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,);
param.Value = ;
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(),reader.GetString(),reader.GetString());
}
//无需关闭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",);
param = cmd.Parameters.Add("@Fname",SqlDbType.VarChar,);
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 = ;
do
{
Console.WriteLine("第" + i.ToString() + "个记录集内容如下:\\n");
while(reader.Read())
{
Console.WriteLine(reader[].ToString() + "\\t");
}
i++;
}while(reader.NextResult()); //NextResult()移动到下一个记录集
reader.Close();
conn.Close();
}

DataReader使用的更多相关文章

  1. 报错:已有打开的与此命令相关联的 DataReader,必须首先将它关闭。

    SqlParameter[] sp = { new SqlParameter("@nGridID",SqlDbType.BigInt), new SqlParameter(&quo ...

  2. DataReader

    Datareader对象不能关使用new关键字创建.但可以使用ExecuteReader()方法创建. DataReader是一行一行的读取记录的.当记录中有数据时Read()返回TRUE,当到记录集 ...

  3. code first提示已有打开的与此 Command 相关联的 DataReader,必须首先将它关闭解决方法

    使用codefirst查询当然是必不可少的,但有时不小心可能很简单的查询也会导致异常. 下面用codefirst做个示例简单演示下异常发生的场景: var attendlist = db.Databa ...

  4. 将DataReader转换为DataTable

    public static DataTable ConvertDataReaderToDataTable(SqlDataReader dataReader) { ///定义DataTable Data ...

  5. C# 之 DataReader 和 DataSet 的区别

    本文转载自:http://www.cnblogs.com/xinaixia/p/4920630.html 1. 获取数据的方式[1]DataReader 为在线操作数据, DataReader会一直占 ...

  6. C#中对象,字符串,dataTable、DataReader、DataSet,对象集合转换成Json字符串方法。

    C#中对象,字符串,dataTable.DataReader.DataSet,对象集合转换成Json字符串方法. public class ConvertJson { #region 私有方法 /// ...

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

    通过ADO.net 查询到数据库的数据后,通过DataReader转为对象Info public class BaseInfo { /// <summary> /// 填充实体 /// & ...

  8. 原创 Datareader 导出为csv文件方法

    DataReader 是游标只读数据, 如果是大数据导出,用Datatable 将耗费巨大内存资源.因为Datatable 其实就是内存中的一个数据表 代码如下 /// <summary> ...

  9. DataReader用法

    一.DataReader含义 DataReader相比于DataSet,DataReader是一个抽象类,所以不能用DataReader DR = new DataReader(),来构造函数创建对象 ...

  10. DataReader和DataSet的异同

    DataReader:使用时始终占用SqlConnection,在线操作数据库:每次只在内存中加载一条数据,所以占用的内存是很小的:是只进的. 只读的. DataSet:则是将数据一次性加载在内存中. ...

随机推荐

  1. Cocos2d-JS实现的2048

    一.前言 2048是之前火过一段时间的休闲数字消除类游戏,它的玩法很简单,上手很容易,可是想到要得到高分却很难,看似简单的游戏却有着很多得分的技巧,想当初这个游戏也曾是陪伴我大学课堂的游戏之一.虽然在 ...

  2. js判断浏览器的类型和获得浏览器的版本

    <!DOCTYPE html><html>    <head>        <meta charset="UTF-8">      ...

  3. 系统管理命令之last

    Linux系统中使用以下命令来查看文件的内容: cat  由第一行开始显示文件内容 tac  从最后一行开始显示,可以看出 tac 是 cat 的倒著写! nl   显示的时候,顺道输出行号! mor ...

  4. Educational Codeforces Round 47

    A. Game Shopping 签. #include <bits/stdc++.h> using namespace std; #define N 1010 int n, m, c[N ...

  5. 《零起点,python大数据与量化交易》

    <零起点,python大数据与量化交易>,这应该是国内第一部,关于python量化交易的书籍. 有出版社约稿,写本量化交易与大数据的书籍,因为好几年没写书了,再加上近期"前海智库 ...

  6. Linux proc 内存

    ps: USER      PID    %CPU %MEM   VSZ   RSS  TTY  STAT  START  TIME  COMMAND root          4238     0 ...

  7. Kali2018.1

    目录 制作U盘启动盘 安装 Kali Linux 之后的事 更新源 配置 Zsh 配置 Vim 修改 Firefox 语言为中文 安装 Gnome 扩展 美化 安装 Google 拼音输入法 安装常用 ...

  8. ExtJS错误解决 Cannot read property 'on' of undefined

    背景 用ExtJS新写了一个功能,运行时控制台打印错误Cannot read property 'on' of undefined,出错代码位置是Ext.define.bindStoreListene ...

  9. AOP Schema配置

    AOP(Aspect-Oriented Programming,面向切面编程),可以说是OOP(Object-Oriented Programing,面向对象编程)的补充和完善.OOP引入封装.继承和 ...

  10. Knockout 模板使用

    html 代码: @using GreenWay.Models; @{ Model.Scripts = new string[] { "~/Scripts/paginationViewMod ...