简介
数据访问一直是开发 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 从数据库中读取行数据时,每行的列值都被读取和计算,但是不能被编辑。
DataAdapter 和 DataSet
虽然连接数据库的应用程序使用 DataReader 就已足够,但是,DataReader 不能很好地支持数据库访问的断开连接模型。而 DataAdapter 和 DataSet 类则满足了这一需求。
DataSet 是 ADO.NET 断开连接体系结构中主要的数据存储工具。填充 DataSet 时,并非通过 Connection 对象将 DataSet 直接连接到数据库。您必须创建一个 DataAdapter 来填充 DataSet。DataAdapter 连接数据库,执行查询并填充 DataSet。当 DataAdapter 调用 Fill 或 Update 方法时,在后台完成所有的数据传输。每个 .NET Framework 的数据提供程序都有一个 DataAdapter 对象。
一个 DataSet 代表一组完整的数据,包括表格、约束条件和表关系。DataSet 能够存储代码创建的本地数据,也能存储来自多个数据源的数据,并断开到数据库的连接。
DataAdapter 能控制与现有数据源的交互。DataAdapter 也能将对 DataSet 的变更传输回数据源中。下列代码说明使用 DataSet 典型情况。
[Visual Basic]
Dim nwindConn As SqlConnection = _ New SqlConnection("Data Source=localhost;" & _ "Integrated_Security=SSPI;Initial Catalog=northwind")
Dim selectCMD As SqlCommand = _ New SqlCommand("SELECT CustomerID, CompanyName FROM " & _ "Customers", nwindConn)
selectCMD.CommandTimeout = 30
Dim custDA As SqlDataAdapter= New SqlDataAdapter
custDA.SelectCommand= selectCMD
Dim custDS As DataSet= New DataSet
custDA.Fill(custDS, "Customers") nwindConn.Close()
[C#]
SqlConnection nwindConn = new SqlConnection("Data Source=localhost;" + "IntegratedSecurity=SSPI;Initial Catalog=northwind");
SqlCommand selectCMD = new SqlCommand("SELECT CustomerID, CompanyName FROM Customers", nwindConn);
selectCMD.CommandTimeout = 30;
SqlDataAdaptercustDA = new SqlDataAdapter();
custDA.SelectCommand= selectCMD;
nwindConn.Open();
DataSetcustDS = new DataSet();
custDA.Fill(custDS, "Customers");
nwindConn.Close();
在以上代码中:
1.
创建了一个 SQLConnection 来连接 SQL Server 数据库。
2.
创建了一个 SQLCommand 来查询 Customers 表格。
3.
创建了一个 DataAdapter 来执行 SQLCommand 和数据操作的连接部分。
4.
从 DataAdapter 可以创建一个 DataSet。DataSet 是数据操作的断开连接部分,并且能绑定到 ASP.NET 2.0 的各种 Web 控件。
一旦创建了 DataSet,就能够将它绑定到任何数据识别的控件,方法是通过控件的 DataSource 属性和 DataBind() 方法。不幸的是,如果数据发生更改,您不得不再次调用 DataBind(),将控件重新绑定到数据集。因此,ASP.NET 1.x 开发人员不得不考虑调用绑定方法的精确时间和位置。开发出正确的同步方法和同步事件是相当困难的。
由于存在数据源的概念,ASP.NET 2.0 极大地简化了创建、绑定 DataSet 以及保持数据同步的全部过程。
ASP.NET 2.0
ASP.NET 2.0 从几个方面极大地改进了基本模型。最突出的一方面是,通过 DataSource 隐藏了创建 SQLCommand、生成 DataAdapter 和填充 DataSet 的过程,或者由数据绑定向导自动配置这个过程。
Configure DataSource Wizard 生成的代码能够连接数据源(数据库、平面文件、XML、对象),创建查询,并允许开发人员以简单的几个步骤指定参数。
一旦创建了数据源,下一步就是将数据源连接到一个控件。这里的“连接”就是所谓的数据绑定。从数据源提取的值能够连接到控件属性或作为表格、列表或网格中的值使用,这些操作都无需编写任何代码。
ASP.NET 数据控件
ASP.NET 1.1 是为使用 ADO.NET API 和简化数据访问而设计的。ADO.NET 2.0 通过新增的一组控件和向导进一步简化了数据访问过程和编写代码的数量,这些控件和向导是针对数据识别的应用程序,为提高开发速度和简化开发过程而设计的。
DataSource 控件
新的 ASP.NET 2.0 数据访问系统的核心是 DataSource 控件。一个 DataSource 控件代表一个备份数据存储(数据库、对象、xml、消息队列等),能够在 Web 页面上声明性地表示出来。页面并不显示 DataSource,但是它确实可以为任何数据绑定的 UI 控件提供数据访问。为了支持 DataSource 并使用自动数据绑定,利用一个事件模型以便在更改数据时通知控件,各种 UI 控件都进行了重新设计。此外,数据源还提供了包括排序、分页、更新、删除和插入在内的功能,执行这些功能无需任何附加代码。
最终,所有 DataSource 控件公开一个公共接口,因此,数据绑定控件无需了解连接细节(即连接到一个数据库还是一个 XML 文件)。每个 DataSource 还公开了特定于数据源的属性,因而对开发人员而言更为直观。例如,SqlDataSource 公开了 ConnectionString 和 SelectCommand 属性,而 XMLDataSource 则公开了定义源文件和任何架构的属性。在底层,所有数据源都创建特定于提供程序的基础 ADO.NET 对象,该对象是检索数据所需的。
创建一个 DataSource
在ASP.NET 2.0 中,DataSource 的子类是新增的数据控件中功能最强大的。它们提供了到数据库、XML 文件或其他数据源的声明性配置连接。使用控件从数据源检索和更新数据无需添加任何自定义代码。Configure DataSource Wizards 的图形化界面允许程序员定义相应的细节来配置数据源,几个简单的步骤就可以完成。ASP.NET 2.0 自动生成代码来连接资源,如果合适,创建基于参数的查询。自动生成的代码结果存储在一个 .ASPX 文件中。例如,在 .ASPX 文件中存储的 SQLDataSource 代码包含连接字符串的属性和 SQL 语句的属性。
<asp:sqldatasource id="SqlDataSource1" runat="server" selectcommand="select customerid, companyname from customers" providername="System.Data.OleDb" connectionstring="Provider=SQLOLEDB.1;Integrated Security=SSPI; Initial Catalog=Northwind; Data Source=localhost; Auto Translate=True; Use Encryption for Data=False>
</asp:sqldatasource>
当然,开发人员能够根据需要修改这些代码。例如,可以将提供程序名移动到 web.config 文件或其他中心位置。
数据源类型
ASP.NET 2.0 提供了几个独特的数据源对象,用于为数据绑定控件构造一个公共接口框架。数据源的对象用于操作不同的基础结构(从数据库、内存中的对象到 XML 文件),为控件提供抽象数据操作功能。
AccessDataSource
如果在应用程序中使用 Microsoft Access 数据库,则能够通过 System.Web.UI.WebControls.AccessDataSource 执行插入、更新和删除数据的操作。Access 数据库是提供基本关系存储的最小数据库。因为使用起来既简单又方便,所以许多小型的 Web 站点通过 Access 形成数据存储层。虽然 Access 不提供像 SQL Server 这样的关系数据库的所有功能,但是其简单性和易用性使 Access 非常适合应用于原型开发和快速应用程序开发 (RAD)。
SqlDataSource
为了提供一个更加健壮的数据库,综合利用 Microsoft SQL Server 提供的广泛功能,ASP.NET 2.0 提供了 SQLDataSource。SQLDataSource 的配置比 AccessDataSource 的更为复杂,SQLDataSource 用于企业级应用程序,这些应用程序需要一个真正的数据库管理系统 (DBMS) 所拥有的功能。
ObjectDataSource
System.Web.UI.WebControls.ObjectDataSource 用于实现一个数据访问层,从而提供更好的封装和抽象。ObjectDataSource 控件支持绑定到一个特定的数据层,而非绑定到一个数据库,其绑定方式与使用其他控件绑定数据库的方式相同。ObjectDataSource 控件能够绑定到任何一个方法,该方法返回一个 DataSet 对象或 IEnumerable 对象(例如,一个 DataReader 或类集合)。
<asp:objectdatasource id="ObjectDataSource" runat="server" typename="DAL.Customers" selectmethod="GetOrders">
</asp:objectdatasource>
ObjectDataSource 控件使用 Web 服务代理的方式与使用数据访问层的方式完全相同。换句话说,ObjectDataSource 处理设计正确的 Web 服务与处理一个关系数据库的方式相同。
DataSetDataSource
System.Web.UI.WebControls.DataSetDataSource 控件允许使用 XML 列表数据。列表数据以行和列排列。
<?xml version="1.0"?>
<collection>
<book>
<title>cosmos</title>
<author>carl sagan</author>
<publisher>ballantine books</publisher>
</book>
<book>
<title>catwings</title>
<author>ursula k. le guin</author>
<publisher>scholastic</publisher>
</book>
</collection>
要使用数据,只需设置 DataFile 属性,使其指向 XML 文件。
<asp:datasetdatasource id="Datasetdatasource1" runat="server" datafile="collection.xml" />
数据源能够连接到任何列表控件,例如 DataGrid。
XmlDataSource
XML 数据通常用于表示半结构化或层次化数据。使用 XML 文档作为数据源,可以从其他资源(例如,其他公司或现有应用程序)接收 XML 文档,并将 XML 数据格式化,以便与应用程序兼容。
要配置一个 System.Web.UI.WebControls.XmlDataSource,必须指定 XML 文件的路径,如果 XML 需要传输数据,则还需指定 XSLT 样式表路径或 XPath 查询路径(可选)。
<asp:XmlDataSource ID="XmlDataSource1" Runat="server" DataFile="~/xml/fruits.xml">
</asp:XmlDataSource>
XMLDataSource 特别适用于拥有层次结构的控件,例如,树视图或数据列表。
<asp:TreeView ID="TreeView1" Runat="server" DataSourceID="XmlDataSource1" ShowLines="True">
</asp:TreeView>
以上两个列表说明了如何声明性地配置一个 XmlDataSource 和一个 TreeView 控件,使之呈现如图 2 所示的 XML 层次结构。
图 2. TreeView 控件
TreeView 控件自动生成标记来创建一个用户界面,支持用户单击父实体时展开节点。TreeView 控件通过 XMLDataSource 绑定到 fruits.xml 文件。
SiteMapDataSource
System.Web.UI.WebControls.SiteMapDataSource 控件能够在逻辑上(而非物理上)实现 Web 站点的导航。通过生成一个逻辑结构,导航不受文件物理地址变动的影响。即使页面物理位置改变,您也不必更改应用程序的导航结构。
要使用 SiteMapDataSource,第一步是创建一个 XML 文件来映射 SiteMapNode 元素的层次结构,从而指定站点的导航结构。您可以将 XML 文件保存为 app.sitemap。
当您在应用程序中使用 SiteMapDataSource 时,它将查找指定的 app.sitemap 文件。然后,SiteMapDataSource 连接到导航控件,实现逻辑导航。
图 3. Home-> Articles-> Article 2 页面的详细路经跟踪
数据绑定
一旦创建了一个数据源,接下来是将数据源连接到一个控件。这里的“连接”就是所谓的数据绑定。ASP.NET v1.x 提供了一些数据绑定控件,例如 DataGrid、DataList 和 DropDownList 等。ASP.NET 2.0 对改进数据绑定控件的概念作出了几个重要的创新:
1.
现在,当数据绑定控件绑定到一个数据源控件(通过 DataSourceID 属性)时,能够自动绑定本身。这使页面开发人员无需了解页面的生存周期,并且不必在此时显式调用 DataBind()。数据绑定控件能够自动完成这些工作,甚至能侦听数据源的更改事件。
2.
ASP.NET 2.0 引入了新的数据绑定控件,这些控件能自动使用数据源的功能,例如排序、分页、更新、插入和删除。
在 ASP.NET v1.x 中,页面开发人员需要手动处理数据绑定控件事件,编写代码来执行这些操作。而在 ASP.NET 2.0 中,数据绑定控件直接使用数据源的功能。当然,页面开发人员仍能处理适当的事件以自定义这些操作的处理;例如,验证输入。
ASP.NET 2.0 支持多种不同控件丰富的数据绑定。例如,能够将一个 XML 数据源绑定到 <ASP:DropDownList>、<ASP:DataList>、<ASP: GridView> 以及许多其他的数据控件。
ASP.NET 2.0 中的数据绑定
传统的应用程序需要编写代码来绑定数据。例如,要在传统的 ASP 中填充下拉列表,或对页面中的值进行硬编码(如下所示),或编写代码来连接数据库,检索数据,再填充下拉列表。如果手动填充下拉列表,则每次更新数据时,必须更改代码(手动)。
<select size="1" name="dropdown_menu">
<option value="1" >test_data1</option>
<option value="2">test_data2</option>
<option value="3">test_data3</option>
<option value="4">test_data4</option>
</select>
如果通过访问数据库表的方式填充列表,则不仅需要编写代码来检索信息,而且每次加载页面时,应用程序都需要访问数据库,或在应用程序级或会话级缓存信息。
另一方面,ASP.NET 1.1 允许将控件绑定到数据库表和 XML 文档。但是,在 ASP.NET 1.1 中,如果要绑定到一个 XML 数据源,需要将 XML 转换为 DataSet(本文前面作过概述)。一旦获得转换后的 DataSet,只要将 DataSet 绑定到控件上即可。
//C# code
listbox.DataSource= dataset.Tables[0];
listbox.DataTextField = "Name";
listbox.DataValueField = "ID";
listbox.DataBind()
//VB Code
listbox.DataSource= dataset.Tables(0)
listbox.DataTextField = "Name"
listbox.DataValueField = "ID"
listbox.DataBind()
但是,每此更新 XML 数据源,必须重新将控件绑定到一个新的 DataSet,这是因为 DataSet 不能动态地连接到源文件。
在ASP.NET 2.0中绑定控件
ASP.NET 2.0 允许将下拉列表绑定到 XML 数据源或数据库,而无需编写任何代码。如果更新基础数据,它能够确保缓存值自动刷新。
要绑定控件,首先需要创建一个数据源。可以手动编写数据源定义代码,或使用 Configure Data Source Wizard。
图 4a.配置 ObjectDataSource 向导
图 4b.配置 XmlDataSource 向导
XMLDataSource 配置向导在 Web.config 文件中生成了下面的代码。
<asp:xmldatasource id="XmlDataSource1" datafile="msdn.xml" xpath="rss/channel/item" runat="server" />
一旦建立了数据源,就能够将数据绑定到控件。下列代码显示如何将 XML 数据源绑定到下拉列表控件。
<asp:dropdownlist id="DropDownList1" runat="server" datatextfield="state" datasourceid="XMLDataSource1" autopostback="true" />
请注意,ASP.NET 1.x 和 ASP.NET 2.0 中数据绑定的主要区别在于提供程序模型是否自动同步发生了更改的数据。换句话说,由于在数据源中置入了一个事件模型,如果修改支持数据源的数据,则自动更新绑定控件。
数据绑定控件
ASP.NET 2.0 引入了几个用于显示数据的新控件。这些新控件提供了一些比 ASP.NET 1.1 的 DataGrid 控件更优越的增强功能。
GridView 控件
ASP.NET 1.1 的 DataGrid 控件功能强大,使用灵活,允许显示结构化数据,无需编写大量代码。但是,如果要操作 DataGrid 的内容(例如,编辑或对返回行进行排序),需要编写适量的代码,自定义控件并提供这些行为。
GridView 与 DataGrid 控件相似;但是,您也能够通过向导一步步声明性地配置控件,启用像编辑和显示多页行数据这样的通用任务。
配置 GridView
为了说明实现上述功能多么轻松,请思考这个例子:根据下拉列表的选择项显示查询结果。只需将 GridView 控件拖放到页面上,配置控件以根据下拉列表的选择项自动显示结果。
图 5. 将 GridView 绑定到 DropDown 列表
要配置 GridView 控件,您必须通过 Configure Data Source Wizard 将它绑定到数据源。图 6 还显示 DataGrid 对象提供的 Enable Paging、Enable Sorting 和 Enable Selection 选项。
在 Configure Data Source 窗口中,选择适当的表格,然后选择所需的元素。窗口底部显示自动生成的 SQL 查询语句。
图 6. 编辑 SQL 数据源
下一步,单击 WHERE 按钮,配置 GridView 中显示的记录的条件;在下面的窗口中选择 patientID 列,设置操作符和源选项。当源选项设置为 Control 时,当前页面中的所有控件将自动填充到 Parameter 属性的 Control ID 字段中。从列表中选择想要连接的控件。配置好参数和默认值(如果需要)后,单击 Add 按钮,再单击 OK 按钮进行确认。
图 7. 查询编辑器对话框
生成的 select 语句可通过 Configure DataSource 窗口查看。
在 ASP 和 ASP.NET 应用程序中,必须编写代码完成所有这些过程,还要编写 HTML 代码来显示格式化的结果。新的 GridView 控件生成了以下结果,没有附加任何代码(请注意,Edit 和 Delete 链接是自动可见的,并注意生成的 SQL):
图 8. 绑定到下拉列表的 GridView 控件显示的结果
DetailsView 控件
DetailsView 控件与 GridView 控件相似,它使用完全相同的安装机制。GridView 控件在一页显示多条记录,而 DetailsView 控件一次只显示一条记录。
图 9. 在 DetailsView 控件中显示一条记录
因此,DetailsView 控件与 GridView 控件形成了很好的互补。将 DetailsView 连接到 GridView 可以更好地控制更新个别项目或插入新项目的方式和时机。
FormView 控件
使用上述配置步骤,我们还能够为 ASP.NET 的开发配置另一个新控件 — FormView 控件。FormView 控件支持非常灵活的 UI 布局。下面的示例显示使用 FormView 控件查看单个数据库记录。
图 10. FormView ItemTemplate 输出
像 ItemTemplate 和 EditItemTemplate 这样不同的模板用于查看和修改数据库记录,无需任何自定义代码。
图 11. FormView EditTemplate 输出
新增的 ASP.NET 2.0 数据功能
除了前面章节介绍的新控件,ASP.NET 2.0 还提供几个与数据访问有关的新功能,这些功能有助于提高数据驱动应用程序的性能和安全性。
性能
Web 应用程序的性能通常可以通过两种机制来改进。首先,Web 应用程序层能够缓存尽可能多的数据,减少了不必要的数据层调用。其次,Web 应用程序可以减少调用数据层的次数和大小。
数据源缓存
SQLDataSource 和 ObjectDataSource 支持数据层缓存。通过设置数据源对象的一些属性,程序员不用开发任何自定义代码,即可使用缓存 api。数据源对象将自动管理底层存储机制的一致性。
SQL 缓存依赖关系
对大多数数据驱动的 Web 站点来说,缓存数据是复杂的任务。Web 站点需要使用缓存来提高性能,但是更新数据的需求也很迫切。ASP.NET 1.x 能将页面缓存一段时间,并通过输入参数(QUERYSTRING 或 POST 参数)进行组织。
<%@ outputcache duration="3600" varybyparam="ProdID" %>
以上代码根据变量 ProdID (产品 id)在内存中缓存页面一小时。
如果在应用程序的其他地方更新了下层数据,缓存数据将出现问题。例如,考虑将一个产品目录页面通过产品 ID 进行缓存。如果从一个管理站点更新产品信息(例如,可用数量或价格),过期数据仍保留在缓存中,并显示给客户。在 ASP.NET 1.x 中,必须等待缓存失效,或使用 Response.RemoveOutputCacheItem 强制缓存失效。
ASP.NET 2.0 通过实现表格级 SQL 通知来支持数据库缓存依赖关系。更改数据时,一个表格级依赖关系通知页面。下面的代码将产品页面缓存了一小时,但是向数据库表添加了一个依赖关系。
<%@ outputcache duration="3600" varybyparam="ProdID" sqldependency="MyDatabase:Products" %>
向 Products 表格添加新的 SQLDependency 属性后,不论表格发生任何更改,缓存过的页面都将失效。SQLDependency 属性必须引用在 web.config 文件中配置的 Microsoft SQL Server DataSource。DataSource 标识了使依赖关系通知有效的数据库连接和参数。
自定义 SQL 依赖关系
虽然默认情况下 SQLDependency 类只支持 Microsoft SQL Server,但是您能够通过 machine.config 和 web.config 文件替代和重新配置类。这个功能允许您创建自定义的 SQLDependency 类,为任何 DataSource(包括 Oracle、Sybase 或其他任何数据库)提供相似的功能。
数据源缓存
在 ASP.NET 2.0 中,缓存数据的另一个方法是使用直接置入数据源的缓存机制。例如,SQLDataSource 和 ObjectDataSource 类都支持通过 EnableCaching 属性直接缓存。只需将该属性设置为 true,数据源将自动缓存从数据存储提取的数据。缓存将根据 CacheDuration 属性设定的时间或通过类似于页面级指令的 SQLCacheDependency 失效。由于在数据源控件中置入了这些功能,无需编写任何代码,您就能快速、轻松地实现缓存。
改进的 DataSet 远程处理支持
对 ASP.NET 1.1 最多的抱怨是:由于通常要将 DataSet 序列化为 XML,因此通过 .NET 远程处理发送 DataSet 比发送其他序列化二进制表示形式慢。ASP.NET 2.0 将 DataSet 作为二进制序列化表示形式进行传输,以帮助减少 DataSet 的传输大小和传递信息所需的传输时间。
安全性
ASP.NET 2.0 提供的一项服务能够加密配置文件的任何部分。通过加密,您能够更安全地存储应用程序内的信息。例如,可以加密 Web.config 文件的 ConnectionString 部分来保护所有的敏感信息。配置加密允许您安全地存储像连接字符串这样的信息。
加密配置信息时,您可以使用政府标准加密算法,例如三重 DES。因为加密数据存储在配置文件中,所以应用程序不依赖于注册表。
小结
ASP.NET 2.0 致力于帮助您灵活地控制数据,通过在新增的数据控件中封装功能,减少访问数据和显示数据所需的代码数量。新的数据访问模型和控件减少的数据访问代码多达 70%。现在,传统的 ASP 或 ASP.NET 1.1 应用程序中需要手动设计的许多功能都已内置到新的数据控件中了。数据访问的新体系结构也是可扩展的,是为访问多种不同的数据源数据而设计的,这些数据源包括数据库、XML 文件、平面文件、数据流等等。作为一名企业级开发人员,您能够利用新的体系结构连接任何后端数据源,而仍然使用一个简单的前端接口。