DataReader相关知识点
C#中提供的DataReader可以从数据库中每次提取一条数据。
1. 获取数据的方式
[1]DataReader 为在线操作数据, DataReader会一直占用SqlConnection连接,在其获得数据过程中其它操作不可以再使用SqlConnection连接对象。
[2]DataSet为离线操作数据,DataSet会将数据一次性读入内存,然后断开连接,这时其它操作就可以使用SqlConnection连接对象。
由于DataReader一次只读取一行数据,所以占用内存较小。但DataReader为只进且只读的,也就是只能单方向向前读取,如果你想回头去读取上一条数据是不允许的,并且不允许其修改数据。
由于DataSet一次性读取所有数据,所以比较消耗资源,
2.获取数据的机制
DataReader是通过SqlCommand.ExecuteReader来读取数据。
DataSet则是通过SqlDataAdapter.Fill来填充数据。
所以DataReader在获取数据时不能关闭连接。而DataSet则可以,因为DbDataAdapter已经将数据读取到应用程序服务器中,所以在使用DataReader时一定要注意,及时关闭连接。
3.其它区别
DataReader读取速度快于DataSet。
DataReader是数据提供者类,DataSet是一般性类,借助于SqlDataAdapter来填充数据。
因为DataSet是离线操作数据,所以在事务中使用锁时要注意,因为DataSet填充数据后会断开连接,也就会释放锁。
//未式关闭连接
public SysFunction GetModelById(string id)
{
SqlConnection conn = new SqlConnection(ConfigurationManager.ConnectionStrings["sqlConStr"].ToString());
conn.Open();
SqlCommand cmd = new SqlCommand("SELECT * FROM SysFunction WHERE FunctionId =" + id, conn);
SqlDataReader dataReader = cmd.ExecuteReader();
SysFunction model = new SysFunction();
while(dataReader.Read())
{
model.FunctionName = dataReader["FunctionName"].ToString();
model.FunctionCode = dataReader["FunctionCode"].ToString();
}
dataReader.Close();
dataReader.Dispose();
string drState = dataReader.IsClosed.ToString(); //True
string connState = conn.State.ToString(); //Open
return model;
}
//调用Command 对象的 ExecuteReader() 方法时传递 CommandBehavior.CloseConnection 参数
public SysFunction GetModelById(string id)
{
SqlConnection conn = new SqlConnection(ConfigurationManager.ConnectionStrings["sqlConStr"].ToString());
conn.Open();
SqlCommand cmd = new SqlCommand("SELECT * FROM SysFunction WHERE FunctionId =" + id, conn);
//执行该cmd时,如果关闭关联的 DataReader 对象,则关联的 Connection 对象也将关闭
SqlDataReader dataReader = cmd.ExecuteReader(CommandBehavior.CloseConnection);
SysFunction model = new SysFunction();
while(dataReader.Read())
{
model.FunctionName = dataReader["FunctionName"].ToString();
model.FunctionCode = dataReader["FunctionCode"].ToString();
}
dataReader.Close();
dataReader.Dispose();
string drState = dataReader.IsClosed.ToString(); //True
string connState = conn.State.ToString(); //Close
return model;
}
DataReader对象概述
DataReader对象提供了顺序的,只读的方式读取Command对象获得的数据结果集。正是因为DataReader是以顺序的方式连续地读取数据,所以DataReader会以独占的方式打开数据库连接。
由于DataReader只执行读操作,并且每次只在内存缓冲区里存储结果集的一条数据,所以使用Datareader对象的效率比较高,如果要查询大量数据,同事不需要随机访问和修改数据,DataReader是优先的选择。
判断查询结果中是否有数据
想要判断查询结果中是否有数据只需要判断DataReader对象的HasRows属性即可。
namespace ConsoleApplication1
{
class Program
{
static void Main(string[] args)
{
string conStr = "server=.;user=sa;pwd=123456;database=CustomerManagement"; //连接字符串
SqlConnection conText = new SqlConnection(conStr); //创建Connection对象
try
{
conText.Open(); //打开数据库
string sql = "select * from manager"; //创建统计语句
SqlCommand comText = new SqlCommand(sql, conText); //创建Command对象
SqlDataReader dr; //创建DataReader对象
dr = comText.ExecuteReader(); //执行查询
if(dr.HasRows) //判断数据表中是否含有数据
{
Console.WriteLine("manager数据表中含有数据");
}
else
{
Console.WriteLine("manager数据表中没有数据");
}
}
catch(Exception ex) //创建检查Exception对象
{
Console.WriteLine(ex.Message.ToString()); //输出错误信息
}
finally
{
conText.Close(); //关闭连接
}
Console.ReadLine();
}
}
}
读取数据
要想读取DataReader对象中的数据,就要用到DataReader对象的Read方法,由于DataReader对象每次只在内存缓冲区里存储结果集中的一条数据,所以要读取DataReader对象中的多条数据,就要用到迭代语句
namespace ConsoleApplication1
{
class Program
{
static void Main(string[] args)
{
string conStr = "server=.;user=sa;pwd=123456;database=CustomerManagement"; //连接字符串
SqlConnection conText = new SqlConnection(conStr); //创建Connection对象
try
{
conText.Open(); //打开数据库
string sql = "select * from manager"; //创建统计语句
SqlCommand comText = new SqlCommand(sql, conText); //创建Command对象
SqlDataReader dr; //创建DataReader对象
dr = comText.ExecuteReader(); //执行查询
while(dr.Read()) //判断数据表中是否含有数据
{
Console.Write(dr[].ToString() + ","); //输出用户标识
Console.Write(dr["userName"].ToString() + ","); //输出用户名
Console.WriteLine(dr[].ToString()); //输出用户密码
}
dr.Close(); //关闭DataReader对象
}
catch(Exception ex) //创建检查Exception对象
{
Console.WriteLine(ex.Message.ToString()); //输出错误信息
}
finally
{
conText.Close(); //关闭连接
}
Console.ReadLine();
}
}
}
DataReader相关知识点的更多相关文章
- UITableView相关知识点
//*****UITableView相关知识点*****// 1 #import "ViewController.h" // step1 要实现UITableViewDataSou ...
- Android开发涉及有点概念&相关知识点(待写)
前言,承接之前的 IOS开发涉及有点概念&相关知识点,这次归纳的是Android开发相关,好废话不说了.. 先声明下,Android开发涉及概念比IOS杂很多,可能有很多都题不到的.. 首先由 ...
- IOS开发涉及有点概念&相关知识点
前言,IOS是基于UNIX的,用C/C+/OC直通系统底层,不想android有个jvm. 首先还是系统架构的分层架构 1.核心操作系统层 Core OS,就是内存管理.文件系统.电源管理等 2.核心 ...
- IOS之UI--小实例项目--添加商品和商品名(使用xib文件终结版) + xib相关知识点总结
添加商品和商品名小项目(使用xib文件终结版) 小贴士:博文末尾有项目源码在百度云备份的下载链接. xib相关知识点总结 01-基本使用 一开始使用xib的时候,如果要使用自定义view的代码,就需要 ...
- 学习记录013-NFS相关知识点
一.NFS相关知识点 1.NFS常用的路径/etc/exports NFS服务主配置文件,配置NFS具体共享服务的地点/usr/sbin/exportfs NFS服务的管理命令,exportfs -a ...
- TCP/IP 相关知识点与面试题集
第一部分:TCP/IP相关知识点 对TCP/IP的整体认 链路层知识点 IP层知识点 运输层知识点 应用层知识点 (这些知识点都可以参考:http://www.cnblogs.com/newwy/p/ ...
- Python开发一个csv比较功能相关知识点汇总及demo
Python 2.7 csv.reader(csvfile, dialect='excel', **fmtparams)的一个坑:csvfile被csv.reader生成的iterator,在遍历每二 ...
- Caffe学习系列(二)Caffe代码结构梳理,及相关知识点归纳
前言: 通过检索论文.书籍.博客,继续学习Caffe,千里之行始于足下,继续努力.将自己学到的一些东西记录下来,方便日后的整理. 正文: 1.代码结构梳理 在终端下运行如下命令,可以查看caffe代码 ...
- php正则相关知识点
关于正则,其实简单就是搜索和匹配.php,java,python等都是支持正则的,php正则兼容perl.好多同学觉得正则比较难,比较抽象,其实正则是非常简单的,主要是一个熟悉和反复练习的结果,还有一 ...
随机推荐
- Xcode8 NSLog打印json不完整的解决方案
解决方案:自定义宏,通过fprintf函数打印log,完美解决! #ifdef DEBUG #define NSLog(FORMAT, ...) fprintf(stderr, "%s:%z ...
- Sublime Text 3 Build 3047 安装/插件安装/C编程环境配置
Sublime Text 3 Build 3047 安装 参考:http://sublimetext.iaixue.com/forum.php?mod=viewthread&tid=29 插件 ...
- SSH启动失败解决方法
今天连接linux时居然连不上,报错信息是: 查了一下终于找到了解决办法,只需要一些命令 : cd /etc/ssh sudo chmod 644 ./* sudo chmod 600 ssh_hos ...
- nyoj181-小明的难题
小明的难题时间限制:3000 ms | 内存限制:65535 KB难度:2描述课堂上小明学会了用计算机求出N的阶乘,回到家后就对妹妹炫耀起来.为了不让哥哥太自满,妹妹给小明出了个问题"既 ...
- nyoj2-吝啬的国度
吝啬的国度 时间限制:1000 ms | 内存限制:65535 KB 难度:3 描述 在一个吝啬的国度里有N个城市,这N个城市间只有N-1条路把这个N个城市连接起来.现在,Tom在第S号城市,他有 ...
- [2018.8.12]模拟赛B组
T1 打表出奇迹,发现结论为\(E(a_n)=n+1\)即可. #include <iostream> #include <cstdio> #include <cctyp ...
- 教你十分钟构建好 SpringBoot + SSM 框架
目前最主流的 java web 框架应该是 SSM,而 SSM 框架由于更轻便与灵活目前受到了许多人的青睐.而 SpringBoot 的轻量化,简化项目配置, 没有 XML 配置要求等优点现在也得到了 ...
- 数据库-mongodb有哪些命令工具
MongoDB 系统文件说明 1.mongo.exe 命令行客户端工具 2.mongod.exe 数据库服务程序 3. ...
- 洛谷—— P2668 斗地主
https://www.luogu.org/problem/show?pid=2668 题目描述 牛牛最近迷上了一种叫斗地主的扑克游戏.斗地主是一种使用黑桃.红心.梅花.方片的A到K加上大小王的共54 ...
- Hdu 4280 Island Transport(最大流)
Island Transport Time Limit: 20000/10000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Other ...