科技行者

行者学院 转型私董会 科技行者专题报道 网红大战科技行者

知识库

知识库 安全导航

至顶网软件频道应用软件ASP.NET Jumpstart:构建 Media Share Library Starter Kit 的数据层(2)

ASP.NET Jumpstart:构建 Media Share Library Starter Kit 的数据层(2)

  • 扫一扫
    分享文章到微信

  • 扫一扫
    关注官方公众号
    至顶头条

学习如果使用 Microsoft ASP.NET 和 Microsoft Visual Studio 2005(或 Microsoft Visual Web Developer 2005 Express Edition)构建您的初学者工具包。本文是 ASP.NET Jumpstart 系列文章的第二篇。

作者:MSDN 来源:MSDN 2007年9月2日

关键字:

  • 评论
  • 分享微博
  • 分享邮件

使用新的数据源服务器控件提取和发送数据

通过 .NET 提取数据库数据(或将数据发回数据库)有若干种方法。因此,必须找出一种最适合您的应用程序和实际情况的数据检索方案。ASP.NET 2.0 通过引入一系列全新的数据源服务器控件使这一过程变得十分简单。

新的 ASP.NET 2.0 数据源控件提供一种声明方法,通过它可连接到数据存储并检索应用程序所需的数据。使用新数据源控件的步骤比以往使用 ASP.NET 1.x 所采用的步骤更简单。

您可以任意使用 5 个新数据源服务器控件。一些新的数据源控件是专门为使用 Microsoft SQL Server、新的 Microsoft SQL Server Express Edition 数据库文件、XML 文件等而设计的。这些数据源控件可以连接到指派的数据存储,检索数据,并执行通过各种服务器控件属性指定的任何数据操作。

使用 SqlDataSource 控件选择数据

仔细观察 Media Share Library Starter Kit 代码,会发现其中多次使用了数据源控件以选择、插入、更新或删除 Library.mdf 数据库文件中存储的信息。我们首先来看一些简单的 Select 示例。

MainLibrary.aspx 页(位于媒体共享库 (Media Share Library) 应用程序的 Library 文件夹中)上有一个简单数据检索的典型示例。该页含有一个 GridView 服务器控件,该控件显示输入到库中的某一特定类别的所有项目。最终用户通过一个下拉列表控件完成类别选择,该控件位于显示结果的 GridView 控件的正上方。那么类别数据又是如何填充到下拉列表控件的?其实,这是通过使用一个 SqlDataSource 控件完成的,该控件从上文创建的 MediaTypes 表中提取类别列表。一旦获得类别列表,就将其传递给下拉列表控件。首先,SqlDataSource 控件从 Library.mdf 数据库文件中提取类别列表。列表 1 显示该过程。

列表 1. 使用简单的 SqlDataSource 控件进行数据选择

<asp:SqlDataSource ID="SqlDataSource1" runat="server" 
 ConnectionString="<%$ ConnectionStrings:LibraryConnectionString %>"
 SelectCommand="SELECT [MediaTypeName], [MediaTypeId] FROM [MediaTypes] 
    ORDER BY [MediaTypeName]">
</asp:SqlDataSource>

这是一个相当简单的 SqlDataSource 控件示例。与 ASP.NET 中的其他服务器控件一样,控件内必须首先设置一个 ID 值和 runat="server"。下一个要注意的重要项目是 ConnectionString 属性。该属性通过 <%$ ConnectionStrings:LibraryConnectionString %> 值指向 Web.config 文件中的一个位置。但是该值的含义没有直接点明,其真正表示的意思是使用的值需要从 Web.config 文件的 <ConnectionStrings> 部分提取,即使用名为 LibraryConnectionString 的特定 <add> 节点内的值。查看媒体共享库 (Media Share Library) 应用程序的 Web.config 文件,可以看到以下代码,如列表 2 所示。

列表 2. Web.config 的 <ConnectionStrings> 部分

<configuration 
 xmlns="http://schemas.microsoft.com/.NetConfiguration/v2.0">

   <connectionStrings>
      <add name="LibraryConnectionString" 
       connectionString="Data Source=.\SQLEXPRESS;
          AttachDbFilename=|DataDirectory|\Library.mdf;
          Integrated Security=True;User Instance=True"   
       providerName="System.Data.SqlClient"/>
   </connectionStrings>

</configuration>

列表 2 中的 LibraryConnectionString 值指向上文创建的 Library.mdf 数据库文件。

创建 SqlDataSource 控件的 ConnectionString 属性后,还需要留意 SelectCommand 属性。该属性接收 Select TSQL 命令,这些命令用于提取 Library.mdf 数据库文件中特定表的数据。以本文为例,提取 MediaTypes 表的 MediaTypeName 和 MediaTypeId 列,按字母顺序进行排列后,再传递给本页的下拉列表控件。

将选定的数据绑定到服务器控件

设置好 ConnectionStringSelectCommand 属性后,即可将 SqlDataSource 控件绑定到页面上的一个或多个控件。然而,本文示例只是将 SqlDataSource 控件绑定到 DropDownList1 这一个控件。列表 3 说明该控件的代码。

列表 3. 绑定到 SqlDataSource 控件的 DropDownList 服务器控件

<asp:DropDownList ID="DropDownList1" runat="server" AutoPostBack="True" 
 DataSourceID="SqlDataSource1" DataTextField="MediaTypeName" 
 DataValueField="MediaTypeId">
</asp:DropDownList>

该示例表明,下拉列表通过使用 DataSourceID 属性将自身绑定到 SqlDataSource1 控件的输出,所有数据绑定服务器控件均可使用该属性。提供给 DataSourceID 属性的值就是 SqlDataSource 控件(本示例的 SqlDataSource1)中使用的 ID 值。下拉列表在该处有特殊的可用性需求 — 在文本字段和可选值字段中放置一个值。下面是此类 <option> 的一个示例:

<option value="1">DVD</option>

本例,我们将分别使用 MediaTypeIdMediaTypeName 的值作为 <option> 的值和显示给最终用户的值。DropDownList 服务器控件的使用是通过 DataTextFieldDataValueField 属性的使用来完成的。

由于 DropDownList1 现在绑定到 SqlDataSource1 控件的输出,因此页面将动态地提取输出结果,如图 10 所示。



图 10. 动态地生成下拉列表的内容

选择带有参数的数据

有时您必须选择基于某一特定参数的数据,即所谓的参数化查询。例如,想要一份客户数据库中所有加拿大客户的列表。这即是一个参数化查询。您不想要所有客户的列表,这样的列表繁杂冗长。如果将某个值(本示例为 Canada)传递给 Select 语句,将返回一个经过筛选的结果集。

Media Share Library Starter Kit 中的 MainLibrary.aspx 页上还有一个 GridView 控件,该控件由另一个 SqlDataSource 控件 (SqlDataSource2) 驱动,后者需要参数化查询来获取结果。本示例的 GridView 实际上由最终用户通过选择下拉列表控件(上文图 10 所示)的项目来控制。如果最终用户选择下拉列表中的 DVD,那么在 Select 语句中将使用该值,GridView 控件只显示返回的 DVD 类别的库项目。当然,GridView 中显示的数据完全由 SqlDataSource2 控件控制。列表 4 说对该控件。

列表 4. 带有参数化查询的 SqlDataSource 控件

<asp:SqlDataSource ID="SqlDataSource2" runat="server" 
 ConnectionString="<%$ ConnectionStrings:LibraryConnectionString %>"
 SelectCommand="SELECT [ItemId], [UserName], [MediaName], [MediaISBN], 
   [MediaInputDate], [MediaViewed], [LoanedAmount], [OnLoan], [MediaType] 
   FROM [Media] WHERE ([MediaType] = @MediaType) ORDER BY [MediaName]">
   <SelectParameters>
      <asp:ControlParameter ControlID="DropDownList1" Name="MediaType" 
       PropertyName="SelectedValue"
       Type="Int32" />
   </SelectParameters>
</asp:SqlDataSource> 

观察该 SqlDataSource 控件,会发现它与我们在上文看到的 SqlDataSource1 控件之间有很多相似之处。尽管有相似之处,但是也有一些显著的差别。最明显的一点是 SelectCommand 值要长得多。造成该结果的一个原因是要检索 Media 表中的大量列值。另一个更有趣的原因源于命令中的 WHERE 语句。

WHERE ([MediaType] = @MediaType) ORDER BY [MediaName]

这行代码表示的真正含义是,SqlDataSource 控件要选择 Media 表中 MediaType 列值等于某个特定参数的所有已定义列,我们稍后将用 @MediaType 定义该参数。获得这些值后,需要根据 MediaName 列的值按字母顺序排序。

以声明方式定义参数

依据上文来看,稍后为 @MediaType 变量赋值很重要。赋值的方法有两种 — 声明方式或编程方式。首先回顾如何以声明方式定义参数。

我们可以使用 SqlDataSource 控件的 <SelectParameters> 部分为 @MediaType 变量赋值,因为 Select 语句中至少有一个参数需要定义(请参看上文列表 4 中的示例)。除 <SelectParameters> 部分之外,SqlDataSource 控件还有 <DeleteParameters>、<FilterParameters>、<InsertParameters> 和 <UpdateParameters>。下列控件可以在 <SelectParameters> 部分内嵌套使用:

<asp:Parameter>

基本的参数占位符,可稍后定义。

<asp:ControlParameter>

在获取页面上另一个服务器控件的值时使用。

<asp:CookieParameter>

在需要获取最终用户的 cookie 键值时使用。

<asp:FormParameter>

在接收来自窗体集合的值时使用。

<asp:ProfileParameter>

在接收来自 Profile 对象的值时使用,该对象与提交请求的最终用户相关联。

<asp:QueryStringParameter>

在接收请求的 URL 查询字符串的键值时使用。

<asp:SessionParameter>

在接收最终用户会话对象的键值时使用。

我们通过使用 <asp:ControlParameter> 控件将列表 4 示例中的 @MediaType 值与 DropDownList1 服务器控件中的值关联起来。(列表 5 再一次说明了其中的部分代码)。

列表 5. 使用 <asp:ControlParameter> 获取所需的值

<SelectParameters>
   <asp:ControlParameter ControlID="DropDownList1" Name="MediaType" 
    PropertyName="SelectedValue"
    Type="Int32" />
</SelectParameters> 

要从页面上的 DropDownList1 控件获取 @MediaType 所使用的值,ControlParameter 控件需要通过属性 ControlID 将两者关联起来。提供给 ControlID 属性的值必须为关联控件的 ID 属性值。后面的属性 Name 指向参数化查询中的真正变量名。这一点很重要,因为需要定义的 Select 参数可能不止一个。虽然本示例仅有一个参数,但是这种关联仍然是必要的。因为我们使用的是一个下拉列表,所以需要定义 SqlDataSource 控件要使用下拉列表的哪一个属性。例如,在关联一个下拉列表控件时,可以获得诸如 SelectedIndexSelectedItemSelectedValue 属性的值。因此,需要声明要获取的属性。在 SqlDataSource 控件中定义的最后一个属性是 Type 属性。就是在这里对控件的值进行真正意义上的类型转换(本示例转换为 Int32)。

上述定义完成后,您就可以使用下拉列表控件来驱动 SqlDataSource 控件,并使用通过它提取的 Library.mdf 数据库文件中 Media 表的值了。在图 11 中对此进行了解释。



图 11. 通过 SqlDataSource 控件驱动 GridView

以编程方式定义参数

除了声明方式之外,还有另一种选择,下面介绍以编程方式定义参数。如上文所示,与直接在 SqlDataSource 控件中使用不同,这种方式在代码隐藏页面中使用。

观察 Default.aspx 页,它位于 Media Share Library Starter Kit 的 Library 文件夹,该页会在您所有的或借用的项目上显示警告。这些警告还会提供给参数化 select 查询过程所使用的 SqlDataSource 控件。该 Select 命令如下所示:

SELECT [UserName], [MediaName], [MediaISBN], [DueDate] FROM [Media] 
WHERE (([DueDate] < @DueDate) AND ([Borrower] = 
@Borrower) AND ([OnLoan] = @OnLoan)) ORDER BY [DueDate]

在完成这个 Select 命令之前,必须为三个变量赋值 — @DueDate@Borrower@OnLoan。如果查看 Default.aspx 页中的 SqlDataSource 控件声明,您会发现这三个变量之中,只有两个在 Select 命令中赋了值(如列表 6 所示)。

列表 6. 带有查询参数的 SqlDataSource 控件

<asp:SqlDataSource ID="SqlDataSource1" runat="server" 
 ConnectionString="<%$ ConnectionStrings:LibraryConnectionString %>" 
 SelectCommand="SELECT [UserName], [MediaName], [MediaISBN], [DueDate] 
   FROM [Media] WHERE (([DueDate] < @DueDate) AND ([Borrower] = @Borrower)    
   AND ([OnLoan] = @OnLoan)) ORDER BY [DueDate]">
     <SelectParameters>
        <asp:ProfileParameter Name="Borrower" PropertyName="Email" 
         Type="String" />
        <asp:Parameter DefaultValue="True" Name="OnLoan" Type="Boolean" />
     </SelectParameters>
</asp:SqlDataSource> 

上面定义的声明参数列表只声明了 @Borrower@OnLoan 参数。列表中没有 @DueDate 参数,这是因为该参数值会随服务器当前日期/时间的变化而动态改变。这也是该参数需要以声明方式定义的原因。

列表 7 显示在 Default.aspx 页的代码隐藏页面中动态声明 @DueDate 参数的位置。

列表 7. 动态地定义 @DueDate 参数

SqlDataSource1.SelectParameters.Add("DueDate", 
   TypeCode.DateTime, DateTime.Now.ToString())

在该行代码中,SqlDataSource 控件通过 Add() 方法添加一个 SelectParameterAdd() 方法要求提供变量名、类型和值,即本例中的 DueDate。对于该变量的值,我们只需提供服务器当前日期/时间即可。

到此为止,SqlDataSource 控件已经具备 Select 命令需要的所有三个参数。

尽管本文说明的是 Select 命令的使用,但是不要忘了您还可以将此类功能用于 Delete、Insert 和 Update 命令。

小结

本文为您介绍了如何构建 Media Share Library Starter Kit 的数据层。首先,我们介绍了在 SQL Server Express Edition 中如何直接构建一个新的数据库和表,然后介绍了 ASP.NET 2.0 数据源控件以及如何使用这些控件从创建的数据文件中提取所需的数据。

ASP.NET Jumpstart 系列的第三篇文章将介绍如何使用 ASP.NET 2.0 提供的一些激动人心的新控件。

希望您能享受其中的乐趣,并祝您编程愉快!

查看本文来源

    • 评论
    • 分享微博
    • 分享邮件
    邮件订阅

    如果您非常迫切的想了解IT领域最新产品与技术信息,那么订阅至顶网技术邮件将是您的最佳途径之一。

    重磅专题
    往期文章
    最新文章