一、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. Android 隐式意图激活另外一个Actitity

    上篇文章<Android 显示意图激活另外一个Actitity>最后谈到显示意图激活另外一个Actitity会有一些局限性和弊端 本文介绍另一种方法:隐式意图激活另外一个Actitity ...

  2. mysql GROUP BY 与 ORDER BY 查询不是最新记录

    转载:http://blog.csdn.net/qvbfndcwy/article/details/7200910 鉴于项目的需要,就从网上找到该文章,文章分析得很详细也很易懂,在android里,( ...

  3. 转载文章----IL反编译利器——Ildasm.exe和Reflector.exe:

    转载地址:http://www.cnblogs.com/yangmingming/archive/2010/02/03/1662546.html 一:Ildasm.exe简介  这一微软VS自带工具, ...

  4. Computer Network and Internet(1)

    计算机网路相关的教材很少,TCP/IP,HTTP 协议非常多,很难找到一个合适的材料去学习. <计算机网络>自上而下方法是这个方面的经典之作. 1.what is internet? 1. ...

  5. 项目管理之道--纪我的新书《PMP项目管理认证学习指南(第4版)》出版并预祝大卖!

    新年伊始,我最新的项目管理书籍——<PMP项目管理认证学习指南(第4版)>也出版了,真是新年新气象啊!翻译英文书籍是一件任重道远的工作,除了要具备扎实的基本功,熟悉相关的领域外,还需要细致 ...

  6. EMC Documentum DQL整理(四)

    1.List files and folder in specified folder pathSELECT DISTINCT s.object_name, fr.r_folder_path FROM ...

  7. JAVA中获取路径

    内容来自于snannan_268 关键字: java中获取路径 JAVA中获取路径: 1.jsp中取得路径:   以工程名为TEST为例: (1)得到包含工程名的当前页面全路径:request.get ...

  8. Access 2003 中自定义菜单栏

    在Access中如何用自定义的菜单代替Access自带的菜单,现在做一个简单的介绍: 1.打开您做的Access数据库: 2.单击工具栏,选择“自定义…”: 3.在“自定义”窗口,单击“工具栏”选项卡 ...

  9. CPU卡与M1卡的区别

    简单来讲CPU卡比M1卡更加安全.扩展性更好.支持更多应用   CPU卡 M1 操作系统 带有COS系统 无COS系统 硬件加密模块 硬件DES运算模块 无实现算法的硬件加密模块 算法支持 标准DES ...

  10. storm实战:基于storm,kafka,mysql的实时统计系统

    公司对客户开放多个系统,运营人员想要了解客户使用各个系统的情况,在此之前,数据平台团队已经建设好了统一的Kafka消息通道. 为了保证架构能够满足业务可能的扩张后的性能要求,选用storm来处理各个应 ...