ASP.NET的第一个版本就已经建立了一组新的数据库绑定控件。有了这些控件的支持,数据的可视化和编辑就简单多了,其中一个最重要的控件就是DataGrid控件。但是这个控件也有很多缺点。它为数据的排序,分页和编辑提供了一些内置的功能,但必须手动实现。

  而ASP.NET的新版本2.0中采用了一种新的方式来解决以前版本的诸多问题,并且提供了标准的功能。现在可以对任何数据源进行排序,分页和编辑----在大多数情况下不需要输入任何代码。由于几乎所有的动态WEB程序都要考虑到与数据库的交互,幸运的是在ASP.NET 2.0中,我们可以轻松的实现如下这些操作:

  · 选择数据库中我们所需要的数据,并在页面中进行相应的显示。

  · 利用GridView控件实现排序,分页和数据缓存等功能,这使我们得到的数据更加直观和有序。

  · 更新,插入和删除数据是我们在日常开发中经常碰到的,GridView控件使得这一切变得更加高效和简单。

  · 当数据量比较庞大时,如何快速的找到所需要的数据就需要考虑数据筛选了。在后文中我将详细介绍任何实现数据筛选功能。

  由于本文主要是讨论数据存取方面的知识,因此我们先来介绍一下ASP.NET 2.0在这方面的新增功能:

  · 数据源控件 -- ASP.NET 2.0 引入了声明性数据源控件,这些控件向页上的数据绑定控件公开来自后端存储(例如 SQL 数据库、中间层业务对象或 XML 文件)的数据。数据源控件还公开诸如排序、分页、缓存、更新、插入和删除数据等功能,数据绑定控件能够自动调用这些功能而无需编写任何的代码。

  · 新的数据绑定控件 -- 除了保留ASP.NET 1.x 版中的一些数据绑定控件外,ASP.NET 2.0 还包括诸如 GridView、DetailsView、FormView、TreeView 和 Menu 等新的数据绑定控件,我们可以自定义这些控件以不同的方式开显示数据。GridView、DetailsView 和 FormView 控件还能自动调用数据源功能,使得我们可以更加简便的向数据驱动页添加排序、分页和更新操作等功能。

  · 数据控件参数 -- 数据源能够使用 ASP.NET 2.0 中新的数据控件参数对象从各种来源接受输入参数。使用这些参数对象可以轻松地向参数化数据操作提供服务器控件属性值、会话、应用程序、Cookie 和 querystring 字段以及用户配置文件属性。使用这些参数,只需很少的自定义代码或无需自定义代码就能支持筛选和主/详细信息方案。 

  · 改进的数据绑定语法 -- ASP.NET 2.0 中DataBinder.Eval 数据绑定语法已得到简化,并且我们还可以将双向数据绑定与控件属性相关联,以允许自动将值传递给数据源更新、插入或删除操作。对于分层的 XML 数据,ASP.NET 2.0 还包含一种基于 Xpath 的数据绑定语法。  

  · 使用 SQL Express 的本地文件数据库 -- 为简化开发,ASP.NET 2.0 现在支持在应用程序中连接到作为本地文件的 SQL Express 数据库的能力,从而消除仅为了执行开发工作而向服务器提供数据库的需要。当然,您仍然能够连接到基于服务器的 SQL 数据库。

  ASP.NET 2.0已经增加了两种新的服务器控件来实现数据绑定模型。这两种新的服务器控件可以处理许多复杂的数据方案,这使得开发者无须理解数据绑定过程中的一系列运行机制,这样我们就可以把开发的重点放在程序的构架和性能完善上,而不是重复的代码编写过程上。

  为了使你可以充分的理解数据绑定模型,现在我们重点来介绍一下这两种新的服务器控件:

  数据源控件

  数据源控件没有特定的呈现形式,而是表示特定的后端数据存储,例如数据库、业务对象、XML 文件或 XML Web services。数据源控件还支持针对数据的丰富功能(例如排序、分页、筛选、更新、删除和插入),数据绑定 UI 控件能够自动使用这些功能。数据源控件的其他优点包括数据自动绑定功能,无须再调用DataBind()方法,从而大大减少了所需要的代码量。在设计时其具有更多的扩展支持,并且保留了1.X版本的灵活性。

  ASP.NET 2.0中现成的数据源控件如下:

名称 说明
SqlDataSource 访问SQL Server,OLE DB,ODBC,Oracle和其他存在定制.NET Data Provider的数据库系统(提供程序可以是MySQL,FireBird等)。
ObjectDataSource 支持绑定到中间层对象,例如数据访问层或业务组件。
AccessDataSource 可以通过指定文件名来方便地操作Microsoft Access数据库。
SiteMapDataSource 支持绑定到 ASP.NET 2.0 站点导航提供程序公开的层次结构。
XmlDataSource 支持绑定到 XML 文件或文档。

  数据绑定控件

  数据绑定控件是将数据作为标记向发出请求的客户端设备或浏览器呈现的 UI 控件。数据绑定控件能够自动绑定到从数据源公开的数据,并在页请求生命周期中的适当时间获取数据。这些控件还可以选择利用数据源功能,例如排序、分页、筛选、更新、删除和插入。数据绑定控件通过其 DataSourceID 属性连接到数据源控件。您可能熟悉 ASP.NET 1.x 版中的一些数据绑定控件,例如 DataGrid、DataList、Repeater 和诸如 DropDownList 这样的列表控件。ASP.NET 2.0 还包含几个新的数据绑定控件,例如:

名称 说明
GridView 以网格格式呈现数据。此控件是 DataGrid 控件的演变形式,并且能够自动利用数据源功能。
DetailsView 在标签/值对的表格中呈现单个数据项,类似于 Microsoft Access 中的窗体视图。此控件也能自动利用数据源功能。
FormView 在由自定义模板定义的窗体中一次呈现单个数据项。在标签/值对的表格中呈现单个数据项,类似于 Microsoft? Access 中的窗体视图。此控件也能自动利用数据源功能。
TreeView 在可展开的节点的分层树视图中呈现数据。
Menu 在分层动态菜单(包括弹出式菜单)中呈现数据.

  ASP.NET 2.0中实现数据的绑定

  在WEB程序中,我们最常用到的功能之一就是显示来自诸如 Microsoft SQL Server、Oracle 等 SQL 数据库或其他 OLEDB 或 ODBC 数据存储区的数据。SqlDataSource 控件在 Web 应用程序中可以表示到数据库的直接连接,并且数据绑定控件可使用它自动检索数据。以前我们要编写大量的代码来实现数据库的连接和命令的查询,现在SqlDataSource 控件封装了实现这些功能的ADO.NET代码。由于数据查询被直接指定为数据源控件的属性,因为数据查询仍然在页代码中维护,所以我们称之为两层模型。由于这个原因,SqlDataSource 控件通常针对不需要完全封装的数据中间层对象的小型业余爱好者或个人站点。本教程后面有一个部分将讨论 ObjectDataSource 控件,该控件针对需要数据库查询的中间层封装的较大型企业。

  为了演示如何绑定数据库中的数据,本节中的示例利用一个新的名为 GridView 的数据绑定控件。GridView 控件是一种在ASP.NET 2.0 中用网格形式来呈现数据的新的数据绑定控件。网格中的每一行对应一个数据记录,列表示记录的字段。GridView 控件是ASP.NET 1.x版本中流行控件DataGrid的正式继承者。2.0版本因兼容性的缘故仍支持DataGrid,但是它已经不在工具箱中显示了。所以在新的项目中不要使用它。如果新控件GridView不仅提供了旧控件的所有功能,还提纲了更加完善的新功能,那为什么还要使用旧控件呢?特别是GridView可以利用新的Data Source Provider概念更好地工作。

  GridView 控件的主要功能如下:

  · 绑定到任何平面结构或多层结构(仅绑定第一层)的数据源控件。

  · 内置排序功能。

  · 选择数据记录。

  · 更新和删除数据记录。

  · 支持多个关键字段。

  · 支持用多个字段来创建超链接。

  · 内置的分页功能。

  · 对 GridView 对象模型进行编程访问以动态设置属性和处理事件。

  · 诸如 CheckBoxField 和 ImageField 等新的列类型。

  · 根据主题(Theme)和风格(Style)进行可视化的调整。

  · 根据不同的(移动)设备来调整显示结果。

  · 指定背景图片。

  创建一个只读报表及其工作原理:

  最简单的数据驱动页面就是显示一个只读报表,它主要是显示数据库中的一些数据。它并不允许用户去操作其表现形式和修改其中的数据。如果准备创建一个居于SQL Server数据库的只读报表的话,首先必须在页面上配置一个SqlDataSource数据源,然后将一个数据绑定控件的"DataSourceID"属性指定为SqlDataSource数据源控件的"ID"属性,这样就为数据源控件和数据绑定控件建立了一个连接。

  在下面的示例中,GridView 控件将绑定到一个连接到 SQL Server 数据库的 SqlDataSource 控件上。

  第一步:新建一个"ASP.NET Web site"项目,命名为"GridViewSqlDataSource"


  第二步:拖拽一个"GridView"控件到页面上,然后点击右上方的"智能标签"。在"选择数据源"项中选择"新建数据源"项,将出现如下窗口:


  第三步:在数据源配置向导中选择"Database"为该程序的数据源类型。其默认"ID"为SqlDataSource1,点击"OK"按钮后,出现如下窗口:


  第四步:点击上面窗口的"新建连接"按钮,将出现 "数据库连接"窗口,由于我们希望在GridView显示的是SQL Server 2000自带的"pubs"数据库中的信息,所以我们选择"pubs"数据库做为数据读取的来源。选择后的图示如下:

  第五步:确定选择的数据库后,单击"确定"按钮,VS 2005将自动设置好你的连接字符串,本例的为"Data Source=hoowoo;Initial Catalog=pubs;Integrated Security=True"。在新弹出的窗口中点击"下一步"后,将得到如下窗口:


  因为考虑到数据库的安全性能,所以我们希望可以通过其他方式来实现数据库连接字符串的信息隐藏。在这我们通过给连接字符串一个别名,并且将这个别名保存在Web.Config文件中。VS 2005会自动将别名和连接字符串进行映射,以实现数据库的连接。

  第六步:单击"下一步"按钮后,将会出现如下窗口:

 
  我们可以直接指定一个表格,选择其中的某些字段,单击"下一步"按钮后,就完成了整个的数据库配置过程。
 
  执行该程序后,其页面显示如下:


  现在我们来分析一下所生成的页面代码,查看代码可以在页面中右键选择"查看代码"项。
<form runat="server">
 <asp:GridView ID="GridView1" DataSourceID="SqlDataSource1" runat="server">
  <Columns>
   <asp:BoundField HeaderText="Last Name" DataField="au_lname" />
   <asp:BoundField HeaderText="First Name" DataField="au_fname" />
   <asp:BoundField HeaderText="City" DataField="city" />
   <asp:BoundField HeaderText="State" DataField="state" />
   <asp:BoundField HeaderText="Zip Code" DataField="zip" />
   <asp:CheckBoxField HeaderText="Contract" DataField="contract" />
  </Columns>
 </asp:GridView>
 <asp:SqlDataSource ID="SqlDataSource1" runat="server"
SelectCommand="SELECT [au_lname], [au_fname],[city],[state],[zip] FROM [authors]"
ConnectionString="<%$ ConnectionStrings:Pubs %>" />
</form>

  在本例中,DataGrid控件指定其"DataSourceID"属性为"SqlDataSource1",这样就建立了数据绑定控件和数据源控件之间的关联。

  GridView 控件反映 SqlDataSource 返回的数据记录的字段以动态生成网格的列。通过向 GridView 的 Columns 集合添加 DataControlField 对象,还可以指定要显示的显式列字段。这样允许确切指定要显示的列以及它们的相对顺序。可分配给Columns集合的其他字段类型包括 ImageField、HyperLinkField、CommandField、ButtonField 和 TemplateField。 我们可以根据需要来选择这些
字段类型。

  SqlDataSource 的 ConnectionString 属性指定到数据库的连接字符串,SelectCommand 属性指定要执行以检索数据的查询。连接字符串可以在页中按字面文本指定,不过在此例中,该属性是采用一种新的语法方式在Web.Config来查询该连接字符串的实际值。

  在本例中,Web.Config中的代码片段如下:
<connectionStrings>
<add name="Pubs" connectionString="Data Source=hoowoo;Initial Catalog=pubs;
Integrated Security=True" providerName="System.Data.SqlClient"/>
</connectionStrings>

  通过在Web.Config中添加一个"<connectionStrings></connectionString>"节点,就可以实现连接字符串与"name"属性指定的别名"Pubs"的映射。在 Web.config 中存储连接字符串是对任何 ASP.NET 应用程序的建议做法,这样不仅实现了程序的集中管理,而且保护了数据库连接字符串。在VS 2005中,我们可以使用 ASP.NET 2.0 中的一个命令行工具来加密此节点以实现进一步的安全性。

  注意:SqlDataSource 控件并不仅限于连接到SQL Server 数据库。它实际上能够连接到被配置为 System.Data.Common.DbProviderFactory 的任何托管 ADO.NET 提供程序。默认情况下,.NET Framework machine.config 中包括四个提供程序:
<configuration>
 <system.data>
  <DbProviderFactories>
   <add name="Odbc Data Provider" invariant="System.Data.Odbc" type="System.Data.Odbc.OdbcFactory, ..." />
   <add name="OleDb Data Provider" invariant="System.Data.OleDb" type="System.Data.OleDb.OleDbFactory, ..." />
   <add name="OracleClient Data Provider" invariant="System.Data.OracleClient"     type="System.Data.OracleClient.OracleClientFactory, ..." />
   <add name="SqlClient Data Provider" invariant="System.Data.SqlClient" type="System.Data.SqlClient.SqlClientFactory, ..." />
  </DbProviderFactories>
 </system.data>
</configuration>

  SqlDataSource 的 ProviderName 属性可设置为任何有效提供程序工厂的固定名称(默认为 System.Data.SqlClient)。注意,如果更改提供程序名称,则需要确保 ConnectionString 和 SelectCommand 属性使用所选提供程序的正确语法。

  我们还可以给SqlDataSource数据源控件的SelectCommand属性指定一个存储过程来替代一个SQL 命令,而且使用存储过程具有更大的灵活性。为了实现该功能,可以设置SqlDataSource数据源控件的SelectCommandType属性为"StoredProcedure".

  现在我们就利用SQL Server自带的示例数据库Northwind的"TenMostExpensiveProducts"存储过程来实现一个只读报表。

  该存储过程主要是在"Products"表中选择"ProductName"和"UnitPrice"两个字段,其代码如下:
create procedure "Ten Most Expensive Products" AS
SET ROWCOUNT 10
SELECT Products.ProductName AS TenMostExpensiveProducts, Products.UnitPrice
FROM Products
ORDER BY Products.UnitPrice DESC

  页面代码如下:
<form id="form1" runat="server">
<asp:GridView ID="GridView1" DataSourceID="SqlDataSource1" AutoGenerateColumns="False"
runat="server">
<Columns>
 <asp:BoundField DataField="TenMostExpensiveProducts" HeaderText="Product" />
 <asp:BoundField DataField="UnitPrice" DataFormatString="{0:c}" HeaderText="Price" />
</Columns>
</asp:GridView>
<asp:SqlDataSource ID="SqlDataSource1" runat="server"
SelectCommand="Ten Most ExpensiveProducts" ConnectionString=
"<%$ ConnectionStrings:Northwind %>" SelectCommandType="StoredProcedure" />
</form>

  在本例中我们可以通过设置SqlDataSource数据源控件的SelectCommandType属性为"StoredProcedure"来实现,如下图:


  也可以在数据源配置向导按下述步骤进行:

  当进行到"配置选择语句"窗口时,选择"指定一个自定义的SQL语句或存储过程"项,单击"下一步"


  在"自定义语句或存储过程"窗口中,选择"储存过程"项。并选择"Ten Most Expensive Products"


  等一系列的操作完成后,按F5执行该程序,页面显示如下:


  一般情况下,SqlDataSource数据源控件只返回包含查询结果的DataSet对象中的DataView。你可以配置SqlDataSource数据源控件将数据以DataReader的发生返回。当你希望只读,向前的数据存取时,采用DataReader的比DataSet具有更好的性能。尽管如此,当你需要SqlDataSource数据源控件的分页支持时,就必须采用DataSet的方式。

  设置SqlDataSource数据源控件的DataSourceMode属性为"DataReader",默认为"DataSet".如下图:


  页面代码如下:

<form id="form1" runat="server">
<asp:GridView ID="GridView1" DataSourceID="SqlDataSource1" AutoGenerateColumns="False"
runat="server">
 <Columns>
  <asp:BoundField DataField="TenMostExpensiveProducts" HeaderText="Product" />
  <asp:BoundField DataField="UnitPrice" DataFormatString="{0:c}" HeaderText="Price" />
 </Columns>
</asp:GridView>
<asp:SqlDataSource ID="SqlDataSource1" runat="server"
ConnectionString="<%$ ConnectionStrings:Northwind %>"
SelectCommand="Ten Most Expensive Products"
SelectCommandType="StoredProcedure"
DataSourceMode="DataReader" />