4-2 ADO.NET-查询和检索数据5

4-2-4   DataReader对象

上一小节详细叙述 DataAdapter 对象的应用,这里需要思考一个问题: DataAdapter 对象 怎样来读取数据库的数据?如果应用程序想直接获得数据源的数据,又该怎样操作呢?
直接获得数据源的数据与 DataAdapter 对象 读取数据库的数据是一样的机制:在客户端应用程序与数据源保持连接状态下使用 DataReader 对象获得数据。请参见图445所示:
4-2 ADO.NET-查询和检索数据5_第1张图片
4-45 DataReader对象工作示意图
从图463中可以看出 DataReader 对象 在数据传输过程中起到一个传送带的作用。它沿着一个方向,源源不断的将数据从数据库传送给客户端应用程序,客户端应用程序每次接到的是一条记录。

1.DataReader对象概述

DataReader 对象提供一种方法,可以读取通过在数据源执行命令获得的结果集,并且是只读的、只向前递进的行数据流。这个对象在读取数据方面的性能最好。
Command 对象可以对数据源的数据直接操作,但是如果执行的是要求返回数据结果集的查询命令或存储过程,需要先获取数据结果集的内容,然后再进行处理或输出,这就需要DataReader对象来配合。 DataReader 对象提供一个只读的、单向的游标,用于访问结果集的行数据。因为内存中每次仅有一个数据行,所以 DataReader 对象需要的开销很小,效率很高。
这里还得提一下 Command 对象对数据源的数据直接操作而不要求返回数据结果集的情况,这时就不需要使用 DataReader 对象,而是使用 ExecuteNonQuery ()方法完成对数据源数据的直接操作。请参见图446所示:
4-46 不使用 DataReader 对象而直接操作数据库数据工作示意图
从图446中可以看出,客户端应用程序要向数据库中插入学生数据信息。将数据值写在 SQL 命令中或者传递给存储过程的参数,然后调用 Command 对象的 ExecuteNonQuery ()方法,学生数据就插入到数据库了。 ExecuteNonQuery ()方法可以返回受影响的行数,如果插入一个学生记录成功了,返回的行数就应该是1,不成功就返回-1。通过返回的受影响行数,可以判断是否成功。这个应用程序就没有使用 DataReader 对象。
DataReader 对象不能直接使用构造函数实例化。必须通过 Command 对象的 ExecuteReader () 方法 来生成。 DataReader 对象最主要的方法是 Read ()方法,用来检索行,然后用下标来访问行中的字段。在 DataReader 对象遍历数据记录时,数据连接必须保持打开状态,知道 DataReader 对象被关闭。其工作原理可以参见图447所示:
4-47 DataReader对象的工作原理图
从图447中可以看出,客户端应用程序需要数据源提供数据时,发送查询命令到数据源。由数据源进行查询处理,返回给客户端一个只读、只进的记录集。对这个记录集的操作就是利用 DataReader 对象只读和只进访问方式进行的。每读一个数据就向下一条记录转移,直至记录集末尾,并且得到的数据是只读的,不能修改。整个获取数据过程需要客户端应用程序与数据源之间保持永久连接。. NET 提供程序及其 DataReader 类,请参见表425所示:
4-25 各个命名空间中的 DataReader对象表
提供程序
DataReader
SQL 数据提供程序
SqlDataReader
OLE DB 数据提供程序
OleDbDataReader
Oracle 数据提供程序
OracleDataReader
ODBC 数据提供程序
OdbcDataReader
在后面的内容中,主要以 SqlDataReader 对象为例。

2.DataReader对象的使用

1 DataReader 对象的的属性和方法
      DataReader 对象常用的方法和属性请参见表426和表427所示:
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.案例学习:实现添加、修改、删除、查询数据库中学生基本信息

本实验目标是要求编写一个应用程序,实现可以添加、修改、删除、查询数据库中学生基本信息的功能。用户界面如图448所示:
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):
数据库的设计参见图449
4-49 数据库设计图
数据库为 school1 ,仅用了两个表, mz 是表示民族的表, student 是表示学生的表。具体字段设计情况请参见图467。数据库环境是 SQL Server 2005
u  实验步骤(4):
鼠标右击项目,在弹出的菜单中选择“添加”、“新建项”,在弹出的“添加新项”窗体中选择“代码文件”,名称改为“ DataBase . cs ”,点击“添加”按钮,完成添加。
需要注意的是, DataBase . cs 文件是数据库操作的主要方法集合,可以认为是数据库访问层所处文件,在后面很多地方都会应用到,今后代码不会再出现对于 DataBase . cs 的具体解释,请读者自行对照阅读。 DataBase . cs 文件主要代码如下:
 
u  实验步骤(5):
用鼠标双击所有 Button 控件,进入.cs文件编辑状态准备进行开发。代码加下:
(未完待续)

本文出自 “熊猫写程序” 博客,转载请与作者联系!

你可能感兴趣的:(职场,查询,休闲,ADO.NET,检索数据)