4-2-4 DataReader对象
上一小节详细叙述
DataAdapter
对象的应用,这里需要思考一个问题:
DataAdapter
对象
怎样来读取数据库的数据?如果应用程序想直接获得数据源的数据,又该怎样操作呢?
直接获得数据源的数据与
DataAdapter
对象
读取数据库的数据是一样的机制:在客户端应用程序与数据源保持连接状态下使用
DataReader
对象获得数据。请参见图4-45所示:
图4-45 DataReader对象工作示意图
从图4-63中可以看出
DataReader
对象
在数据传输过程中起到一个传送带的作用。它沿着一个方向,源源不断的将数据从数据库传送给客户端应用程序,客户端应用程序每次接到的是一条记录。
1.DataReader对象概述
DataReader
对象提供一种方法,可以读取通过在数据源执行命令获得的结果集,并且是只读的、只向前递进的行数据流。这个对象在读取数据方面的性能最好。
Command
对象可以对数据源的数据直接操作,但是如果执行的是要求返回数据结果集的查询命令或存储过程,需要先获取数据结果集的内容,然后再进行处理或输出,这就需要DataReader对象来配合。
DataReader
对象提供一个只读的、单向的游标,用于访问结果集的行数据。因为内存中每次仅有一个数据行,所以
DataReader
对象需要的开销很小,效率很高。
这里还得提一下
Command
对象对数据源的数据直接操作而不要求返回数据结果集的情况,这时就不需要使用
DataReader
对象,而是使用
ExecuteNonQuery
()方法完成对数据源数据的直接操作。请参见图4-46所示:
图
4-46
不使用
DataReader
对象而直接操作数据库数据工作示意图
从图4-46中可以看出,客户端应用程序要向数据库中插入学生数据信息。将数据值写在
SQL
命令中或者传递给存储过程的参数,然后调用
Command
对象的
ExecuteNonQuery
()方法,学生数据就插入到数据库了。
ExecuteNonQuery
()方法可以返回受影响的行数,如果插入一个学生记录成功了,返回的行数就应该是1,不成功就返回-1。通过返回的受影响行数,可以判断是否成功。这个应用程序就没有使用
DataReader
对象。
DataReader
对象不能直接使用构造函数实例化。必须通过
Command
对象的
ExecuteReader
()
方法
来生成。
DataReader
对象最主要的方法是
Read
()方法,用来检索行,然后用下标来访问行中的字段。在
DataReader
对象遍历数据记录时,数据连接必须保持打开状态,知道
DataReader
对象被关闭。其工作原理可以参见图4-47所示:
图4-47 DataReader对象的工作原理图
从图4-47中可以看出,客户端应用程序需要数据源提供数据时,发送查询命令到数据源。由数据源进行查询处理,返回给客户端一个只读、只进的记录集。对这个记录集的操作就是利用
DataReader
对象只读和只进访问方式进行的。每读一个数据就向下一条记录转移,直至记录集末尾,并且得到的数据是只读的,不能修改。整个获取数据过程需要客户端应用程序与数据源之间保持永久连接。.
NET
提供程序及其
DataReader
类,请参见表4-25所示:
表
4-25 各个命名空间中的
DataReader对象表
提供程序
|
DataReader
类
|
SQL
数据提供程序
|
SqlDataReader
|
OLE DB
数据提供程序
|
OleDbDataReader
|
Oracle
数据提供程序
|
OracleDataReader
|
ODBC
数据提供程序
|
OdbcDataReader
|
在后面的内容中,主要以
SqlDataReader
对象为例。
2.DataReader对象的使用
(1)
DataReader
对象的的属性和方法
DataReader
对象常用的方法和属性请参见表4-26和表4-27所示:
表
4-26 DataReader对象常用属性表
表
4-27 DataReader对象常用方法表
方法
|
说明
|
Read
|
前进到下一行记录
|
Close
|
关闭 DataReader 对象
|
请看如下代码:
private
static void ReadOrderData(string connectionString)
{
string queryString = "SELECT OrderID, CustomerID FROM dbo.Orders;";
using (SqlConnection connection = new SqlConnection(connectionString))
{
SqlCommand command = new SqlCommand(queryString, connection);
connection.Open();
SqlDataReader reader = command.ExecuteReader();
//
访问数据前,调用Read()方法
while (reader.Read())
{
Console.WriteLine(String.Format("{0}, {1}",reader[0], reader[1]));
}
//
当读取数据后,调用Close()方法
reader.Close();
}
}
3.案例学习:实现添加、修改、删除、查询数据库中学生基本信息
本实验目标是要求编写一个应用程序,实现可以添加、修改、删除、查询数据库中学生基本信息的功能。用户界面如图4-48所示:
图4-48 学生基本信息应用程序界面图
本案例面临的主要问题是,如何向组合框
comboBox
中添加学号信息。解决的方案是,在窗体初始化
Load
事件中将全部学生的学号信息加载到
comboBox
中,读取学号信息数据的对象就是通过
DataReader
对象读取。
u
实验步骤(1):
在
VS.NET 2005
中新建一个名为
Form10
的基于
Windows
的项目。将默认窗体重命名为
form10
.cs
。
u
实验步骤(2):
从工具箱之中拖拽一个
GroupBox
控件到
Form
窗体,
text
属性
设置为“数据库信息处理”;向这个GroupBox控件拖拽三个
Lable
控件,
text
属性分别设置为“编号:”、“姓名:”、“班级:”;三个
TextBox
控件;一个
ComboBox
控件;另外还要
GroupBox
控件添加四个
Button
控件,
text
属性分别设置为“添加”、“修改”、“删除”、“查询”。
u
实验步骤(3):
数据库的设计参见图4-49:
图4-49 数据库设计图
数据库为
school1
,仅用了两个表,
mz
是表示民族的表,
student
是表示学生的表。具体字段设计情况请参见图4-67。数据库环境是
SQL
Server
2005
。
u
实验步骤(4):
鼠标右击项目,在弹出的菜单中选择“添加”、“新建项”,在弹出的“添加新项”窗体中选择“代码文件”,名称改为“
DataBase
.
cs
”,点击“添加”按钮,完成添加。
需要注意的是,
DataBase
.
cs
文件是数据库操作的主要方法集合,可以认为是数据库访问层所处文件,在后面很多地方都会应用到,今后代码不会再出现对于
DataBase
.
cs
的具体解释,请读者自行对照阅读。
DataBase
.
cs
文件主要代码如下:
u
实验步骤(5):
用鼠标双击所有
Button
控件,进入.cs文件编辑状态准备进行开发。代码加下:
(未完待续)
本文出自 “熊猫写程序” 博客,转载请与作者联系!