ASP.NET构建数据层适用于:
Microsoft ASP.NET 2.0
Microsoft Visual Web Developer 2005 Express Edition
欢迎您阅读ASP.NET构建数据层,该文章将为您从头到尾展示创建一个应用程序的完整过程。要构建的初学者工具包称为 Media Share Library Starter Kit。Media Share Library Starter Kit 使您能轻松创建允许注册用户展示媒体项目(例如电影 DVD、音乐 CD、书籍等等)集合的应用程序,以便供其他注册用户借用。用户能够一并浏览使用该应用程序的组所拥有的项目库,并向项目的注册所有者请求借用某些特定项目。Media Share Library Starter Kit 的理念是,您能够使用其提供的框架快速组织为更多人所共享的库集合。
无论您是否使用初学者工具包,它本身就表明了在最新版本的 ASP.NET 2.0 中 Microsoft ASP.NET 所具备的更激动人心的附加功能,这正是它的微妙所在。初学者工具包利用了大量的母版页、新的代码隐藏模型、新的服务器控件等等。本文重点介绍如何使用初学者工具包的一些激动人心的、新的数据功能,例如使用新的 Microsoft SQL Server Express Edition 文件以及新数据源控件来执行插入、更新和删除数据的操作,这些功能将在 ASP.NET 2.0 中提供。
让我们开始自己动手构建初学者工具包的数据层吧,首先来学习使用新的 SQL Server Express Edition 构建自己的数据存储。
使用SQL Server Express
Microsoft 的 SQL Server 2005 Express Edition 是一个新的数据库产品,它基于 Microsoft SQL Server 2005 成熟版本所使用的技术。SQL Server Express Edition 是 SQL Server 2005 的一个剪裁版本,只要使用它,您就不必使用其他数据库文件(例如 Microsoft Access .mdb 文件)来构建 ASP.NET 应用程序的数据层了。
过去,许多 Web 开发人员和业余爱好者发现,使用 Access 文件作为应用程序的数据存储非常简单,这些文件不但易于安装和实现,而且易于和应用程序的其余文件一起从一个位置复制到另一个位置。鉴于这个原因,Microsoft 通过新的 .mdf 文件扩展名提供了 SQL Server Express Edition 文件,您能够以处理上述 Access 文件的方式对它进行处理。这些 .mdf 文件可通过与 Visual Studio 集成的卓越功能轻松创建,在 ASP.NET 应用程序内使用起来很简单,通过 x-copy 将文件从一个位置复制到另一个位置也很容易,就好像只是 ASP.NET 应用程序中的另一些文件一样,通过它进行部署可以说是易如反掌。
不仅如此,使用方面的便利还有很多。新的 SQL Server Express 产品支持诸如 XML、VARCHAR(MAX) 等新的数据类型,甚至支持用户定义的数据类型。
首先,我们来了解用于存储用户和角色信息的数据库文件。
构建ASPNETDB.MDF 文件
本文介绍的初学者工具包是处理注册用户的,因此您最想知道的可能就是初学者工具包存储用户和角色信息的位置。在初次构建和运行应用程序时,您会注意到,Visual Studio 2005 动态创建了存储这些信息的数据库文件。
按 F5 键启动并构建应用程序之后,ASP.NET 将动态创建所需的 ASPNETDB.MDF 数据库文件,该文件用于为应用程序存储用户的登录信息和角色信息。
在 App_Data 文件夹中,除了 ASPNETDB.MDF 文件,还有 Library.mdf 文件,我们将在后面简要介绍此文件。如果文件夹中没有此文件,需要按下 Visual Studio 解决方案资源管理器工具栏中的“刷新”按钮。使用 Visual Studio 的优点是,可直接通过它对此文件以及其他 SQL Server Express 数据库文件执行您所需的任何操作。在解决方案资源管理器中双击 ASPNETDB.MDF 文件,在 Visual Studio Server Explorer 中打开该数据库文件。
您不仅可以使用数据库中包含的表,还可以使用数据库图表、视图、存储过程、函数、同义词、类型和程序集。该 ASPNETDB.MDF 文件屏幕快照显示使用用户登录信息和角色时所需的所有表,以及与用户关联的配置文件信息。
我们将不修改该 ASPNETDB.MDF 文件,因为它是要运行的 ASP.NET 引擎需要的一个文件。可以在该数据库文件中只添加所需的新表,并仅从该数据库文件处运行整个应用程序,但是,最佳做法是将您自定义的数据库操作从默认的 ASPNETDB.MDF 文件所执行的操作中分离出来。那么,接下来我们将介绍如何创建 Library.mdf 数据库文件。媒体共享库 (Media Share Library) 将使用该文件来存储有关应用程序所保存项目的所有信息,其中包括每个保存的项目是否处于借用状态。
构建 Library.mdf 文件
构建下一层媒体共享库 (Media Share Library) 数据层的方法是构建一个简单的数据库文件,用它来保存应用程序需要存储的所有底层数据。该数据库中实际存储的是什么?嗯,事实上用户需要存储自己的媒体库(DVD、CD、书籍等)以及有关项目借用状态的信息,如果您看过第一篇介绍初学者工具包的 ASP.NET Jumpstart 文章,就不难理解这个问题了。
要创建所需的数据库文件,在 Visual Studio 解决方案资源管理器中右键单击 App_Data 文件夹,在提供的菜单中选择 Add New Item。此操作将启动“添加新项目”对话框。选择该对话框中的 SQL 数据库作为创建应用程序所使用的文件类型。请确保将该文件命名为 Library.mdf。
一旦创建该文件,App_Data 文件夹中即出现新的 Library.mdf 文件,双击该文件可在 Visual Studio Server Explorer 中打开它,这一点与 ASPNETDB.MDF 文件一样。
要创建第一张表,只需右键单击服务器资源管理器中 Library.mdf 下的 Tables 文件夹,并在提供的菜单中选择 Add New Table 即可。您需要为本文的应用程序创建两张表。第一张表命名为 MediaTypes,它将处理媒体共享库 (Media Share Library) 应用程序所使用的自定义类别。请记住,库中存储的每个项目都需要以某种方式进行分类(例如 DVD、CD、书籍等),而且这些类别是根据 MediaTypes 表的内容动态生成的。MediaTypes 表是要创建的一张简单的表。
创建表时,只要提供有关列的一些简要信息,即可创建这些数据库的列。
在创建数据库中的信息表时,通常情况下比较合适的做法是用唯一的关键字标识表中的每一行。因此,MediaTypes 表将包含一个标题为 MediaTypeId 的列,因为要为每行定义一个绝对唯一的 ID 值,所以该列类型为 int,而且不允许 Null 值。但是这不适用于列定义。下一步,右键单击某行开头的灰色框,选择所提供菜单中的 Set Primary Key。然后,该行开头会出现一个黄色的关键字。除此之外,请确保创建的每个 ID 都用作标识符,并且每个 ID 都是唯一的。高亮显示某列,您将能够看到文档窗口中定义的列属性。在此属性窗格中设置标识说明 (Identity Specification),以便表明 ID 唯一且用于标识。
设置 MediaTypeId 列后,下一步是创建该表中的其他两列:MediaTypeName (nvarchar(50)) 和 MediaComments (nvarchar(MAX))。浏览该表时,不费吹灰之力就能辨别每列在本应用程序中的用途。如前所述,MediaTypeId 用作该表每行的标识符。MediaType 是应用程序实际呈现给最终用户的类别名,而且实际上应用程序根本不使用 MediaComments,它只是允许开发人员或数据库管理员按需为每个类别提供注释。
一旦表就绪,请按 CTRL+S 来保存表定义。然后会出现一个对话框,提示您为新表命名。请确保将该表命名为 MediaTypes。
创建 MediaTypes 表后,再创建下一张表,该表用于存储应用程序中保存的所有库项目。该表也指示这些项目是否为某人所借用,借用人是谁以及何时归还给所有者。
从该表定义中您会发现,某些数据项来源于应用程序所使用的其他表或数据库。例如,UserName 列存储的注册用户的用户名。该值最初是通过 ASP.NET 2.0 成员关系系统从 ASPNETDB.MDF 文件获取的。此外,MediaType 列只是存储了一个数字,该数字与前面创建的 MediaTypes 表所使用的某个唯一 ID 相关。
既然这两张表已经准备就绪,下面我们来介绍应用程序如何从这些表中提取并存储数据。下面继续介绍ASP.NET构建数据层。#p#
使用新的数据源服务器控件提取和发送数据
通过 .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 数据库文件中提取类别列表。
这是一个相当简单的 SqlDataSource 控件示例。与 ASP.NET 中的其他服务器控件一样,控件内必须首先设置一个 ID 值和 runat="server"。下一个要注意的重要项目是 ConnectionString 属性。该属性通过 <%$ ConnectionStrings:LibraryConnectionString %> 值指向 Web.config 文件中的一个位置。但是该值的含义没有直接点明,其真正表示的意思是使用的值需要从 Web.config 文件的 <ConnectionStrings> 部分提取,即使用名为 LibraryConnectionString 的特定 <add> 节点内的值。
创建 SqlDataSource 控件的 ConnectionString 属性后,还需要留意 SelectCommand 属性。该属性接收 Select TSQL 命令,这些命令用于提取 Library.mdf 数据库文件中特定表的数据。以本文为例,提取 MediaTypes 表的 MediaTypeName 和 MediaTypeId 列,按字母顺序进行排列后,再传递给本页的下拉列表控件。
将选定的数据绑定到服务器控件
设置好 ConnectionString 和 SelectCommand 属性后,即可将 SqlDataSource 控件绑定到页面上的一个或多个控件。然而,本文示例只是将 SqlDataSource 控件绑定到 DropDownList1 这一个控件。
下拉列表通过使用 DataSourceID 属性将自身绑定到 SqlDataSource1 控件的输出,所有数据绑定服务器控件均可使用该属性。提供给 DataSourceID 属性的值就是 SqlDataSource 控件(本示例的 SqlDataSource1)中使用的 ID 值。下拉列表在该处有特殊的可用性需求 — 在文本字段和可选值字段中放置一个值。
我们将分别使用 MediaTypeId 和 MediaTypeName 的值作为 <option> 的值和显示给最终用户的值。DropDownList 服务器控件的使用是通过 DataTextField 和 DataValueField 属性的使用来完成的。
由于 DropDownList1 现在绑定到 SqlDataSource1 控件的输出,因此页面将动态地提取输出结果。
选择带有参数的数据
有时您必须选择基于某一特定参数的数据,即所谓的参数化查询。例如,想要一份客户数据库中所有加拿大客户的列表。这即是一个参数化查询。您不想要所有客户的列表,这样的列表繁杂冗长。如果将某个值(本示例为 Canada)传递给 Select 语句,将返回一个经过筛选的结果集。
Media Share Library Starter Kit 中的 MainLibrary.aspx 页上还有一个 GridView 控件,该控件由另一个 SqlDataSource 控件 (SqlDataSource2) 驱动,后者需要参数化查询来获取结果。本示例的 GridView 实际上由最终用户通过选择下拉列表控件(上文图 10 所示)的项目来控制。如果最终用户选择下拉列表中的 DVD,那么在 Select 语句中将使用该值,GridView 控件只显示返回的 DVD 类别的库项目。当然,GridView 中显示的数据完全由 SqlDataSource2 控件控制。
观察该 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 服务器控件中的值关联起来。
要从页面上的 DropDownList1 控件获取 @MediaType 所使用的值,ControlParameter 控件需要通过属性 ControlID 将两者关联起来。提供给 ControlID 属性的值必须为关联控件的 ID 属性值。后面的属性 Name 指向参数化查询中的真正变量名。这一点很重要,因为需要定义的 Select 参数可能不止一个。虽然本示例仅有一个参数,但是这种关联仍然是必要的。因为我们使用的是一个下拉列表,所以需要定义 SqlDataSource 控件要使用下拉列表的哪一个属性。例如,在关联一个下拉列表控件时,可以获得诸如 SelectedIndex、SelectedItem 或 SelectedValue 属性的值。因此,需要声明要获取的属性。在 SqlDataSource 控件中定义的最后一个属性是 Type 属性。就是在这里对控件的值进行真正意义上的类型转换(本示例转换为 Int32)。
上述定义完成后,您就可以使用下拉列表控件来驱动 SqlDataSource 控件,并使用通过它提取的 Library.mdf 数据库文件中 Media 表的值了。
以编程方式定义参数
除了声明方式之外,还有另一种选择,下面介绍以编程方式定义参数。如上文所示,与直接在 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 命令中赋了值
上面定义的声明参数列表只声明了 @Borrower 和 @OnLoan 参数。列表中没有 @DueDate 参数,这是因为该参数值会随服务器当前日期/时间的变化而动态改变。这也是该参数需要以声明方式定义的原因。
- SqlDataSource1.SelectParameters.Add("DueDate",
- TypeCode.DateTime, DateTime.Now.ToString())
在该行代码中,SqlDataSource 控件通过 Add() 方法添加一个 SelectParameter,Add() 方法要求提供变量名、类型和值,即本例中的 DueDate。对于该变量的值,我们只需提供服务器当前日期/时间即可。
到此为止,SqlDataSource 控件已经具备 Select 命令需要的所有三个参数。
尽管本文说明的是 Select 命令的使用,但是不要忘了您还可以将此类功能用于 Delete、Insert 和 Update 命令。
小结
本文为您介绍了ASP.NET构建数据层。首先,我们介绍了在 SQL Server Express Edition 中如何直接构建一个新的数据库和表,然后介绍了 ASP.NET 2.0 数据源控件以及如何使用这些控件从创建的数据文件中提取所需的数据。ASP.NET Jumpstart将介绍如何使用 ASP.NET 2.0 提供的一些激动人心的新控件。希望您能享受其中的乐趣,并祝您编程愉快!
【编辑推荐】