【Asp.net精品源码栏目提醒】:网学会员鉴于大家对Asp.net精品源码十分关注,论文会员在此为大家搜集整理了“【精品】.net web开发数据链接 - 其它资料”一文,供大家参考学习
在
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 专业版建立起来的。
但是,所有的教程都可以在 VisualStudio 2005的免费版本 Visual Web Developer 中运行。
在这个教程里,我们将从头开始,先创建一个数据访问层DAL,然后在第二个教程里创建一个业务逻辑层BLL,在第三个教程里设计页面布局和导航。
以后的教程将建立在这三个教程的基础之上。
在第一个教程里,我们要讨论的内容多多,所以,请打开 Visual Studio,让我们动起手来!第一步:创建一个 Web 项目,配置数据库连接在我们开始创建数据访问层DAL之前,我们首先需要创建一个网站, 以及建立一个数据库。
我们从创建一个基于文件系统的
ASP.NET 网站开始。
次序如下,打开文件File菜单,选择新的网站 New Web Site,系统会显示一个新网站对话框,选择
ASP.NET 网站模板WebSite 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 版本数据库,还是你想使用已经建立好了的 SQLServer 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 中的服务器资源管理器,在数据连接DataConnections节点上按右鼠标,选择“添加连接Add Connection”。
如果你看不到服务器资源管理器,去菜单“查看View”点击 “服务器资源管理器”,或者按组合键 CtrlAltS 来打开服务器资源管理器。
这会打开添加连接的对话框,在这上面,你可以设置需要连接的服务器,认证信息,以及数据库名字。
在你成功配置数据库连接信息,按 OK 按钮之后,数据库就会被添加成数据连接节点之下的一个节点。
然后,你就可以扩展数据库节点来浏览数据表,视图,存储过程等等。
图 2: 添加一个到你的数据库服务器上的 Northwind 数据库的连接第二步:创建一个数据访问层与数据打交道时,一种做法是把跟数据相关的逻辑直接放在表现层中在一个 web 应用里,
ASP.NET 网页构成了表现层。
其形式一般是在
ASP.NET 网页的编码部分写 ADO.NET 编码或者在标识符部 分使用 SqlDataSource 控件。
在这两种形式里,这种做法都把数据访问逻辑与表现层紧密耦合起来了。
但推荐 的做法是,把数据访问逻辑从表现层分离开来。
这个分开的层被称作是数据访问层,简写为 DAL,一般是通过 一个单独的类库项目来实现的。
这种分层框架的好处在很多文献里都有阐述详见本教程最后的“附加读物”里 的资源,在本系列中我们将采用这种方法。
跟底层数据源相关的所有编码,譬如建立到数据库的连接,发出 SELECT,INSERT ,UPDATE,和 DELETE 命令等的编码,都应该放置在 DAL 中。
表现层不应该包含对 这些数据访问编码的任何引用,而应该调用 DAL 中的编码来作所有的数据访问请求。
数据访问层包含访问底层数据库数据的方法。
譬如, 有 Northwind 数据库 中, Products 和 Categories两个表,它们记录了可供销售的产品以及这些产品 所属的分类。
在我们的 DAL 中,我们将有下面这样的方法: GetCategories 返回所有分类的信息 GetProducts 返回所有产品的信息 GetProductsByCategoryIDcategoryID 返回属于指定分类的所有产品的信 息 GetProductByProductIDproductID 返回指定产品的信息这些方法,被调用后,将连接到数据库,发出合适的查询,然后返回结果。
我们如何返回这些结果是很重要的 。
这些方法可以直接返回数据库查询填充的 DataSet 或者DataReader ,但理想的办法是把这些结果以强类 型对象的形式返回。
一个强类型的对象,其 schema 是编译时严格定义好的,而相比之下,弱类型的对象, 其 schema 在运行时之前是未知的。
譬如,DataReader 和普通的 DataSet 是弱类型对象,因为它们的 schema 是被用来填充它们的数据库查询返回的字段来定义的。
要访问弱类型 DataTable 中的一个特定字段, 我们需要用这样的句法:DataTable.Rowsindex quotcolumnNamequot。
这个例子中的 DataTable 的弱类型性质表现在于,我们需要通过一个字符串或序号索引来访问字段名称。
而在另一个方面,一个强类型的 DataTable,它的所有的字段都是通过属性的形式来实现的 ,访问的编码就会象这样:DataTable.Rowsindex.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我们开始创建我们的 DAL,先给我们的项目添加一个强类型的 DataSet。
做法如下,在解决方案管理器里的项目 节点上按右鼠标,选择“添加新项Add a New Item”。
在模板列单里选择 DataSet,将其命名 为 Northwind.xsd。
图 4: 给你的项目添加一个新的 DataSet在点击“添加Add”按钮后,Visual Studio 会问我们是否将 DataSet 添加到 App_Code 文件夹中,选择“Yes” 。
然后 Visual Studio 会显示强类型的 DataSet 的设计器,同时会启动TableAdapter 配置向导,允许你给你的强 类型 DataSet 添加第一个 TableAdapter。
强类型的 DataSet 起了强类型对象的集合的作用,它由强类型 DataTable 实例组成,每个强类型 DataTable 又进 而由强类型的 DataRow 实例组成。
我们将为这个教程系列要用到的每个数据表建立一个对应的强类型 DataTable 。
让我们开始吧,先为 Products 表建立一个 DataTable。
记住,强类型的 DataTable 并不包括如何访问对应底层的数据表的任何信息。
要获取用来填充 DataTable 的数据 ,我们使用 TableAdapter 类,它提供了数据访问层的功能。
对于我们的 Products DataTable, 相应的 TableAdapter 类将包 括 GetProducts和GetProductByCategoryIDcategoryID等方法,而我 们将在表现层调用这些方法。
DataTable 的作用是在分层间传输数据。
TableAdapter 配置向导首先要你选择使用哪个数据库。
下拉框里列出了服务器资源管理器 如内的那些数据库。
果你预先没有把 Northwind 数据库添加到服务器资源管理器里去的话,这时你可以点击新连接按钮来添加。
图 5: 在下拉框里选择 Northwind 数据库选择好数据库后,按“下一步”按钮,向导会问你是否想在 Web.config 文件里存放连接字符串。
将连接字符串存放在 Web.config 文件里,你可以避免把连接字符串硬写在TableAdapter 类的编 码中,如果将来连接字符串信息改动的话,这种做法会极大地简化要做的编码改动。
如果你选择在配置文件存 放连接字符串,连接字符串将被置放于ltconnectionStringsgt段落中,这个段落可以被加密来提高安全,也可以通过 IIS 图形界面管理工具中的新的
ASP.NET 2.0属性页来修改。
当然这个工具更适于管理员。
图6: 在 Web.config 中存放连接字符串接下来,我们需要定义第一个强类型的 DataTable 的 schema,同时为用来填充强类型DataSet 的 TableAdapter 类 提供第一个方法。
这两步可以通过建立一个返回对应于DataTable 的数据表的字段的查询同时完成。
在向导的 最后,我们将为这个查询对应的方法命名。
完成后,这个方法可以在表现层调用,它会执行设置好的查询,进 而填充一个强类型的 DataTable。
开始定义 SQL 查询之前,我们必须首先选择我们想要 TableAdapter 执行查询的方式。
我们可以直接用 ad-hoc 的 SQL 语句,或建立一个新的存储过程,或使用现存的存储过程。
在这些教程里, 请参考 Brian Noyes 的文章“使用 Visual Studio 我们将使用 ad-hoc 的 SQL 语句。
2005 DataSet 设计器创建数据访问层”中使用存储过程的例子。
图 7: 用 SQL 语句查询数据至此,我们可以手工输入 SQL 查询。
当生成 TableAdapter 的第一个方法时,你一般想要让你的查询返回那些需 要在对应的 DataTable 中存放的字段。
我们可以建立一个从 Products表里返回所有字段,所有数 据行的查询来达到我们的目的:图 8: 在文本框里输入 SQL 查询或者,我们可以使用查询生成器Query Builder,用图形界面来构造查询,如图9所示。
图 9: 通过查询编辑器生成查询在生成查询之后,在移到下一屏之前,点击“高级选项Advanced Options”按钮。
在网站项目里,在默认 情形下,“生成插入,更新,删除语句”是唯一已被选中的选项。
如果你在类库项目或 Windows 项目里运行这个 向导的话,“采用优化的并发控制optimisticconcurrency”选项也会被选中。
现在先别选“采用优化的并发 控制”这个选项。
在以后的教程里我们会详细讨论优化的并发控制。
图 10: 只选“生成插入,更新和删除语句”这个选项在核实高级选项后,按“下一步Next”按钮转到最后一屏。
在这里,配置向导会问我们要给TableAdapter 选择添加什么方法。
填充数据有两种模式: 填充 DataTable – 这个做法会生成一个方法,该方法接受一个 DataTable 的参数, 基于查询的结果 填充这个 DataTable。
譬如,ADO.NET 的 DataAdapter 类就是在它的 Fill方法中实现这个模式的 。
返回 DataTable – 这个做法会生成一个方法,该方法会创建并填充一个 DataTable, 然后将 其作为方法的返回值。
你可以让 TableAdapter 实现其中一个模式或者同时实现两个模式。
你也可以重新命名这里提供的这些方法。
让 我们对两个复选框的选项不做改动,虽然我们在这些教程里只需要使用后面这个模式。
同时,让我们把那个很 一般性的 GetData 方法名改成 GetProducts。
这最后一个复选框,“生成 DB 直接方法GenerateDBDirectMethods”,如果选了的话,会为 TableAdapter 自动生 成 Insert,Update,和 Delete方法。
如果你不选这个选项 的话,所有的更新都需要通过 TableAdapter 唯一的 Update方法来实现,该方法接受一个强类型的 DataSet,或者一个 DataTable,或者单个 DataRow,或者一个 DataRow 数组。
假如你 在图9所示的高级属性里把“生成添加,更新和删除语句”的选项去掉的话,这个复选框是不起作用的。
让我们 保留这个复选框的选项。
图 11: 把方法名字从 GetData 改成 GetProducts按“完成”按钮结束向导。
在向导关闭后,我们回到 DataSet 设计器中,它会显示我们刚创建 你的 DataTable。
可 以看到 Products DataTable 的字段列单ProductID ProductName 等,还有 ProductsTableAdapter 的 Fill和 GetProducts方法 。
图 12: Products DataTable 和 ProductsTableAdapter 被添加到强类 型 DataSet 中至此,我们生成了含有单一 DataTable 类Northwind.Products的强类型 DataSet 以及一个含 有 GetProducts方法的强类 型 DataAdapter 类NorthwindTableAdapters.ProductsTableAdapter。
通过这些对象可以用下 列编码来获取所有产品的列单:C NorthwindTableAdapters.ProductsTableAdapterproductsAdapter newNorthwindTableAdapters.ProductsTableAdapterNorthwind.ProductsDataTable productsproducts productsAdapter.GetProductsforeach Northwind.ProductsRow productRow in products Response.WritequotProduct: quot productRow.ProductName quotltbr /gtquot这段编码不要求我们写一行的跟数据访问有关的编码。
我们不需要生成任何 ADO.NET 类的实例,我们不需要 指明任何连接字符串,任何 SQL 查询语句,或者任何存储过程。
TableAdapter 为我们提供了底层的数据访问编 码!这个例子里的每个对象都是强类型的,允许 Visual Studio 提供 IntelliSense 帮助以及编译时类型检查。
最棒 的是,从 TableAdapter 返回的 DataTable 可以直接绑定到
ASP.NET 数据Web 控件上去, 这样的控件包 括 GridView,DetailsView,DropDownList,CheckBoxList,以及另外几个控件。
下面这个例子示范只要 在 Page_Load 事件处理函数里添加短短的三行编码就能将从 GetProducts方法返 回的 DataTable 绑定到一个 GridView 上去。
AllProducts.aspx:
ASP.NET lt Page LanguagequotCquot AutoEventWireupquottruequot CodeFilequotAllProducts.aspx.csquotInheritsquotAllProductsquot gtltDOCTYPE html PUBLIC quot-//W3C//DTD XHTML 1.0Transitional//ENquot quothttp://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtdquotgtlthtml xmlnsquothttp://www.w3.org/1999/xhtmlquot gtlthead runatquotserverquotgt lttitlegtView All Products in a GridViewlt/titlegt ltlink hrefquotStyles.cssquot _fcksavedurlquotquotStyles.cssquotquot _fcksavedurlquotquotStyles.cssquotquot_fcksavedurlquotquotStyles.cssquotquot _fcksavedurlquotquotStyles.cssquotquot _fcksavedurlquotquotStyles.cssquotquotrelquotstylesheetquot typequottext/cssquot /gtlt/headgtltbodygt ltform idquotform1quot runatquotserverquotgt ltdivgt lth1gt All Productslt/h1gt ltpgt ltasp:GridView IDquotGridView1quot runatquotserverquot CssClassquotDataWebControlStylequotgt ltHeaderStyle CssClassquotHeaderStylequot /gt ltAlternatingRowStyle CssClassquotAlternatingRowStylequot /gt lt/asp:GridViewgt ampnbsplt/pgt lt/divgt lt/formgtlt/bodygtlt/htmlgtAllProducts.aspx.cs:C using Systemusing System.Datausing System.Configurationusing System.Collectionsusing System.Webusing System.Web.Securityusing System.Web.UIusing System.Web.UI.WebControlsusing System.Web.UI.WebControls.WebPartsusing System.Web.UI.HtmlControlsusing NorthwindTableAdapterspublic partial class AllProducts : System.Web.UI.Page protected void Page_Loadobject sender EventArgs e ProductsTableAdapter productsAdapter new ProductsTableAdapter GridView1.DataSource productsAdapter.GetProducts GridView1.DataBind 图 13: 显示在 GridView 里的产品列单这个例子要求我们在
ASP.NET 网页的 Page_Load 事件处理函数里,写三行编码。
在以后的教程里,我们将讨 论使用 ObjectDataSource,用声明的方式来从 DAL 中获取数据。
用ObjectDataSource 的话,我们一行编码都不 用写,而且还能得到分页和排序支持呢!第三步:给数据访问层添加参数化的方法至此,ProductsTableAdapter 只有一个方法,GetProducts,它返回数据库里的所有产品。
能够操作所有的产品当然有用, 但很多时候我们想要获取关于一个指定产品的信息,或者属于某个特 定分类的所有产品。
要想给我们的数据访问层添加这样的功能,我们可以给TableAdapter 添加参数化的方法。
让我们来添加一个 GetProductsByCategoryIDcategoryID方法。
为给 DAL 添加新的 方法,让我们回到 DataSet 设计器,在 ProductsTableAdapter 上按右鼠标,然后选择“添加查 询Add Query”。
图 14: 在 TableAdapter 上按右鼠标,选择“添加查询”向导首先会问我们是否要通过一个 ad-hoc SQL 语句还是生成一个新存储过程或者使用现有存储过程来访问 数据库。
让我们还是选择使用 SQL 语句。
接着,向导会问我们使用什么类型的 SQL 查询。
因为我们想返回属于 指定分类的所有产品,我们需要写一个返回数据行的 SELECT 语句。
图 15: 选择生成一个返回数据行的 SELECT 语句下一步是定义用于访问数据的 SQL 查询语句。
因为我们只想返回属于指定分类的那些产品,我重 用 GetProducts里的 SELECT 语句,但添加了一个 WHERE 子 句:WHERECategoryID CategoryID。
其中的CategoryID 参数 向 TableAdapter 配置向导表示我们正在生成的方法将需要一个对应类即,可为 null-nullable 的整数的输入 参数。
图 16: 输入一个只返回指定分类的产品的查询在最后一步,我们可以选择使用何种数据访问模式,还可以定制生成的方法的名字。
对.
上一篇:
基于 NET的B
下一篇:
小学英语作文:讨厌的蟑螂(双语)