技术开发 频道

ASP.NET 2.0 中的数据访问

【IT168技术文档】简介

数据访问一直是开发 Web 应用程序的一个关键问题。几乎每个商业应用程序都需要数据驱动的 Web 页面。由于数据访问如此普遍,开发人员不断地为简单的数据库任务重新生成复杂的代码就显得毫无意义了。开发人员需要从格式各异的不同数据源中快速访问数据。幸运的是,ASP.NET 2.0 中新增的数据访问控件和 ADO.NET 2.0 解决了这一问题。

对于传统的 ASP 和 ASP.NET 1.1 应用程序而言,开发人员不得不创建代码访问和更新数据库,将检索到的数据转换为浏览器识别的 HTML 格式。尽管 Visual Studio .NET 的向导可以帮助完成这个任务,但是要完成诸如分页和排序这样的高级功能,仍需要在后端代码和前端显示之间进行复杂的同步。通常,这样的代码难以维护和同步,特别是在数据库发生更改或需要在页面上显示附加数据的时候。此外,作为数据存储,XML 需要添加大量混有数据访问逻辑的代码。

为了提高开发人员的开发效率和 Web 应用程序的性能,ASP.NET 2.0 通过新增的数据控件中封装的功能,更加灵活地控制数据,从而减少访问和显示数据所需的代码。从传统的数据库到 XML 数据存储,各种各样的数据源都能连接到这些控件。所有数据源都以相似的格式进行处理,大大地降低了开发数据驱动的应用程序的复杂性。ASP.NET 2.0 需要进行广泛的体系结构改进,以便从内部支持这些功能。新增的数据源对象通过业界认可的非常好的方法增加了一个非常可靠的基础结构。现在,大多数复杂的应用程序都可以利用 ASP.NET 2.0 提供的数据访问工具。从体系结构和机制上限制 ASP.NET 1.x 执行的绑定和缓存问题,在 ASP.NET 2.0 中都得以解决了。

如果您是一位 ASP 开发人员,那么您会通过这篇白皮书了解到 ASP.NET 2.0 新增的数据访问功能和 ADO.NET 2.0 的数据访问模型。如果您是一位 ASP.NET 1.1 的开发人员,那么这篇白皮书概括的 ADO.NET 新增的改进功能和数据访问模型,以及介绍的如何使用 ASP.NET 2.0 新增的数据访问控件将帮助您减少开发数据驱动 Web 应用程序时编写的代码数量。

Web 应用程序的数据访问

在 .NET Framework 中,通过 ADO.NET API 执行数据访问。API 提供一个抽象层来封装和隐藏直接访问数据库的细节,这些细节有时是很杂乱的。ASP.NET 2.0 Web 应用程序通过提供的一些服务在 ADO.NET 上生成,这些服务用于自动生成与各种类型数据的连接,将用户控件与数据绑定,减少开发数据识别的 Web 应用程序所需的代码数量。

数据访问体系结构

对于 .NET Framework 中的 Web 应用程序,数据访问依赖于两个独立的体系结构层。第一层由执行数据访问所需的框架组件组成。第二层由为程序员提供数据访问功能的 API 和控件组成。从实践的观点看,只需了解能否为特定数据源找到匹配的数据提供程序。

数据访问涉及四个主要的组件:Web 应用程序 (ASP.NET)、数据层 (ADO.NET)、数据提供程序,以及真正的数据源。这些组件之间的关系构成了所有数据识别 Web 应用程序的基础结构。

图 1. 组件体系结构

数据存储

数据存储始于堆栈底部,提供了整个数据访问体系结构的基础。通过 ADO.NET 2.0、ASP.NET 2.0 的新增控件,Web 应用程序能够访问多种数据存储中的数据,包括关系数据库、XML 文件、Web 服务、平面文件,或诸如 Microsoft Excel 这样的电子数据表程序中的数据。实际上,真正的数据源与读取和操作数据所使用的机制关系不大。

数据提供程序

由于具有提供程序模型,ADO.NET 使用一组类和命令与不同的数据源进行交互。提供程序通过定义的一组接口和类挂钩来提供对一个特定数据源的存储和检索功能。这种模型的灵活性使开发人员只需编写一组数据访问代码(使用 ADO.NET)就能够访问多种类型的数据。

在 ASP.NET 2.0 中,除了基本的数据访问之外,提供程序模型实际上还用于多种不同的任务。例如,使用新增的个性化功能存储用户数据时依赖于几类提供程序。因此,实际的提供程序结构是功能依赖的。一个成员提供程序的用途与数据访问提供程序的用途不同。

下表显示组成 ADO.NET 数据提供程序的四个核心对象:

表 1. 一个 ADO.NET 数据提供程序的核心对象
对象 描述

Connection

建立到指定资源的连接

Command

对一个数据源执行命令。公开 Parameters,在 Connection 的 Transaction 范围内执行。

DataReader

从一个数据源读取只进的只读数据流。

DataAdapter

填充一个 DataSet,解析数据源的更新。

 

提供程序模型明确地分离了各种使用用途。ASP.NET 开发人员能够集中精力构建功能性的、应用人类工程学的用户界面,而后端开发人员则能够通过现有的企业级数据存储实现复杂的集成。使用 ASP.NET 2.0 的提供程序模型开发 Web 应用程序是一个极好的选择。

ADO.NET API

ADO.NET API 定义的抽象层使所有的数据源看起来都是相同的。不论何种数据源,提取信息的过程都涉及相同的关键类和步骤。我们将在下一部分详细介绍 ADO.NET 的处理过程。

Web 应用程序层

ASP.NET 在栈顶提供一系列控件,这些控件的设计意图是为减少开发的数据访问代码数量。例如,开发人员能使用数据源向导自动创建和配置一个数据源,使用这个数据源发布查询和检索结果。此外,不同的控件能够绑定到一个数据源,因此,控件能够依据从数据源检索到的信息,自动设置控件的外观和内容。

这些控件具有各种形状和大小,包括网格、树、菜单和列表。数据绑定控件通过它的 DataSourceID 属性连接到一个数据源,此属性在设计时或运行时声明。

数据源控件通过提供程序(例如 ADO.NET 中的那些提供程序)绑定到下层的数据存储。使用数据源控件的好处是能够在页面中声明性地表示出来。此外,能够直接使用诸如分页、排序和更新操作等功能,而无需编写一行代码。

数据访问 API

第二个体系结构层提供使用提供程序、ADO.NET 和 ASP.NET 控件的通用机制。这个体系结构涉及一些通用任务和过程。然而,从开发人员的视角来看,使用 ASP.NET 2.0 提供的各种数据绑定控件和数据源控件无需编写代码来支持这些过程。

连接和命令

ADO.NET 包含的 .NET Framework 数据提供程序用于连接一个数据库,执行命令和检索结果。在 ADO.NET 中,使用 Connection 对象连接一个指定的数据源。例如,在 SQL Server 2000 中,能够使用 SQLConnection 对象连接一个数据库,如以下代码所示。

[Visual Basic] Dim nwindConn As SqlConnection = _ New SqlConnection("Data Source=localhost;Integrated Security=SSPI;" _ "Initial Catalog=northwind") nwindConn.Open() [C#] SqlConnection nwindConn = new SqlConnection("Data Source=localhost; Integrated Security=SSPI;" "Initial Catalog=northwind"); nwindConn.Open();

连接到数据源后,能够使用 Command 对象执行命令和返回结果。Command 对象通过 Command 的构造函数创建,这个
构造函数接收一个 SQL 语句或 SQL 查询。一旦创建了 Command,就能使用 CommandText 属性修改 SQL 语句。

Visual Basic] Dim catCMD As SqlCommand = _ New SqlCommand("SELECT CategoryID, CategoryName FROM Categories", nwindConn) [C#] SqlCommand catCMD = new SqlCommand("SELECT CategoryID, CategoryName FROM Categories", nwindConn);

您可将一条命令认为是等同于一个特定的 SQL 调用,该调用绑定到一个特定的数据库。一条命令只能用于 CommandText 字段中定义的特定调用。

Command 对象提供了一些不同的 Execute 方法来启动存储过程,执行查询或者执行非查询语句,例如更新或插入:

1.

ExecuteReader 方法 — 将数据作为一个 DataReader 对象返回。用于任何返回数据的 SQL 查询。

2.

ExecuteScalar 方法 — 返回单独值,例如与特定查询相匹配的记录数,或者数据库功能调用的结果。

3.

ExecuteNonQuery 方法 — 执行不返回任何行的命令。典型的例子是存储过程、插入和更新。

当然,您需要依据初始化 Command 对象时创建的命令来选择正确的 Execute 方法。

ExecuteReader 方法将任何结果都返回到 DataReader 对象。DataReader 对象是查询数据库返回的一个关联的、只进的只读数据流。执行查询时,第一行返回到 DataReader 中。数据流保持到数据库的连接,然后返回下一条记录。DataReader 从数据库中读取行数据时,每行的列值都被读取和计算,但是不能被编辑。

0
相关文章