C#与数据库访问技术总结(十一)之数据阅读器(DataReader)1
数据阅读器
当执行返回结果集的命令时,需要一个方法从结果集中提取数据。
处理结果集的方法有两个:
第一,使用数据阅读器(DataReader):
第二,同时使用数据适配器(Data Adapter)和ADO.NET数据集(DataSet)。
本节将学习数据阅读器的有关知识。
DataReader类
在ADO.NET中由每个数据提供程序实现自己的DataReader。
数据读取器(DataReader)是从一个数据源中选择某些数据的最简单的方法,但也是功能较弱的一个方法。
DataReader类没有构造函数,所以不能直接实例化它,需要从Command对象中返回一个DataReader实例,具体做法是通过调用它们的ExecuteReader方法。
1. 创建DataReader对象
在ADO.NET中从来不会显式地使用DataReader对象的构造函数创建DataReader对象。
事实上,DataReader类没有提供公有的构造函数。
人们通常调用Command类的ExecuteReader方法,这个方法将返回一个DataReader对象。
下面的代码阐明了如何创建SqlDataReader对象:
下面代码的功能是从表student中读取数据,并将数据列学号和姓名的所有数据输出到控制台:
String cnstr="server=(local); database=Student; Integrated Security=true";
SqlConnection cn=new SqlConnection(cnstr);
cn.Open();
string sqlstr=" select * from student";
SqlCommand cmd=new SqlCommand(sqlstr, cn);
SqlDataReader dr=cmd.ExecuteReader( );
while(dr.Read())
{
String id=dr["学号"].ToString();
String name=dr["姓名"].ToString();
Console.WriteLine("学号:{0} 姓名:{1}", id, name);
}
dr.Close();
cn.Close();
DataReader类最常见的用法就是检索SQL查询或存储过程返回记录。
另外DataReader 是一个连接的、只向前的和只读的结果集。
也就是说,当使用数据阅读器时,必须保持连接处于打开状态。
除此之外,可以从头到尾遍历记录集,而且也只能以这样的次序遍历,即只能沿着一个方向向前的方式遍历所有的记录,并且在此过程中数据库连接要一直保持打开状态,否则将不能通过DataReader读取数据。
这就意味着,不能在某条记录处停下来向回移动。
记录是只读的,因此数据阅读器类不提供任何修改数据库记录的方法。
注意:
数据阅读器使用底层的连接,连接是它专有的。
当数据阅读器打开时,不能使用对应的连接对象执行其他任何任务,例如执行另外的命令等。
当阅读完数据阅读器的记录或不再需要数据阅读器时,应该立刻关闭数据阅读器。
在完成数据读取后,需要调用Close()方法关闭DataReader对象。
如果创建DataReader对象时,使用的是ExecuteReader方法的另一个重载,代码如下:
SqlDataReader myDataReader=cmd.ExecuteReader(CommandBehavior.CloseConnection);
则关闭DataReader对象时会自动关闭底层连接,不再需要显示调用Connection对象的Close()方法关闭它。
Command对象的Execute方法有一个重载版本,那个重载版本接受命令行为参数。
虽然命令文本指定返回结果集的查询,但是通过执行命令行为,可以提供一些关于想要怎么样使用结果的指令。
ADO.NET在System.Dara命名空间中定义了CommandBehavior枚举,其值和具体意义如表所示。
|
成员名称 |
说明 |
|
CloseConnection |
在执行该命令时,如果关闭关联的DataReader对象,则关联的Connection对象也将关闭 |
|
Default |
此查询可能返回多个结果集。 执行查询可能会影响数据库状态。 Default不设置CommandBehavior标志,因此调用ExecuteReader(CommandBehavior.Default)在功能上等效于调用ExecuteReader() |
|
KeyInfo |
此查询返回列和主键信息。 执行此查询时不锁定选定的行。 注意:当使用KeyInfo时,用于SQL Server的.NET Framework数据提供程序将FOR BROWSE子句追加到正在执行的语句。 用户应该注意潜在的副作用,例如对SET FMTONLY ON语句的使用产生的干扰 |
|
SchemaOnly |
此查询只返回列信息,而不影响数据库状态 |
|
SequentialAccess |
提供一种方法,以便DataReader处理包含带有二进制值的列的行。 SequentialAccess不是加载整行,而是使DataReader将数据作为流来加载。 然后可以使用GetBytes或GetChars方法来指定开始读取操作的字节位置以及正在返回的数据的有限的缓冲区大小。 当指定SequentialAccess时,尽管无需读取每个列,但是需要按照列的返回顺序读取它们。 一旦已经读过返回的数据流中某个位置的内容,就不能再从DataReader中读取该位置或该位置之前的数据。 当使用OleDbDataReader时,可重新读取当前列的值,直到读过它。当使用SqlDataReader时,一次只能读取一个列值 |
|
SingleResult |
查询返回一个结果集 |
|
SingleRow |
查询应返回一行。 执行查询可能会影响数据库状态。 一些.NET Framework数据 提供程序可能(但不要求)使用此信息来优化命令的性能。 在用OleDbCommand对象的ExecuteReader方法指定SingleRow时,用于OLEDB的.NET Framework数据提供程序使用OLE DB IRow接口(如果可用)执行绑定。否则,它使用,IRowset接口。 如果您的SQL语句应该只返回一行,则指定SingleRow还可以提高应用程序性能。 在执行返回多个结果集的查询时,可以指定SingleRow。在这种情况下,仍返回多个结果集,但每个结果集只有一行。 |
C#与数据库访问技术总结(十一)之数据阅读器(DataReader)1的更多相关文章
- C#-数据库访问技术 ado.net——创建 数据库连接类 与 数据库操作方法 以及简单的数据的添加、删除、修改、查看
数据库访问技术 ado.net 将数据库中的数据,提取到内存中,展示给用户看还可以将内存中的数据写入数据库中去 并不是唯一的数据库访问技术,但是它是最底层的数据库访问技术 1.创建数据库,并设置主外键 ...
- C#与数据库访问技术总结(十八)
ADO.NET 代码综合示例 前面已经介绍过OLE DB.NET和SQL Server.NET数据提供者可以用来连接不同的数据源. 以下代码不仅综合演示了使用ADO.NET的这两种数据提供者访问数据库 ...
- C#与数据库访问技术总结(五)之Command对象的常用方法
Command对象的常用方法 说明:上篇总结了Command对象的几个数据成员,这节总结Command对象的常用方法. 同样,在不同的数据提供者的内部,Command对象的名称是不同的,在SQL Se ...
- C#与数据库访问技术总结(十二)数据阅读器(DataReader)2
遍历数据阅读器中的记录 当ExecuteReader方法返回DataReader对象时,当前光标的位置在第一条记录的前面. 必须调用阅读器的Read方法把光标移动到第一条记录,然后,第一条记录将变成当 ...
- c# 窗体开发4 数据库访问技术
ADO.NET的名称起源于ADO(ACTIVEX DATA OBJECTS) USING SYSTEM; USING SYSTEM.COLLECTIONS.GENERIC; USING SYSTEM. ...
- 数据库访问技术 odbc dao rdo uda jet oledb
一.UDA(UniversalDataAccess) 这是微软提供的通用数据访问策略.包括ADO.OLEDB和ODBC.它不光提供了数据库的访 问能力,对于其它的数据存储技术也同样支持,如目录服务.E ...
- C#与数据库访问技术总结(十三)之DataReader对象
DataReader对象与数据获取 DataReader对象以“基于连接”的方式来访问数据库. 也就是说,在访问数据库.执行SQL操作时,DataReader要求一直连在数据库上. 这将会给数据库的连 ...
- C#与数据库访问技术总结(七)综合示例
综合示例 说明:前面介绍了那么多,光说不练假把式,还是做个实例吧. 表:首先你要准备一张表,这个自己准备吧.我们以学生表为例. 1.ExecuteScalar方法 ExecuteScalar方法执行返 ...
- C#与数据库访问技术总结(十七)
使用DataSet对象访问数据库 当对DataSet对象进行操作时,DataSet对象会产生副本,所以对DataSet里的数据进行编辑操作不会直接对数据库产生影响,而是将DataRow的状态设置为ad ...
随机推荐
- VS2008中调试dll
1.运行dll实例时,会直接弹出一个小框: 选择可拉起这个dll的exe运行就可以调试了 2.以后每次都会直接运行了,要重新选择程序,弹出上面的框,需要在project-->debugging- ...
- linux获取系统启动时间
1.前言 时间对操作系统来说非常重要,从内核级到应用层,时间的表达方式及精度各部相同.linux内核里面用一个名为jiffes的常量来计算时间戳.应用层有time.getdaytime等函数.今天需要 ...
- redis与memcached比较
引用自:http://blog.csdn.net/e_wsq/article/details/23551799 最近需要用no-sql数据库来保存大量的数据,插入和查询都比较频繁,相对而言查询更加频繁 ...
- Selenium2+python自动化3-解决pip使用异常
一.pip出现异常 有一小部分童鞋在打开cmd输入pip后出现下面情况:Did not provide a commandDid not provide a command?这是什么鬼?正常情况应该是 ...
- Selenium2+python自动化13-多窗口、句柄(handle)
前言 有些页面的链接打开后,会重新打开一个窗口,对于这种情况,想在新页面上操作,就得先切换窗口了.获取窗口的唯一标识用句柄表示,所以只需要切换句柄,我们就能在多个页面上灵活自如的操作了. 本篇以打开百 ...
- UISearchBar
UISearchBar——方便用户搜索信息 在移动应用程序的世界里,用户对信息获取的速度要求非常高!iOS用户希望他们需要的信息能够迅速地,直观地展现在他们面前 因为UITableView的上下滚动能 ...
- C++11 删除链表重复数值
#include <memory> #include <iostream> #include <chrono> #include <thread> us ...
- VB6.0 获取Excel文件工作表Sheet的名称
获取Excel文件工作表Sheet的名称 '产生Excel文档 Dim xlapp, xlbook As Object Dim sSheetName As String Set xlapp = Cre ...
- java常用类
String 字符串类 System 可得到系统信息 Runtime类 StringBuilder(StringBuffer)类 Thread 线程类 Math 与数学有关的工具类 Date 日期类( ...
- html5新特性之音频、视频
1.视频 标签video video标签的属性 属性 描述 autoplay 视频就绪后自动播放 preload 视频在页面加载时加载 loop 视频播放完成后循环播放 controls 显示控件 s ...