Scott Mitchell 的ASP.NET 2.0数据教程之一: 创建一个数据访问层
|
在ASP.NET 2.0中操作数据::创建一个数据访问层导言作为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中运行。 第一步:创建一个Web项目,配置数据库连接在我们开始创建数据访问层(DAL)之前,我们首先需要创建一个网站,以及建立一个数据库。我们从创建一个基于文件系统的ASP.NET 网站开始。次序如下,打开文件(File)菜单,选择新的网站 (New Web Site),系统会显示一个新网站对话框,选择ASP.NET网站模板(Web Site template),设置定 位(Location)列表的选项为文件系统( File System),然后选这一个放置这个网站的文件夹,然后选择编程语 言为C#。 图 1: 创建一个基于文件系统的网站 Visual Studio会为你生成一个新的网站,同时生成一个名为 网站生成之后,下一步是在Visual Studio的服务器资源管理器(Server Explorer)里为你的数据库添加一个引 用(reference)。把一个数据库添加到服务器资源管理器之后,你就能在Visual Studio环境里添加数据表,存 储过程,视图等等。你也能查看数据库里的数据,手工或用查询生成器(Query Builder)的图形界面建立你自己的查询语句。此外,当我们为DAL创建强类型的DataSet时,我们需要把Visual Studio指向作为DataSet数据源的目标数据库。虽然我们可以在适当时候提供所涉及的数据库连接信息,但假如我们预 先在服务器资源管理器里注册这些数据库的话,Visual Studio会自动把这些数据库填充到一个下拉列表中去 。 把Northwind数据库添加到服务器资源管理器中去的步骤取决于你想使用放置在 使用置于 如果你没有可连接的SQL Server 2000 或2005服务器,或者你就是想避免给数据库服务器添加数据库,你可以使用SQL Server 2005 Express版的Northwind数据库,该数据库位于下载源码中的 置于
连接到微软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,一般是通过 一个单独的类库项目来实现的。这种分层框架的好处在很多文献里都有阐述(详见本教程最后的“附加读物”里 的资源),在本系列中我们将采用这种方法。 跟底层数据源相关的所有编码,譬如建立到数据库的连接,发出
这些方法,被调用后,将连接到数据库,发出合适的查询,然后返回结果。我们如何返回这些结果是很重要的 。这些方法可以直接返回数据库查询填充的DataSet 或者DataReader ,但理想的办法是把这些结果以强类 型对象的形式返回。一个强类型的对象,其schema是编译时严格定义好的,而相比之下,弱类型的对象, 其schema在运行时之前是未知的。 譬如,DataReader和普通的DataSet是弱类型对象,因为它们的schema是被用来填充它们的数据库查询返回的字段来定义的。要访问弱类型DataTable中的一个特定字段,我们需要用这样的句法: 要返回强类型对象,开发人员可以创建自定义业务对象,或者使用强类型的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我们开始创建我们的DAL,先给我们的项目添加一个强类型的DataSet。做法如下,在解决方案管理器里的项目 节点上按右鼠标,选择“添加新项(Add a New Item)”。在模板列单里选择DataSet,将其命名 为 图 4: 给你的项目添加一个新的DataSet 在点击“添加(Add)”按钮后,Visual Studio会问我们是否将DataSet添加到App_Code文件夹中,选择“Yes” 。然后Visual Studio会显示强类型的DataSet的设计器,同时会启动TableAdapter配置向导,允许你给你的强 类型DataSet添加第一个TableAdapter。 强类型的DataSet 起了强类型对象的集合的作用,它由强类型DataTable实例组成,每个强类型DataTable又进 而由强类型的DataRow实例组成。我们将为这个教程系列要用到的每个数据表建立一个对应的强类型DataTable 。让我们开始吧,先为 记住,强类型的DataTable并不包括如何访问对应底层的数据表的任何信息。要获取用来填充DataTable的数据 ,我们使用TableAdapter类,它提供了数据访问层的功能。对于我们的 TableAdapter配置向导首先要你选择使用哪个数据库。下拉框里列出了服务器资源管理器内的那些数据库。如 果你预先没有把Northwind数据库添加到服务器资源管理器里去的话,这时你可以点击新连接按钮来添加。 图 5: 在下拉框里选择Northwind数据库 选择好数据库后,按“下一步”按钮,向导会问你是否想在 图6: 在 接下来,我们需要定义第一个强类型的DataTable的schema,同时为用来填充强类型DataSet的TableAdapter类 提供第一个方法。这两步可以通过建立一个返回对应于DataTable的数据表的字段的查询同时完成。在向导的 最后,我们将为这个查询对应的方法命名。完成后,这个方法可以在表现层调用,它会执行设置好的查询,进 而填充一个强类型的DataTable。 开始定义SQL查询之前,我们必须首先选择我们想要TableAdapter执行查询的方式。我们可以直接用ad-hoc的SQL语句,或建立一个新的存储过程,或使用现存的存储过程。在这些教程里,我们将使用ad-hoc的SQL语句。请参考Brian Noyes的文章“使用Visual Studio 2005 DataSet 设计器创建数据访问层”中使用存储过程的例子。 图 7: 用SQL语句查询数据 至此,我们可以手工输入SQL查询。当生成TableAdapter的第一个方法时,你一般想要让你的查询返回那些需 要在对应的DataTable中存放的字段。我们可以建立一个从 图 8: 在文本框里输入SQL查询 或者,我们可以使用查询生成器(Query Builder),用图形界面来构造查询,如图9所示。 图 9: 通过查询编辑器生成查询 在生成查询之后,在移到下一屏之前,点击“高级选项(Advanced Options)”按钮。在网站项目里,在默认 情形下,“生成插入,更新,删除语句”是唯一已被选中的选项。如果你在类库项目或Windows项目里运行这个 向导的话,“采用优化的并发控制(optimistic concurrency)”选项也会被选中。现在先别选“采用优化的并发 控制”这个选项。在以后的教程里我们会详细讨论优化的并发控制。 图 10: 只选“生成插入,更新和删除语句”这个选项 在核实高级选项后,按“下一步(Next)”按钮转到最后一屏。在这里,配置向导会问我们要给TableAdapter选择添加什么方法。填充数据有两种模式:
你可以让TableAdapter实现其中一个模式或者同时实现两个模式。你也可以重新命名这里提供的这些方法。让 我们对两个复选框的选项不做改动,虽然我们在这些教程里只需要使用后面这个模式。同时,让我们把那个很 一般性的 这最后一个复选框,“生成DB直接方法(GenerateDBDirectMethods)”,如果选了的话,会为TableAdapter自动生 成 图 11: 把方法名字从 按“完成”按钮结束向导。在向导关闭后,我们回到DataSet设计器中,它会显示我们刚创建的DataTable。你可 以看到 图 12: 至此,我们生成了含有单一DataTable类(
这段编码不要求我们写一行的跟数据访问有关的编码。我们不需要生成任何ADO.NET类的实例,我们不需要 指明任何连接字符串,任何SQL查询语句,或者任何存储过程。TableAdapter为我们提供了底层的数据访问编 码! 这个例子里的每个对象都是强类型的,允许Visual Studio提供IntelliSense帮助以及编译时类型检查。最棒 的是,从TableAdapter 返回的DataTable可以直接绑定到ASP.NET数据Web 控件上去,这样的控件包 括GridView,DetailsView,DropDownList,CheckBoxList,以及另外几个控件。下面这个例子示范只要 在 AllProducts.aspx
AllProducts.aspx.cs
图 13: 显示在GridView里的产品列单 这个例子要求我们在ASP.NET网页的Page_Load事件处理函数里,写三行编码。在以后的教程里,我们将讨 论使用ObjectDataSource,用声明的方式来从DAL中获取数据。用ObjectDataSource的话,我们一行编码都不 用写,而且还能得到分页和排序支持呢! 第三步:给数据访问层添加参数化的方法至此,ProductsTableAdapter只有一个方法, 让我们来添加一个
图 14: 在TableAdapter上按右鼠标,选择“添加查询” 向导首先会问我们是否要通过一个ad-hoc SQL语句还是生成一个新存储过程或者使用现有存储过程来访问 数据库。让我们还是选择使用SQL 语句。接着,向导会问我们使用什么类型的SQL查询。因为我们想返回属于 指定分类的所有产品,我们需要写一个返回数据行的 图 15: 选择生成一个返回数据行的 下一步是定义用于访问数据的SQL查询语句。因为我们只想返回属于指定分类的那些产品,我重 用 图 16: 输入一个只返回指定分类的产品的查询 在最后一步,我们可以选择使用何种数据访问模式,还可以定制生成的方法的名字。对应于Fill 模式,让我们把名字改成 图 17: 为TableAdapter的方法选择名字 在结束向导后,DataSet设计器包含了这些新的TableAdapter的方法。
图18: 通过分类来查询产品 花点时间用同样的手法添加一个 这些参数化的查询可以在DataSet设计器里直接测试。在TableAdapter中的方法上按右鼠标,然后选择“预 览数据(Preview Data)”。接着,输入对应参数的值,然后按“预览(Preview)”。 图19: 属于饮料(Beverages)类的那些产品列单 通过我们的DAL中的 Beverages.aspx
Beverages.aspx.cs
图 20: 属于Beverages(饮料)类的所有产品显示 |
||||||||||||||||||||




















一共有 0 条评论