上一小节详细叙述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对象常用属性表
属性
|
说明
|
HasRows
|
是否返回了结果
|
表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文件编辑状态准备进行开发。代码加下:
(未完待续)
本文转自 qianshao 51CTO博客,原文链接:http://blog.51cto.com/qianshao/216034,如需转载请自行联系原作者