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();
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使用的更多相关文章
- 报错:已有打开的与此命令相关联的 DataReader,必须首先将它关闭。
SqlParameter[] sp = { new SqlParameter("@nGridID",SqlDbType.BigInt), new SqlParameter(&quo ...
- DataReader
Datareader对象不能关使用new关键字创建.但可以使用ExecuteReader()方法创建. DataReader是一行一行的读取记录的.当记录中有数据时Read()返回TRUE,当到记录集 ...
- code first提示已有打开的与此 Command 相关联的 DataReader,必须首先将它关闭解决方法
使用codefirst查询当然是必不可少的,但有时不小心可能很简单的查询也会导致异常. 下面用codefirst做个示例简单演示下异常发生的场景: var attendlist = db.Databa ...
- 将DataReader转换为DataTable
public static DataTable ConvertDataReaderToDataTable(SqlDataReader dataReader) { ///定义DataTable Data ...
- C# 之 DataReader 和 DataSet 的区别
本文转载自:http://www.cnblogs.com/xinaixia/p/4920630.html 1. 获取数据的方式[1]DataReader 为在线操作数据, DataReader会一直占 ...
- C#中对象,字符串,dataTable、DataReader、DataSet,对象集合转换成Json字符串方法。
C#中对象,字符串,dataTable.DataReader.DataSet,对象集合转换成Json字符串方法. public class ConvertJson { #region 私有方法 /// ...
- 【2016-11-2】【坚持学习】【Day17】【通过反射自动将datareader转为实体info】
通过ADO.net 查询到数据库的数据后,通过DataReader转为对象Info public class BaseInfo { /// <summary> /// 填充实体 /// & ...
- 原创 Datareader 导出为csv文件方法
DataReader 是游标只读数据, 如果是大数据导出,用Datatable 将耗费巨大内存资源.因为Datatable 其实就是内存中的一个数据表 代码如下 /// <summary> ...
- DataReader用法
一.DataReader含义 DataReader相比于DataSet,DataReader是一个抽象类,所以不能用DataReader DR = new DataReader(),来构造函数创建对象 ...
- DataReader和DataSet的异同
DataReader:使用时始终占用SqlConnection,在线操作数据库:每次只在内存中加载一条数据,所以占用的内存是很小的:是只进的. 只读的. DataSet:则是将数据一次性加载在内存中. ...
随机推荐
- sipp保持sip协议的tcp长连接
sipp这个工具非常有用,但是由于应用手册不完善,加上资料非常少,所以要用熟练是非常不容易的.
- SpringData_JpaRepository接口
该接口提供了JPA的相关功能 List<T> findAll(); //查找所有实体 List<T> findAll(Sort sort); //排序.查找所有实体 List& ...
- html5语法改变
<!doctype html> 简化了 <meta http-equiv="Content-type" content="text/html;chars ...
- Educational Codeforces Round 59 Solution
A. Digits Sequence Dividing 签. #include <bits/stdc++.h> using namespace std; #define N 1010 ch ...
- KVM入门
KVM KVM(Kernel-based Virtual Machine)是众多虚拟化技术之一,它是Linux内核中的一个模块,该模块依赖于CPU,如果CPU支持虚拟化,那么该模块才可以被加载.KVM ...
- ubuntu 中启动SDK manager
Android SDK安装后,目录结构如下: root@localhost:/home/ranxf/Android/Sdk/android-sdk-linux# ll 总用量 drwxrwxr-x r ...
- Linux /python --- zipinfo命令
Linux zipinfo命令用于列出压缩文件信息. 执行zipinfo指令可得知zip压缩文件的详细信息. zipinfo [-12hlmMstTvz][压缩文件][文件...][-x <范本 ...
- 一次频繁Full GC问题排查过程分享
问题描述 应用收到频繁Full GC告警 问题排查 登录到对应机器上去,查看GC日志,发现YGC一分钟已经达到了15次,比Full GC还要频繁一些,其中Full GC平均10分钟超过了4次,如下图 ...
- bzoj1619 / P2919 [USACO08NOV]守护农场Guarding the Farm
P2919 [USACO08NOV]守护农场Guarding the Farm 相似题:P3456 [POI2007]GRZ-Ridges and Valleys 按海拔是否相同分块 每次bfs海拔相 ...
- [javaScript]身份证号信息解析
之前一直在思考是不是该把工作中一些问题写出来(可能是简单的问题),现在的想法是应该写出来这些简单的问题.虽然工作中可能并没有很多特别难的问题让你去解决,因为公司的招人就是根据你的能力来匹配的嘛. 简单 ...