ASPNET 引入了一系列可以改善数据访问的新工具包括几个数据源和数据绑定控件新增种类的数据源控件可以消除 ASPNET x 中要求的大量重复性代码例如您可以很容易地将 SQL 语句或存储过程与数据源控件相关联并且将它们绑定到数据绑定控件更令人感到印象深刻的是通过 ObjectDataSource 控件可以简化开发和减少代码并且仍然可以在 n 层体系结构的不同层中抽象业务和数据访问逻辑
在 NET 问世以前用传统的 ASP 生成数据网格通常需要编写大量的代码以便在遍历 ADO 记录集的同时即时生成 HTML 表ASPNET x 通过允许您将基于 XML 的 DataSet 绑定到 ASPNET DataGrid 控件从而使该类型的开发变得更加容易这就减少了生成网格所必需的代码但是传统的 ASP 和 ASPNET x 都要求代码实现分页排序编辑和行选择功能通过 ASPNET 中的改进功能可以显着减少这些代码的数量以产生带有完整分页排序和编辑功能并填充了数据的网格
在这一期的 Data Points 中我将首先演示通过 ASPNET 并使用 SqlDataSource 和一些新的数据绑定控件开发 Web 应用程序是多么容易请注意我在此使用的是 Beta 版本
大多数企业应用程序都是在多层体系结构之上生成的该体系结构有一个用于存放业务逻辑的中间层以及一个使用一个或多个后端数据库的数据访问层我将讨论 ObjectDataSource 可以多么理想地与现有的多层组件集成通过将 ObjectDataSource 控件链接到业务对象您可以充分利用现有的多层体系结构来生成完善的 Web UI并且能够显着减少代码 ObjectDataSource 控件还包含一些特殊的属性使您可以绑定到 ASPNET 和 ADONET 中新近增强的强类型 DataSet 和数据组件 ASPNET 中的其他新功能和改进包括新增的双向绑定表达式增强的缓存以及几个新增的可以数据绑定到新的数据源控件的 ASPNET 控件
数据绑定控件
要使用数据源控件必须具有一个用来将它们绑定到的数据绑定控件在 ASPNET 中有几个新的数据绑定控件包括 GridViewDetailsView 和 FormView 控件如果您喜欢 ASPNET x DataGrid 控件那么您也会喜欢 ASPNET GridView 控件GridView 在本质上类似于 DataGrid因为它可以绑定到新的数据源控件并且可以用来实现排序编辑和分页 — 它们需要的代码都比 DataGrid 少得多(有关 GridView 的详细信息请参阅 Dino Esposito 在 MSDN?Magazine 的 年 月刊中发表的文章)
要将 GridView 绑定到数据源控件需要将 GridView 的 DataSourceID 属性设置为数据源控件的 ID还可以设置 GridView 的其他几个属性来增强外观和用户交互(我将在稍后的示例中加以演示)
<asp:GridView ID=gvwOrders Runat=server
DataSourceID=sdsOrdersDataSource
AutoGenerateColumns=True>
其他控件(例如DropDownList)也可以绑定到数据源控件例如DropDownList 控件可以绑定到检索雇员列表的 SqlDataSource 控件雇员的全名可以显示在 DropDownList 中而 EmployeeID 可以作为控件的基础数据值字段绑定到该控件以下示例定义了一个 DropDownList它将显示可供选择的客户名称的列表客户数据被绑定到一个名为 sdsCustomerDataSource 的 SqlDataSource 控件该控件可获得客户的 CompanyName 和 CustomerID 字段的列表
<asp:DropDownList ID=ddlCustomers Runat=server AutoPostBack=True
DataSourceID=sdsCustomersDataSource
DataTextField=CompanyName
DataValueField=CustomerID>
</asp:DropDownList>
在 ASPNET 中将控件绑定到数据源控件非常简单并且不需要任何处于代码隐藏中的代码但是如果您愿意仍然可以编写代码以显式绑定到控件实际上数据绑定控件的数据源和 DataMember 属性与 ASPNET x 相比已经得到了改进
数据源控件
在 ASPNET 中有几个新的数据源控件例如SqlDataSourceObjectDataSourceXmlDataSourceAccessDataSource 和 SiteMapDataSource(如图 所示)它们全都可以用来从它们各自类型的数据源中检索数据并且可以绑定到各种数据绑定控件数据源控件减少了为检索和绑定数据甚至对数据进行排序分页或编辑而需要编写的自定义代码的数量
每个数据源控件都具有类似的属性以便可以与其各自的数据源进行交互生成 SiteMapDataSource 和 XmlDataSource 是为了检索分层数据而生成其他数据源控件是为了检索带有列和行的基于集合的数据
专门生成 AccessDataSource 以便从 Access 数据库中检索数据SqlDataSource 听起来好像只能使用 SQL Server?但实际情况不是这样的它实际上可以用来从任何 OLE DB 或符合 ODBC 的数据源中检索数据
命令类型和参数
SqlDataSource 控件具有四个命令属性您可以设置这些属性以告诉 SqlDataSource 如何获得插入更新和删除它的数据可以将 SelectCommand 属性设置为 SQL 语句或存储过程在任何一种情况下都可以根据需要传入参数InsertCommandUpdateCommand 和 DeleteCommand 属性用于告诉 SqlDataSource 使用哪些 SQL 语句(或存储过程)来修改基础数据库中的数据图 中的代码示例显示了一个 SqlDataSource它将它的 SelectCommand 和 UpdateCommand 属性设置为参数化的 SQL 语句请注意UpdateParameters 使用 Parameter 元素来指示要用于参数的字段的名称和数据类型在将 GridView 绑定到该 SqlDataSource 以后这些 UpdateParameters 值就被绑定到受影响行的具有相同名称的列
您自己对此进行试验的最简单方式是在 Visual Studio? 中创建一个 Web 窗体连接到服务器资源管理器窗口中的本地 SQL Server Northwind 数据库然后将一个表拖到该 Web 窗体这会自动创建一个 SqlDataSource 控件以及一个 GridViewVisual Studio 会自动将 SqlDataSource 控件的 ProviderName 和 ConnectionString 属性设置为 SQL Server Northwind 数据库而且所有四个命令属性都将被设置为适当的 SQL 语句然后您为编辑该 Web 窗体而必须完成的所有工作就是使用智能标记来选中Enable Editing复选框(参见图 )
educitycn/img_///gif>图 GridView设置数据源控件还可以使用来自其他控件的参数例如数据源控件可以检索给定客户的所有订单在这种情况下CustomerID 可以是传递给 SqlDataSource 控件的 SelectCommand 属性的 SQL 语句或存储过程的参数还可以从其他控件(例如DropDownList)检索 CustomerID并将其直接传递到 SqlDataSource 控件的 SQL SelectCommand 中
您可以将控件的值直接链接到 SqlDataSource 控件的任一 SQL 语句(SelectCommandInsertCommandUpdateCommand 或 DeleteCommand)的参数还可以指定究竟要将控件的哪个属性用于该参数例如如果您在上一个示例中不需要 DropDownList 的默认属性而是需要它的 DataTextField则可以将 ControlParameter 的 PropertyName 属性设置为 DataTextField
除了 ControlParameter 以外还可以将其他参数类型用于数据源控件如果您要使用新的 ASPNET 个性化功能则可以使用 ProfileParameter 从配置文件对象中检索参数的值接下来还有几个从标准 Request 对象的集合中检索它们的数据的参数对象类型例如CookieParameter 可以用来从 Cookie 中检索参数的值QueryStringParameter 从任意请求字符串变量中获得它的值而 FormParameter 从 HTML 窗体的输入字段中获得它的值最后SessionParameter 可以用来从会话变量中检索它的值这些类型的参数为数据源控件提供了多个有关如何设置它们的参数值的选项
SqlDataSource 示例
既然我已经完成了概述那么我将对使用 SqlDataSource 和 ObjectDataSource 来检索和修改数据进行一下对比SqlDataSource 控件(它使用 ADONET DbProviderFactory 对象)具有将它直接链接到 OLE DB 或 ODBC 数据源的属性当加载包含链接到 SqlDataSource 的数据绑定控件的 ASPNET 页时SqlDataSource 直接与基础数据库进行通信因而SqlDataSourceData 源控件不与现有的业务对象集成
为了查看 SqlDataSource 是如何操作的让我们先观察一下 Orders_SDSaspx 页(参见图 )有一个 DropDownList 控件它绑定到一个从 Northwind 数据库中检索客户列表的 SqlDataSource 源控件
educitycn/img_///gif>图 通过 SqlDataSource 检索客户还有另外一个名为 sdsOrdersDataSource 的 SqlDataSource它用于检索选定客户的所有订单图 中的代码(摘自 Orders_SDSaspx — 它可在下载中得到)显示了两个 SqlDataSource 控