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

三、DataReader实例

 
C# 代码   复制

        protected void Page_Load(object sender, EventArgs e)

        {

string con = ConfigurationManager.ConnectionStrings["con"].ToString();

SqlConnection sqlcon = new SqlConnection(con);

string sql = "select * from Cloths";

sqlcon.Open();

SqlCommand sqlcom = new SqlCommand(sql, sqlcon);

SqlDataReader sqlrd;

sqlrd = sqlcom.ExecuteReader();

Response.Write("获取DataReader对象包含的记录行数,注意这里DataReader的结构跟数据库的结构是不一样的,它把数据库的一行转换成了一列:" + sqlrd.FieldCount);

Response.Write("<br>");

Response.Write("获取序号为0的列的来源数据类型名:" + sqlrd.GetDataTypeName(0));

Response.Write("<br>");

Response.Write("获取序号为0的列的数据类型:" + sqlrd.GetFieldType(0));

Response.Write("<br>");

Response.Write("获取序列号为0的列的字段名:"+sqlrd.GetName(0));

Response.Write("<br>");

Response.Write("获取字段名为品牌的列的序号:"+sqlrd.GetOrdinal("品牌"));

Response.Write("<br>");

while (sqlrd.Read())

{

Response.Write("<br>");

Response.Write(sqlrd["id"] + "," + sqlrd["品牌"] + "," + sqlrd["价格"] + "," + sqlrd["数量"]);

Response.Write("<br>");

Response.Write("<br>");

Response.Write("下面的显示要注意,为什么序列号为0的是品牌而不是id,虽然GridViewCommon页面第一列是id,不过这里是要充分尊重数据库的结构,可以看出数据库中第一列是品牌!");

Response.Write("<br>");

Response.Write("这里通过GetString函数取出序号为0的列的数据,这里要根据数据的不同类型选用不同的Get函数,可能是GetChar(),GetInt32()等等:"+sqlrd.GetString(0));//这里可以看出GetValue函数可以不需要事先知道每一列的数据类型就可以取出数据,所以尽量用GetValue函数

Response.Write("<br>");

Response.Write("这里通过GetValue函数取出序号为0的列的数据,不需要管数据时什么类型,这里注意跟上面的比较:" + sqlrd.GetValue(0));

Response.Write("<br>");

Response.Write("<br>");

Response.Write("这里是运用GetValue()的方法提取显示数据的:");

for (int i = 0; i < sqlrd.FieldCount;i++ )//这里通过循环取出数据,其实就是循环使用GetValue()方法

{

Response.Write(sqlrd.GetValue(i));//这个是一步一步取数据,用的是GetValue()方法,相比于GetValues,GetValues是一步到位,只要循环数组就好

Response.Write("<br>");

}

Response.Write("<br>");

Response.Write("这里是运用GetVales()方法提取显示数据的:");

Response.Write("<br>");

Object[] values = new Object[sqlrd.FieldCount];//这一步是很重要的,你要先给定义一个数组

sqlrd.GetValues(values);//注意这边是用的是GetValues(values)方法

Response.Write(values[0]+","+values[1]+","+values[2]+","+values[3]+","+values[4]);

Response.Write("<br>");

for (int i = 0; i < sqlrd.FieldCount;i++ )//这里是循环的values数组,而不是GetValues(values)方法

{

Response.Write("<br>");

Response.Write(values[i]);

Response.Write("<br>");

}



}

sqlrd.Close();

Response.Write("<br>");

Response.Write(sqlrd.RecordsAffected);//获取执行SQL语句所更改,插入或删除的行数

sqlcon.Close();

}

实例2:

 
C# 代码   复制

using System;

using System.Data;

using System.Data.SqlClient;

using System.Data.OleDb;

class SqlReader

{
const string connStr = "data source=table;user id=sa;password=dddd;initial catalog=contract";
SqlConnection conn;


public SqlReader()
{
conn = new SqlConnection(connStr);
}

//**************************************
//*演示DataReader的两种取值方法
//**************************************
public void basicReader()
{
string sql="select * from friend";
SqlCommand cmd;
cmd = conn.CreateCommand();
cmd.CommandText = sql;
conn.Open();
SqlDataReader reader = cmd.ExecuteReader();
while(reader.Read())
{
Console.WriteLine("No:{0}\\tName:{1}\\tPhoneNum:{2},\\tAddress:{3}",reader.GetInt32(0).ToString(),reader.GetString(1),reader[2].ToString(),reader["Faddress"].ToString());
}
showSplit();
reader.Close();
conn.Close();
}

//**************************************
//*演示带参数查询的操作,使用SqlCilent
//**************************************
public void hasParamReader()
{
SqlCommand cmd;
cmd = conn.CreateCommand();
string sql = "select Fname,Fphone,Faddress from friend where Fid > @Fid";
cmd.CommandText = sql;
SqlParameter param = new SqlParameter("@Fid",SqlDbType.Int,4);
param.Value = 15;
cmd.Parameters.Add(param);
conn.Open();
//当关闭reader的时候同时关闭数据库连接
SqlDataReader reader = cmd.ExecuteReader(CommandBehavior.CloseConnection);
while(reader.Read())
{
Console.WriteLine("Name:{0}\\tPhoneNum:{1}\\tAddress:{2}",reader.GetString(0),reader.GetString(1),reader.GetString(2));
}
showSplit();
//无需关闭conn,系统会自动调用这个方法来关闭conn的。
reader.Close();
}

//**************************************
//*演示存储过程的输出参数
//**************************************
public void outParamShow()
{
SqlCommand cmd;
cmd = conn.CreateCommand();
cmd.CommandText = "GetInfo";
cmd.CommandType = CommandType.StoredProcedure;
SqlParameter param = cmd.Parameters.Add("@Fid",16);
param = cmd.Parameters.Add("@Fname",SqlDbType.VarChar,8);
param.Direction = ParameterDirection.Output;
param = cmd.Parameters.Add("@Fphone",SqlDbType.VarChar,8);
param.Direction = ParameterDirection.Output;
conn.Open();
cmd.ExecuteNonQuery();
string Fname = cmd.Parameters["@Fname"].Value.ToString();
string Fphone = cmd.Parameters["@Fphone"].Value.ToString();
Console.WriteLine(Fname + " " + Fphone);
conn.Close();
showSplit();
}

//**************************************
//*演示读取多个无关记录集
//**************************************
public void multiResult()
{
SqlCommand cmd;
cmd = conn.CreateCommand();
string sqla = "select Fname from friend";
string sqlb = "select Fphone from friend";
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();
showSplit();
}

//**************************************
//*使用DataReader获得数据库模式信息
//**************************************
public void getSchema()
{
SqlCommand cmd;
cmd = conn.CreateCommand();
string sql = "select Fid,Fname,Fphone from friend";
cmd.CommandText = sql;
conn.Open();
SqlDataReader reader = cmd.ExecuteReader();
DataTable SchemaTable = reader.GetSchemaTable();

DataRowCollection SchemaColumns = SchemaTable.Rows;
DataColumnCollection SchemaProps = SchemaTable.Columns;
foreach(DataRow SchemaColumn in SchemaColumns)
{
foreach(DataColumn SchemaColumnProp in SchemaProps)
{
Console.WriteLine(SchemaColumnProp.ColumnName + "=" + SchemaColumn[SchemaColumnProp.ColumnName].ToString());
}
}
reader.Close();
conn.Close();
showSplit();
}

//**************************************
//*从数据库读取二进制数据的代码段
//*该代码段只是读取二进制的片断,不是
//*整个程序,所以不能执行,你可以把它
//*集成到你的WinForm项目里面。
//**************************************
public void getBinary()
{
/*
System.IO.MemoryStream stream = new System.IO.MemoryStream();
System.IO.BinaryWriter writer = new System.IO.BinaryWriter(stream);
int BufferSize = 1024;
byte[] Buffer = new Byte[BufferSize];
long Offset = 0;
long BytesRead = 0;
do
{
BytesRead = reader.GetBytes(2,Offset,Buffer,0,BufferSize);
writer.Writer(Buffer,0,(int)BytesRead);
writer.Flush();
Offset += BytesRead;
}
while(BytesRead == BufferSize);
*/
}

//添加输出分隔
private void showSplit()
{
Console.WriteLine("\\n********************************************************************\\n");
}

public static void Main(string [] args)
{
SqlReader sqlreader = new SqlReader();

sqlreader.basicReader();

sqlreader.hasParamReader();

sqlreader.hasOledbParamReader();

sqlreader.outParamShow();

sqlreader.multiResult();

sqlreader.getSchema();
}
}

DataReader用法的更多相关文章

  1. DataReader的用法程序简析

    // 2015/07/05 using System; using System.Collections.Generic; using System.Linq; using System.Text; ...

  2. 关于数据库中datareader的用法

    1.C#中提供的DataReader可以从数据库中每次提取一条数据. using System; using System.Collections.Generic; using System.Comp ...

  3. datareader几种用法总结

    1.本人常用: if (reader["字段名"] != DBNull.Value) { userRegisterInfo.OrgCode = reader["字段名&q ...

  4. DataReader

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

  5. DataSet用法详细 转

    DataSet用法详细 转 DataSet用法详细 一.特点介绍 1.处理脱机数据,在多层应用程序中很有用. 2.可以在任何时候查看DataSet中任意行的内容,允许修改查询结果的方法. 3.处理分级 ...

  6. GridView的详细用法

    l GridView无代码分页排序 l GridView选中,编辑,取消,删除 l GridView正反双向排序 l GridView和下拉菜单DropDownList结合 l GridView和Ch ...

  7. There is already an open DataReader associated with this Command which must be closed first." exception in Entity Framework

    Fixing the "There is already an open DataReader associated with this Command which must be clos ...

  8. C#与数据库访问技术总结(十一)之数据阅读器(DataReader)1

    数据阅读器 当执行返回结果集的命令时,需要一个方法从结果集中提取数据. 处理结果集的方法有两个: 第一,使用数据阅读器(DataReader): 第二,同时使用数据适配器(Data Adapter)和 ...

  9. DataSet用法详细

    转自:http://www.cnblogs.com/zeroone/archive/2012/06/08/2541299.html DataSet用法详细 一.特点介绍 1.处理脱机数据,在多层应用程 ...

随机推荐

  1. iOS 学习资源

    这份学习资料是为 iOS 初学者所准备的, 旨在帮助 iOS 初学者们快速找到适合自己的学习资料, 节省他们搜索资料的时间, 使他们更好的规划好自己的 iOS 学习路线, 更快的入门, 更准确的定位的 ...

  2. 开启Apache mod_rewrite模块完全解答

    启用mod_rewrite模块 在conf目录的httpd.conf文件中找到 LoadModule rewrite_module modules/mod_rewrite.so 将这一行前面的#去掉. ...

  3. 使用eclipse查看源码的方法

    打开eclipse,建立项目:Test,将struts2相关jar包导入到其中.在Package Explorer标签栏下操作. 如下图: 在此,以查阅struts2中,struts2-core-2. ...

  4. 多年前写的文本框扩展控件(有ValueChanging事件等),已放github

    本文版权归mephisto和博客园共有,欢迎转载,但须保留此段声明,并给出原文链接,谢谢合作. 文章是哥(mephisto)写的,SourceLink 阅读目录 介绍 起因 代码 使用 GitHub ...

  5. 今天说一下DML触发器的顺序

    因为05之后的版本允许了一个对象有多个after触发器,所以呢~顺序方面还是要留意一下下的.比如我现在要往一个测试表里面添加多个触发器. USE Test GO ,),Name )) GO CREAT ...

  6. 使用 xtrabackup 进行MySQL数据库物理备份

    0. xtrabackup的功能 能实现的功能: 非阻塞备份innodb等事务引擎数据库. 备份myisam表会阻塞(需要锁). 支持全备.增量备份.压缩备份. 快速增量备份(xtradb,原理类似于 ...

  7. python简单爬虫定时推送同花顺直播及荐股至邮箱

    1.初衷:实践 2.技术:python requests Template 3.思路:根据直播页面获取评价最高的前十博主,定时爬行最新的消息和实战股票 4.思路:python 编辑简单邮件html模板 ...

  8. C语言中链表怎么删除结点?

    第一个方法: /*根据姓名删除链表的中的学生记录*/ void deleteByName(struct STUDENT * head) { struct STUDENT *p,*q; ]; if(he ...

  9. java 重载、重写、构造函数详解

    方法重写 1.重写只能出现在继承关系之中.当一个类继承它的父类方法时,都有机会重写该父类的方法.一个特例是父类的方法被标识为final.重写的主要优点是能够定义某个子类型特有的行为. class An ...

  10. Puppet3在CentOS6.5集群下的安装

    环境:3台主机, IP分别为10.211.55.11.12.13 puppet master安装在10.211.55.11 puppet agent安装在10.211.55.11.12.13 1.安装 ...