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相关知识点的更多相关文章

  1. UITableView相关知识点

    //*****UITableView相关知识点*****// 1 #import "ViewController.h" // step1 要实现UITableViewDataSou ...

  2. Android开发涉及有点概念&相关知识点(待写)

    前言,承接之前的 IOS开发涉及有点概念&相关知识点,这次归纳的是Android开发相关,好废话不说了.. 先声明下,Android开发涉及概念比IOS杂很多,可能有很多都题不到的.. 首先由 ...

  3. IOS开发涉及有点概念&相关知识点

    前言,IOS是基于UNIX的,用C/C+/OC直通系统底层,不想android有个jvm. 首先还是系统架构的分层架构 1.核心操作系统层 Core OS,就是内存管理.文件系统.电源管理等 2.核心 ...

  4. IOS之UI--小实例项目--添加商品和商品名(使用xib文件终结版) + xib相关知识点总结

    添加商品和商品名小项目(使用xib文件终结版) 小贴士:博文末尾有项目源码在百度云备份的下载链接. xib相关知识点总结 01-基本使用 一开始使用xib的时候,如果要使用自定义view的代码,就需要 ...

  5. 学习记录013-NFS相关知识点

    一.NFS相关知识点 1.NFS常用的路径/etc/exports NFS服务主配置文件,配置NFS具体共享服务的地点/usr/sbin/exportfs NFS服务的管理命令,exportfs -a ...

  6. TCP/IP 相关知识点与面试题集

    第一部分:TCP/IP相关知识点 对TCP/IP的整体认 链路层知识点 IP层知识点 运输层知识点 应用层知识点 (这些知识点都可以参考:http://www.cnblogs.com/newwy/p/ ...

  7. Python开发一个csv比较功能相关知识点汇总及demo

    Python 2.7 csv.reader(csvfile, dialect='excel', **fmtparams)的一个坑:csvfile被csv.reader生成的iterator,在遍历每二 ...

  8. Caffe学习系列(二)Caffe代码结构梳理,及相关知识点归纳

    前言: 通过检索论文.书籍.博客,继续学习Caffe,千里之行始于足下,继续努力.将自己学到的一些东西记录下来,方便日后的整理. 正文: 1.代码结构梳理 在终端下运行如下命令,可以查看caffe代码 ...

  9. php正则相关知识点

    关于正则,其实简单就是搜索和匹配.php,java,python等都是支持正则的,php正则兼容perl.好多同学觉得正则比较难,比较抽象,其实正则是非常简单的,主要是一个熟悉和反复练习的结果,还有一 ...

随机推荐

  1. mongodb报错一例

    开发程序报错信息: Caused by: com.mongodb.MongoException: Executor error: OperationFailed: Sort operation use ...

  2. gitignore相关

    用git也有一段时间了,前些天在公司fork一个新的项目着手做,结果这个项目的creator早先把eclipse的配置文件也提交了上去,后续其他参与者提交代码时,这几个文件总是要注意不选中. 虽然不影 ...

  3. nginx日志按天自动切割

    1.编写shell脚本,创建nginx_log.sh文件#!/bin/bashsource /etc/profile#设置Nginx日志文件存放目录log_path="/usr/local/ ...

  4. C语言提高 (3) 第三天 二级指针的三种模型 栈上指针数组、栈上二维数组、堆上开辟空间

    1 作业讲解 指针间接操作的三个必要条件 两个变量 其中一个是指针 建立关联:用一个指针指向另一个地址 * 简述sizeof和strlen的区别 strlen求字符串长度,字符数组到’\0’就结束 s ...

  5. Python 纸牌游戏

    纸牌游戏 # card.py from random import shuffle class Card: # 黑桃,红桃,方块,梅花 suits = ['spades', 'hearts', 'di ...

  6. 【 AIM Tech Round 5 (rated, Div. 1 + Div. 2) C】Rectangles

    [链接] 我是链接,点我呀:) [题意] 给你n个矩形. 让你找出一个点(x,y) 使得这个点在其中至少(n-1)个矩形中. [题解] 若干个矩形交在一起的话. 它们所有的公共区域也会是一个矩形. 这 ...

  7. properties 乱码问题

    File --> Others Settings --> Default Settings

  8. 在使用SSH+JPA开发中,ajax使用ObjectMapper类从后台向前台传值

    使用ObjectMapper对象的writeValue方法 ObjectMapper objectMapper = new ObjectMapper(); objectMapper.writeValu ...

  9. C和C++ const的声明差异

    当在C源代码文件中将变量声明为const时,可以通过以下方式实现: const int i = 2; 然后,可以在另一个模块中使用此变量,如下表示: extern const int i; 但若要获取 ...

  10. BA--近零能耗示范楼(西门子-中国建筑科学研究院院内)

    中国建筑科学研究院院内的一栋办公楼使用了西门子的全套楼控.节能.消防.远景开关面板技术,每年的能耗为25kwh,远低于国家绿色能源标准.