导言
作为web开发人员,我们的生活围绕着数据操作。我们建立数据库来存储数据,写编码来访问和修改数据,设计网页来采集和汇总数据。本文是研究在ASP.NET 2.0中实现这些常见的数据访问模式之技术的长篇系列教程的第一篇。我们将从创建一个软件框架开始,这个框架的组成部分包括一个使用强类型的DataSet的数据访问层(DAL),一个实施用户定义的业务规则的业务逻辑层(BLL),以及一个由共享页面布局的ASP.NET网页组成的表现层。在打下这个后端的基础工作之后,我们将开始转向报表,示范如何显示,汇总,采集,和验证web 应用的数据。这些教程旨在简明扼要,使用了许多屏幕截图,提供了按步就 班(step-by-step)的指导,带你经历这个开发过程。每个教程都有C# 版和VB版,并且附有涉及的完整的编码的下载。(这第一个教程比较长,但以后其他的教程将以更容易消化的篇幅推出。)
在这些教程中,我们将使用置于App_Data 目录内的微 软SQL Server 2005 Express版的Northwind数据库。除了数据库文件外,App_Data目录还带有用于创建数据库的SQL脚本,万一你想使用别的数据库版本的话。如果你愿意的话,你也可以直接从微软下载这些脚本。如果你使用别的SQL Server版本的Northwind数据库的话,你需要更新Web.config文件中的NORTHWNDConnectionString设置。本教程中的web应用是个基于文件系统的网站项目,是使用Visual Studio 2005 专业版建立起来的。但是,所有的教程都可以在Visual Studio 2005的免费版本Visual Web Developer中运行。
在这个教程里,我们将从头开始,先创建一个数据访问层(DAL),然后在第二个教程里创建一个业务逻辑层(BLL),在第三个教程里设计页面布局和导航。以后的教程将建立在这三个教程的基础之上。在第一个教程里,我们要讨论的内容多多,所以,请打开Visual Studio,让我们动起手来!
第一步:创建一个Web项目,配置数据库连接
在我们开始创建数据访问层(DAL)之前,我们首先需要创建一个网站,以及建立一个数据库。我们从创建一个基于文件系统的ASP.NET 网站开始。次序如下,打开文件(File)菜单,选择新的网站 (New Web Site),系统会显示一个新网站对话框,选择ASP.NET网站模板(Web Site template),设置定 位(Location)列表的选项为文件系统( File System),然后选这一个放置这个网站的文件夹,然后选择编程语 言为C#。
图 1: 创建一个基于文件系统的网站
Visual Studio会为你生成一个新的网站,同时生成一个名为Default.aspx的网页,和一 个App_Data文件夹。
网站生成之后,下一步是在Visual Studio的服务器资源管理器(Server Explorer)里为你的数据库添加一个引 用(reference)。把一个数据库添加到服务器资源管理器之后,你就能在Visual Studio环境里添加数据表,存 储过程,视图等等。你也能查看数据库里的数据,手工或用查询生成器(Query Builder)的图形界面建立你自己的查询语句。此外,当我们为DAL创建强类型的DataSet时,我们需要把Visual Studio指向作为DataSet数据源的目标数据库。虽然我们可以在适当时候提供所涉及的数据库连接信息,但假如我们预 先在服务器资源管理器里注册这些数据库的话,Visual Studio会自动把这些数据库填充到一个下拉列表中去 。
把Northwind数据库添加到服务器资源管理器中去的步骤取决于你想使用放置在App_Data文件夹 里的SQL Server 2005 Express 版本数据库,还是你想使用已经建立好了的SQL Server 2000或2005 数据库服 务器。
使用置于App_Data文件夹中的数据库
如果你没有可连接的SQL Server 2000 或2005服务器,或者你就是想避免给数据库服务器添加数据库,你可以使用SQL Server 2005 Express版的Northwind数据库,该数据库位于下载源码中的App_Data文件夹里(NORTHWND.MDF)。
置于App_Data文件夹里的数据库会被自动添加到服务器资源管理器中。假设你已经在你的机器上安装了SQL Server 2005 Express版本,那么你应该在服务器资源管理器中看到一个名为NORTHWND.MDF的节点,你可以将这个节点扩展开来,浏览其中的数据表,视图,存储过程等等 (参考图2)。
App_Data文件夹还可以放置微软的Access.mdb数据库文件,跟SQL Server 的数 据库文件类似,这些Access文件会被自动地添加到服务器资源管理器中。如果你不想用任何SQL Server数据库,那么你总归可以下载微软Access版本的Northwind 数据库文件,然后将其放置于App_Data文件夹中。但记住,Access数据库没有SQL Server那么多功能,而且它并不是设计来在网站情形下使用的。此外,在后面几个教程里将用到Access数据库不支持的数据库层次的功能。
连接到微软SQL Server 2000或2005数据库服务器中的数据库
或者,你也可以连接到安装在数据库服务器上的Northwind数据库。假如数据库服务器上尚未安装Northwind数据库的话,你首先必须运行本教程下载文件中的安装脚本来把数据库添加到数据库服务器上去,或者你也可以从微软网站上直接下载SQL Server 2000的Northwind数据库以及安装脚本。
安装数据库完毕之后,去Visual Studio中的服务器资源管理器,在数据连接(Data Connections)节点上按右鼠标,选择“添加连接(Add Connection)”。如果你看不到服务器资源管理器,去菜单“查看(View)”点击 “服务器资源管理器”,或者按组合键Ctrl+Alt+S来打开服务器资源管理器。这会打开添加连接的对话框,在这上面,你可以设置需要连接的服务器,认证信息,以及数据库名字。在你成功配置数据库连接信息,按OK按钮之后,数据库就会被添加成数据连接节点之下的一个节点。然后,你就可以扩展数据库节点来浏览数据表,视图,存储过程等等。
图 2: 添加一个到你的数据库服务器上的Northwind数据库的连接
第二步:创建一个数据访问层
与数据打交道时,一种做法是把跟数据相关的逻辑直接放在表现层中(在一个web应用里,ASP.NET网页构成了表现层)。其形式一般是在ASP.NET 网页的编码部分写ADO.NET 编码或者在标识符部 分使用SqlDataSource控件。在这两种形式里,这种做法都把数据访问逻辑与表现层紧密耦合起来了。但推荐 的做法是,把数据访问逻辑从表现层分离开来。这个分开的层被称作是数据访问层,简写为DAL,一般是通过 一个单独的类库项目来实现的。这种分层框架的好处在很多文献里都有阐述(详见本教程最后的“附加读物”里 的资源),在本系列中我们将采用这种方法。
跟底层数据源相关的所有编码,譬如建立到数据库的连接,发出SELECT,INSERT ,UPDATE,和DELETE命令等的编码,都应该放置在DAL中。表现层不应该包含对 这些数据访问编码的任何引用,而应该调用DAL中的编码来作所有的数据访问请求。数据访问层包含访问底层数据库数据的方法。譬如,Northwind数据库 中,有Products和Categories两个表,它们记录了可供销售的产品以及这些产品 所属的分类。在我们的DAL中,我们将有下面这样的方法:
GetCategories(), 返回所有分类的信息 GetProducts(), 返回所有产品的信息 GetProductsByCategoryID(categoryID), 返回属于指定分类的所有产品的信 息 GetProductByProductID(productID), 返回指定产品的信息
这些方法,被调用后,将连接到数据库,发出合适的查询,然后返回结果。我们如何返回这些结果是很重要的 。这些方法可以直接返回数据库查询填充的DataSet 或者DataReader ,但理想的办法是把这些结果以强类 型对象的形式返回。一个强类型的对象,其schema是编译时严格定义好的,而相比之下,弱类型的对象, 其schema在运行时之前是未知的。
譬如,DataReader和普通的DataSet是弱类型对象,因为它们的schema是被用来填充它们的数据库查询返回的字段来定义的。要访问弱类型DataTable中的一个特定字段,我们需要用这样的句法:DataTable.Rows[index] ["columnName"]。这个例子中的DataTable的弱类型性质表现在于,我们需要通过一个字符串或序号索引来访问字段名称。而在另一个方面,一个强类型的DataTable,它的所有的字段都是通过属性的形式来实现的 ,访问的编码就会象这样:DataTable.Rows[index].columnName。
要返回强类型对象,开发人员可以创建自定义业务对象,或者使用强类型的DataSet。开发人员实现的业务对 象类,其属性往往是对相应的底层数据表的字段的映射。而一个强类型的DataSet,则是Visual Studio基于数 据库schema为你生成的一个类,其成员的类型都是由这个schema决定的。强类型的DataSet本身,是由继承 于ADO.NET中DataSet,DataTable,和DataRow类的子类组成的。除了强类型的DataTable外,强类型的DataSet现在还包括TableAdapter类,这些类包含了填充DataSet中的DataTable和把 DataTable的改动传回数据库的各种方法。
注意:想了解使用强类型DataSet比之业务对象的优缺点的更多信息,请参考设 计数据层组件以及在层间传输数据一文。
在这些教程的架构里,我们将使用强类型的DataSet。图3示范说明了使用强类型的DataSet之应用程序的不 同层间的流程(workflow)。
图 3: 把所有的数据访问编码委托给DAL
创建强类型的DataSet和Table Adapter
我们开