作范文网
当前位置:首页 » 使用LINQ技术操作数据库 » 正文

使用LINQ技术操作数据库


ASP.NET 应用程序开发技术学习单元 5 使用 LINQ 技术操作数据库在安装 VS2008 的时候,宣传广告中不断地显示 VS2008 的新特性,其中重点就有 LINQ。

VS 作为一个全球有影响力的开发软件,自 VS2008 开始就把目光重点投给 LINQ, 这一定有它的地位和意义。

在第三学习单元和第四学习单元的学习中我们掌握了用数据源控件和 ADO.NET 技术 操作数据库,实现了对数据库数据的编辑。

虽然数据源控件以及传统的 ADO.NET 提供了 大量的读取、查询、检索和编辑数据库中数据的方法,然而,有时这些方法显得比较繁琐。

开发人员需要编程查询或操作数据库的每个步骤,如获取连接字符串、创建数据库的连接 对象、打开数据的连接、执行查询或操作数据库的命令等。

LINQ 引入了标准的、易于学习的查询和更新数据的模式,可以对其技术进行扩展以支 持几乎任何类型的数据存储,这使得它在对象领域和数据领域之间建立了一座桥梁。

图 5-1 给出了 LINQ 框架的基本架构,LINQ 主要由 3 部分组成:LINQ to ADO.NET 、LINQ to Objects 和 LINQ to XML。

其中 LINQ to ADO.NET 又分成为了两个组成部分: LINQ to SQL 和 LINQ to DataSet。

本学习单元将通过 LINQ to SQL 来认识 LINQ 技术,其它组成部分读 者可以借助其它资料进行学习。

C# VB .NET 语言集成查询(LINQ) 支持 LINQ 的数据源 Linq to Object Linq to DataSet Linq to SQL Linq to XML 其它LINQ to ADO.NET对象数据库XML图 5-1 LINQ 基本架构5.1 任务 1:使用 LINQ to SQL 操作数据库5.1.1 任务场景“588 乐购网”为了向广大顾客更好地展示商品,决定在网站中添加商品展示板块。

同时,为编辑这些商品信息则必须在网站的后台添加数据处理的页面。

商品展示模块的功能是通过图文并茂的方式展示商品的品名、型号、参数和图片等信第1页

ASP.NET 应用程序开发技术息。

如图 5-2 所示的“588 乐购网”的首页,在页面的左侧显示商品品牌导航条,右侧则显 示最新上架商品的图片缩略图及其品名和价格,点击商品的图片,则按图 5-3 所示的界面 显示商品的详细信息。

图 5-2 网站首页图 5-3 商品详细信息页面 网站的后台数据管理也是一个网站必不可少的内容。

在后台数据管理页面中可以进行 包括用户信息、商品信息和订单信息等等内容的处理。

如图 5-4 商品信息添加模块的页面。

第2页

ASP.NET 应用程序开发技术图 5-4 添加手机页面5.1.2 学习引导在.NET Framework 3.5 的众多新特性中,LINQ to SQL 是最重要的一个,它的出现意 味着自 SQL 诞生以来,应用程序与数据库的结合方式上最重要的一次变革。

开发人员可以 使用 LINQ to SQL 对数据库中的数据进行查询、更新、插入和删除等操作。

目前,可以对 Microsoft SQL Server 2000/2005(包括使用 Express 版)使用 LINQ to SQL。

其他数据库, 如 Oracle、DB2 和 Access 等,目前还没有得到支持,但也许将来会得到支持。

LINQ to SQL 最重要的就是为关系数据库创建一个对象模型,然后将该对象模型映射 到 SQL Server 数据库中的相应的对象(如表、列、存储过程等) 。

例如,如果 LINQ to SQL 映射到数据库中的表,则这些 LINQ to SQL 类称为“实体类” 。

该类中的属性分别映射到数 据库中的相应的列。

在理解了映射关系的基础上,接下来就是如何实现这种映射关系。

这里必不可少的就 是掌握 LINQ 查询语句,它实现了对数据库数据的查询和修改。

当然,被查询的数据也可以 是 XML(LINQ to XML)和对象(LINQ to Objects) 。

5.1.3 相关知识与技术一. LINQ 查询表达式语法基础 C# 3.0 在 C# 1.0 和 C# 2.0 的基础上引入了新的语言机制,如隐型局部变量、对象初 始化程序、查询表达式和 Lambda 表达式等。

这些新的机制为 LINQ 提供了语法支持。

接下来, 我们通过一个简单的例子来理解 LINQ 查询表达式语法。

尽管 LINQ 不仅可用 来访问关系数据库,而且也能访问数据集或 XML 等数据类型,但这里为了理解 LINQ 查询 表达式,我们用一个 SQL 语句访问数据库来比较说明。

下面的 SQL 语句是基于 NorthWind 数据库用来查询没有住在 Berlin 的顾客的名单: SELECT c.CompanyName, c.ContactName, c.City FROM Customers c WHERE c.City != 'Berlin'第3页

ASP.NET 应用程序开发技术ORDER BY c.ContactName 现在来看看用 LINQ 表达式做同样的事情,解剖并理解清除其中的细节,有两种查询 语法:查询表达式和方法查询。

目前,暂时先考虑查询表达式,下面的查询表达式将从 GetCustomers()返回的 IEnumerable 类型结果,找出那些没有居住在 Berlin 的顾客。

var customerNotInBerlin = from c in GetCustomers() where c.City != "Berlin" orderby c.ContactName select c; 表 5-1 概述了 LINQ 一些常用的表达式: 表 5-1 LINQ 查询表达式子句列表 操作符 var <变量> = from <项目> in <数据源> where select group join orderby, ascending, descending 意义 使用类型推理来赋值 从一个<数据源>中取出一个子集作为一个<项目> 从数据源中取出一个子集的约束条件 指定查询结果的类型和表现形式. 对查询结果进行分组 选择多个数据源进行关联查询 对查询结果进行排序,可以是“升序” 、 “降序”LINQ 查询表达式必须以 from 子句开头,并且必须以 select 或 group 子句结束。

在第 一个 from 子句和最后一个 select 或 group 子句之间,查询表达式可以包含一个或多个 where、orderby、group、join,甚至 from 子句。

1. from、where 和 select 查询子句 LINQ 查询表达式必须包含 from 子句,而且要以 from 子句开头,嵌套查询其子查询表 达式也必须以 from 开头。

from 子句指定查询操作的数据源和范围变量。

where 子句指定筛 选元素的逻辑条件, 一个查询表达式可以不包含 where 子句, 也可以包含 1 个或多个 where 子句。

select 子句指定了查询结果的类型和表现形式。

LINQ 查询表达式要么以 select 子句 结束,要么以 group 子句结束。

下面的实例说明了一个简单的查询操作。

代码使用 GetMobiles( )方法获得 Mobile 表的 内容。

之后, 使用一个 LINQ 查询表达式 (利用了 from、 where 和 select 关键字) 获得 where 筛选后的数据集作为 GridView1 的数据源。

private void ShowData ( ) { var mobiles = GetMobiles(); var query=from m in mobiles where m.MbID<5 select query第4页

ASP.NET 应用程序开发技术GridView1.DataSource= query; GridView1.DataBind(); } 注意, from 子句指定的数据源的类型必须是 IEnumerable (可枚举) 、 IEnumerable 或前两者的派生类型。

在下面的例子中,我们不是简单的选择 query,而是明确定义字段的名称,定义一个新 的投射,指定在结果集中的对象。

例如,要给 MbID 和 MbName 指定更明确的名称,以完 整地描述他们的内容。

private void ShowData ( ) { var mobiles = GetMobiles(); var query=from m in mobiles select new {mobileid = m.MbID , mobilename = m.MbName}; GridView1.DataSource= query; GridView1.DataBind(); } 2. group 子句 group 子句对查询结果进行分组,并返回元素类型为 IGrouping的对 象序列。

下面的例子中,使用 group 关键字按类型组合 Mobile 类别数据,关键字 into 提供了一 个临时标识符,充当 group 子句的结果的引用。

另外,因为 group 操作不会导致任何结果, 所以查询仍使用前面讨论的技术创建一个定制的查询投射。

private void ShowData ( ) { var mobiles = GetMobiles (); var query = from m in mobiles group m by m.MbTypeID into g select new{手机类型标记=g.Key, 数量=g.Count() }; GridView1.DataSource= query; GridView1.DataBind(); } 3. orderby 子句 orderby 子句可以多查询结果进行排序。

排序的方式可以是“升序”或“降序” ,默认 的排序方式为“升序” 。

private void ShowData ( ) {第5页

ASP.NET 应用程序开发技术var mobiles = GetMobiles(); var query = from m in mobiles orderby m.MbID descending select new {手机标记= m.MbID , 手机名称 = m.MbName}; GridView1.DataSource= query; GridView1.DataBind(); } 二. 通过 LINQ 插入、更新和删除数据 LINQ to SQL 最重要的功能就是查询和操作 SQL Server 数据库中的数据。

通过它可以 很容易的查询 SQL Server 数据库中的数据,而且也可以通过 InsertOnSubmit()、 DeleteOnSubmit()等方法实现对数据库的插入数据和删除数据等操作。

1. 创建 LINQ to SQL 实体 在 Visual Studio 中包含了一个基本的 Object Relation 映射器,它可以快速地为 SQL Server 数据库创建一个对象模型, 并将这些对象模型映射到 SQL Server 数据库中相应的对 象(如表、列、存储过程和函数等) 。

SQL Server 数据库中的表被映射为 LINQ to SQL 类, 我们称为“实体类” ;数据库中的列被映射为实体类中的属性或字段;存储过程或函数被映 射为实体类中的方法。

LINQ to SQL 对象模型和 SQL Server 数据中的对象的映射关系如表 5-2 所示。

表 5-2 不同数据提供程序对应的 ADO.NET 对象LINQ to SQL 对象模型的基本元素 实体类 属性(或字段) 关联 方法 SQL Server 数据库中的对象 表 列 外键关系 存储过程或函数实体是描述数据库表(或视图)的类,通过它可以实现对数据库的操作,接下来我们 来学习如何通过 Visual Studio 2008 的 Object Relational Designer 创建实体类。

(1)创建 DBML 文件 1 在【解决方案资源管理器】中右击解决方案名称,然后选择【添加新项】命令,如 ○ 图 5-5 所示:第6页

ASP.NET 应用程序开发技术图 5-5 添加新项 2 在弹出的【添加新项】对话框中选择【LINQ to SQL 类】选项,并在【名称】对话 ○ 框中输入类文件名,如图 5-6 所示:图 5-6 添加实体类 DataClasses.dbml 3 左击【添加】按钮后,会出现如图 5-7 的对话框,选择【是】按钮,将 LINQ to SQL ○ 类放在 App_Code 文件中:图 5-7 是否将实体类添加入 App_Code 文件夹对话框 4 选择【是】后,将在 App_Code 文件夹中生成一个 DataClasses.dbml 文件,并在 ○ IDE 视图窗口中打开了这个文件。

如图 5-8 所示,I 区是用来创建实体类的,II 区是用来创 建方法的。

第7页

ASP.NET 应用程序开发技术图 5-8 实体类的 IDE 视图窗口 (2)创建“数据上下文类” 具体操作为:在【服务器资源管理器】面板中选择 DataBase 数据库中的 Mbtype 表, 然后将其拖放到图 5-8 的【I】区视图面板中,如图 5-9。

保存 DataClasses.dbml 文件后, 该文件将为 Mbtype 表创建一个名为 Mbtype 的类。

类的内容保存在 DataClasses.designer.cs 代码窗口中,如图 5-10。

而以后没改变一次 dbml 文件中的内容, 必须在重新保存一次.dbml 文件,这时 DataClasses.designer.cs 中的内容也将更新。

图 5-9 拖放数据库表进对象关系设计器示意图第8页

ASP.NET 应用程序开发技术图 5-10 数据上下文类的代码窗口 (3)创建数据库的数据上下文方法 如果开发人员需要使用数据库中的存储过程或函数,则需要把存储过程或函数也添加 到 DataClasses.dbml 文件中。

具体操作为:在【服务器资源管理器】面板中选择数据库中的存储过程或函数,并将 它们拖放到 DataClasses.dbml 文件的视图面板图 5-8【II】区中。

保存 DataClasses.dbml 文件之后,该文件将为每一个存储过程和函数创建一个相应的方法。

2. 查询数据库中的数据 使用 LINQ to SQL 可以轻松查询数据库中的数据,下面我们通过 LINQ to SQL 来查询 DataBase 数据库中的 Mbtype 表中的数据,并通过 Repeater 控件显示在页面中。

具体步 骤如下: (1) 创建 DataClassesDataContext 类的实例 db。

(2) 使用 LINQ 查询表达式查询 Mbtype 表中的数据,并将查询的结果保存为 result 变 量。

(3) 把 result 变量作为 Repeater 控件 rptData 的数据源,并绑定该控件的数据来显示 查询的结果。

private void showData() { //创建 DataBase 数据库的上下文实例。

DataClassesDataContext db = new DataClassesDataContext(ConfigurationManager.ConnectionStrings[" MG_mobileConnectionString"].ConnectionString); var result = from p in db.Mbtype select p; rptData.DataSource = result; rptData.DataBind(); } 3. 修改数据库中的数据 具体步骤如下: (1) 使用 LINQ 查寻查找被修改的记录。

(2) 赋予记录新的值。

(3) 调用 SubMitChanges()方法将上述修改提交到数据库,并完成修改操作。

private void UpdateDataWithLINQ() { ///创建 LinqDB 数据库的数据上下文的实例 tempDataContext db = new tempDataContext( );第9页

ASP.NET 应用程序开发技术///查询被修改的数据 var result = from r in db.Mobile where r.MbID == 2 select r; ///修改数据 foreach (Mobile r in result) { r.MbName = "123"; } ///将修改操作提交到数据库中 db.SubmitChanges(); } 4. 插入数据 创建了 DataContext 类对象之后,就能够使用 DataContext 的方法进行数据插入、更 新和删除操作。

相比 ADO.NET,使用 DataContext 对象进行数据库操作更加方便和简单。

使用 LINQ to SQL 类进行数据插入的操作步骤如下。

(1) 创建 DataClassesDataContext 类的实例 db。

(2) 声明实体类对象 info,并设置其相应的属性值,为实体属性赋值。

(3) 调用 InsertOnSubmit()方法将实体类对象 info 添加到 db 实例的 Mobile 表中。

(4) 调用 SubmitChanges()方法将实体类中的数据添加到数据库中,实现修改数据 的功能。

private void AddDataWithLINQ() { ///创建 LinqDB 数据库的数据上下文的实例 tempDataContext db = new tempDataContext( ); Mobile mb = new Mobile();// 创建一个实体 mb.MbName = “apple”; db.Mobile.InsertOnSubmit( mb ); // 添加到数据库中 db.SubmitChanges(); } 5. 删除数据库中的数据 使用 LINQ 能够快速的删除行,删除行的基本步骤如下: (1) 创建 DataClassesDataContext 类的实例 db。

(2) 使用 LINQ 查询将要删除的数据,将查询结果保存到 result 变量中。

(3) 使用 DeleteAllOnSubmit()方法删除 result 变量中的所有记录。

(4) 调用 SubmitChanges()方法将实体类中的数据添加到数据库中,实现修改数据 的功能。

第 10 页///将修改操作提交到数据库中

ASP.NET 应用程序开发技术private void DeleteDataWithLINQ() { ///创建 LinqDB 数据库的数据上下文的实例 tempDataContext db = new tempDataContext( ); // 查询被删除的数据 var result = from r in db.Mobile where r.MbID=2 select r; // 删除数据,并提交到数据库中 db.Mobile. DeleteAllOnSubmit ( result ); ///将修改操作提交到数据库中 db.SubmitChanges(); }5.1.4 任务的设计与实现一. 相关数据库设置与定义 根据任务场景,该功能模块可设置保存商品信息的数据表 Mobile 和保存商品品牌的数 据表 mbtype,所在的数据库文件为 Database.mdf。

mbtype 和 Mobile 数据表定义分别如表 5-3 和表 5-4 所示。

表 5-3 mbtype 数据表定义字段名 TypeID MbTypeName MbTypePic 数据定义 int nvarchar(50) nvarchar(50) 允许为空 否 否 否 字段描述 类别编号,主键 类别名称 类别图片存放路径表 5-4 Mobile 数据表表定义字段名 MbId MbName MbTypeId Price Picture AddedTime Stock 数据定义 int nvarchar(50) int money nvarchar(50) datetime int 允许为空 否 否 否 否 否 否 否 字段描述 商品编号,自动编号,主键 商品名称 类别编号 商品价格 商品图片 商品上架时间 商品库存二. 功能的设计与实现 1.设计前准备 在 VS2008 中新建网站,并在站点 App_Data 目录下创建数据库 Database.mdf,同时第 11 页

ASP.NET 应用程序开发技术在该数据库中创建如表 5-3 和表 5-4 所示的数据表。

2.任务的功能设计 根据学习任务学习场景描述,主要包含三个页面:网站首页、商品详细信息页面和网 站后台商品添加页面。

(1) 网站首页:将网站的首页分成上中下的结构,最新上架商品的信息放在中间区域。

(2) 商品详细信息页面:每一款商品详细信息展示包含:一张商品图片、商品名称、商 品编号、商品价格,并在该页面中添加购买按钮和购买数量。

(3) 商品添加页面:该页面主用用来提交一款商品的信息。

在提交信息之前能够预览该 商品的缩略图。

3.任务的功能实现 (1) 首页模板页 1 页面布局设计 ○ 为使网站有一个统一的风格,在网站根目录下按上、中、下的网页布局创建一个模板 页 MasterPage.master,模板页布局如图 5-11 所示。

图 5-11 首页模板页布局 模板页的页头区域包含了页面标题、网站 LOGO、登录区、搜索区等;页脚区域包含 了一些扩展链接。

模板页的左半部分为商品品牌导航区域,它采用商品品牌的缩略图来作导航按钮。

这 里用一个名为 dlistType 的 DataList 控件来显示这些商品品牌数据,编辑 dlistType 控件模 板, 在其中放置一个名为 ibtType 的 ImageButton 控件和一个名为 lbTypeId 的 Label 控件。

显示商品品牌导航的 DataList 控件及其子控件相关属性设置如表 5-5 所示。

表 5-5 显示商品品牌导航的 DataList 控件及其子控件相关属性设置 dlistType 子控件 DataList 控件,绑定到 Mbtype 数据表,以便其 ItemTemplate 视图子 控件 ibtType 显示商品品牌缩略图,子控件 lbTypeId 绑定品牌 Id。

功能 属性 绑定表达式第 12 页

ASP.NET 应用程序开发技术续表 5-5 ImageButton 控件,用于显 示商品缩略图导航按钮,通 iimagebtnType 过查询字符串将当前商品品 牌的 MbTypeID 传递到目标 页面——ProductList.aspx lbTypeId Label 控件,主要用于获取 商品品牌的 ID,可作为按类 别显示手机信息时的条件。

ImageUrl Eval("MbTypePic")CommandName Text Visibleimagebutton Eval("TypeId") false2 导航实现 ○ 获取数据库中 mbtype 表作为控件 dlistType 的数据源。

这需要在网站中新建一个 LINQ to SQL 实体类 DataClasses.dbml,并将 mbtype 表拖进 IDE 窗口后保存该 dbml 文件。

给 dlistType 控件指定数据源。

在 MasterPage.master.cs 文件中添加获取数据源的方 法 ShowLeftType()。

public void ShowLeftType() { DataClassesDataContext dc = new DataClassesDataContext(); var results = from t in dc.mbtype select t; dlistType.DataSource = results; dlistType.DataBind(); } (2) 网站首页 网站首页应直观地给顾客以网上商品琳琅满目的感觉以及浏览方便。

还应让顾客知道 网站最新的信息,特色的商品信息推荐。

因此,在本学习任务中,我们设计了在网站的首 页中显示最新上架的商品信息,这些信息通过图文并茂的方式来展现。

1 最新上架信息显示设计 ○ 最新上架商品信息的显示也借助 DataList 控件来显示。

在网站首页 Default.aspx(属 于模板页 MasterPage.master 的内容页)中添加名为 dlistLatest 的 DataList 控件。

编辑 dlistLatest 模板,在 ItemTemplate 模板中添加能显示每一款商品缩略图、商品名和价格等 信息的控件。

商品缩略图设计成一个名为 imagebtn 的 ImageButton 控件,它可以作为显示 商品详细信息的页面导航按钮;商品名和价格分别用名为 lbName 和 lbPrice 的 Label 控件 来显示。

ItemTemplate 模板的布局如图 5-12 所示第 13 页

ASP.NET 应用程序开发技术图 5-12 商品展示模板布局 显示最新上架商品信息的 DataList 控件及其子控件相关属性设置如表 5-6 所示。

表 5-6 显示最新上架商品信息 DataList 控件及其子控件相关属性设置 DataList 控件,绑定到 Mobile 数据表,以便其 ItemTemplate 视图子控件 dlistLatest imagebtn 显示商品缩略图,子控件 lbName 绑定商品名,子控件 lbPrice 绑定商品价格。

子控件 功能 属性 绑定表达式 Eval("Picture") ImageButton 控件, 用于显示商品缩略图 ImageUrl 导航按钮,通过查询 字符串将当前商品品 牌的 MbTypeID 传递 PostBackUrl 到目标页面—— ProductList.aspx Label 控件, 用于显示 Text 商品名。

Label 控件, 用于显示 Text 商品价格。

imagebtnEval("MbId","~/MobileDetails.aspx ?MbId={0}") Eval("MbName") Eval("Price","{0:c}")lbName lbPrice2 数据显示 ○ 将 Mobile 表拖入 LINQ to SQL 实体类 DataClasses.dbml 的 IDE 窗口并保存。

在 Default.aspx.cs 文件中添加显示最新上架信息的方法 ShowLatest(), public void ShowLatest() { DataClassesDataContext dc = new DataClassesDataContext(); var results = from m in dc.Mobile orderby m.AddedTime descending select m; var query = results.Take(8); dlistLatest.DataSource = query;第 14 页// 取返回结果的前 8 条记录

ASP.NET 应用程序开发技术dlistLatest.DataBind(); } (3) 商品详细信息页面 当单击首页中的商品缩略图时,将打开一个商品详细信息页面 MobileDetails.aspx 用 来显示商品的更详细信息。

商品详细信息页面也是 MasterPage.page 的内容页,在该页面 中用名为 dlistDetails 的 DataList 控件来显示商品的详细信息。

编辑 dlistDetails 模板,在 ItemTemplate 模板中添加能显示每一款商品详细信息的子控件。

商品缩略图设计成一个名 为 imMb 的 Image 控件;商品名、价格和库存信息分别用名为 lbName、lbPrice 和 lbStock 的 Label 控件来显示。

另外,在本页面中还添加了名为 quantity 的 TextBox 控件作为用户 购买数量的输入框,以及一个名为 ibtnBuy 的 ImageButton 控件的购买按钮,用来将商品 添加入购物车。

ItemTemplate 模板的布局如图 5-13 所示图 5-13 商品详细信息模板布局示意图 显示商品详细信息的 DataList 控件及其子控件相关属性设置如表 5-7 所示。

表 5-7 显示最新上架商品信息 DataList 控件及其子控件相关属性设置 dlistDetails 子控件 lbName lbId lbPrice lbStock quantity ibtnBuy DataList 控件,绑定到 Mobile 数据表。

功能 Label 控件,用于显示商品 名称 Label 控件,用于显示商品 编号。

Label 控件,用于显示商品 价格。

Label 控件,用于显示商品 库存。

TextBox 控件,用户输入用 户购买数量 ImageButton 控件,添加商 品进购物车的触发按钮 属性 Text Text Text Text 绑定表达式 Eval("MbName") Eval("MbId") Eval("Price","{0:c}") Eval("Stock")CommandNamebuy第 15 页

ASP.NET 应用程序开发技术当单击添加到购物车按钮时,触发 dlistDetails 控件 ItemCommand 事件 dlistDetails_ItemCommand,方法如下: protected void dlistDetails_ItemCommand(object source, DataListCommandEventArgs e) { if (e.CommandName == "buy") { // 判断用户是否登录,如果已登录则跳转至购物车页面, // 若未登录则跳转至用户登录页面。

} } 通过设置 dlistDetails 控件中的子控件的 CommandName 属性,可以用来判断用户触 发了哪个子控件的事件,进而执行该事件。

购物车的实现在本学习单元中并不体现,读者 可根据学习需要查阅相关材料。

(4) 新增商品信息页面 新增手机页面用一个 Table 来布局。

Table 中包含的控件属性设置如表 5-8 所示。

表 5-8 新增手机页面相关控件属性设置 控件 tbName ddlType tbPrice fileupload pic tbStock 功能 属性/事件 值REVPriceREVStockibtnAdd第 16 页TextBox 控件,用于输入手机 名称 DropDownList 控件,作为手 机品牌的输入功能。

TextBox 控件,用于输入手机 价格 FileUpload 控件, 用于上传手 onchange previewImage() 机图片 Image 控件,该控件为 HTML 控件,用来显示图片预览图。

TextBox 控件,用于输入手机 CommandName buy 库存 ControlToValidate tbPrice RegularExpressionValidator 控 (请输入一个小数位 ErrorMessage 件,验证用户输入价格格式 为 2 的正实数) ValidationExpression ^[0-9]+(.[0-9]{2})?$ ControlToValidate tbStock RegularExpressionValidator 控 (请输入一个非负整 ErrorMessage 件,验证用户输入库存格式 数) ValidationExpression ^\d+$ IImageButton 控件,触发手机数 Click ibtnAdd_Click() 据插入事件

ASP.NET 应用程序开发技术添加手机信息,手机图片的处理分为两个步骤完成:将手机图片上传至服务器存放图 片的文件夹 images 中,同时将存放该手机图片的相对路径和图片文件名提交服务器保存, 这两个过程在名为 ibtnAdd 的 ImageButton 控件 Click 事件中完成,代码如下: protected void ibtnAdd_Click(object sender, ImageClickEventArgs e) { DataClassesDataContext dc = new DataClassesDataContext(); Mobile mb = new Mobile(); mb.MbName = tbName.Text; var value = from u in dc.mbtype where u.MbTypeName == ddlType.SelectedItem.ToString() select u; foreach (mbtype u in value) { mb.MbTypeId = u.TypeId; } mb.AddedTime = DateTime.Now; mb.Price = Convert.ToDecimal(tbPrice.Text); mb.Stock = int.Parse(tbStock.Text.Trim()); //获取手机图片相对路径及文件名 mb.Picture = "~/images/mobile/" + fileupload.FileName; //将手机图片保存至网站服务器中的相关位置 fileupload.SaveAs(Server.MapPath("~/images/mobile/" + fileupload.FileName)); dc.Mobile.InsertOnSubmit(mb); dc.SubmitChanges(); } 在手机添加页面中增加一个预览手机图片的功能,该功能只需要在客户端处理,因此 图片预览的处理的方法是在页面中增加一段 至此,本学习任务描述的功能需求实现基本完成。

5.2 任务 2:使用 LinqDataSource 控件操作数据库5.2.1 任务场景在网站的首页中给出了手机品牌缩略图,当顾客单击该缩略图时将显示网站中隶属于 该品牌的所有商品信息,如图 5-14 所示:图 5-14 按品牌显示商品信息页5.2.2 学习引导在 Asp.Net 3.5 中,提供了一个全面支持 LINQ 的数据源控件,通过使用 LinqDataSource 控件,无需编写 Select、Update、Insert 或 Delete 语句即可执行对数 据库的操作。

接下来,我们将介绍如何使用 LinqDataSource 控件及其在设计期间的配置选 项。

在使用 LinqDataSource 控件操作数据库时,我们按下面的步骤来完成:第 18 页

ASP.NET 应用程序开发技术1. 创建数据库表和数据表。

注意:在创建数据表时一定要给该表设置主键。

2. 创建表示数据库实体的类。

也即创建一个 dbml 文件。

3. 创建和配置 LinqDataSource 控件 4. 添加显示数据的控件 5. 配置 LinqDataSource,使用户能够更新、插入和删除数据5.2.3 相关知识与技术和其他数据源控件一样,LinqDataSource 控件也是通过设置该控件的属性转换为可以 再目标数据对象上操作的查询,也就是转换为有效地 LINQ 查询。

把该控件拖放到 Visual Studio 的设计界面上,然后选【择配置数据源】就可以使用智能标记配置控件了。

图 5-15 显示了配置向导的初始页面。

图 5-15 配置 LinqDataSource 初始页面 在这个页面中, 我们可以选择要做数据源的上下文对象。

默认情况下, 向导显示由 LINQ to SQL 创建的数据上下文类。

也允许选择其他上下文对象。

选择上下文对象后,可以选择上下文对象中的指定表或属性,以返回要绑定的数据。

如图 5-16, 【表】项的下拉列表包含了改上下文对象中的所有数据表。

选择相应的表后单击 【完成】按钮,完成向导。

程序清单列出了 LinqDataSource 配置向导生成的标记。

第 19 页

ASP.NET 应用程序开发技术图 5-16 指定 LinqDataSource 数据来源表页面 当然,在图 5-17 中,配置向导还可以通过设置【Select(S) 】项来返回相应字段的结 果集。

接下来, LinqDataSource 就可以作为数据源绑定到数据控件 (如 GridView 或 DataList 等)中上了。

另外,设置完数据源后,我们还可以通过 LinqDataSource 控件的属性窗口(设置 EnableInsert、EnableUpdate 和 EnableDelete 属性值为 false 或 true)或者下图来设置该 控件是否可以执行插入、更新和删除操作。

这个设置将可以让我们无需编写任何删除、插 入和更新的代码就可以实现对数据库的操作。

图 5-17 配置是否启用删除、插入和更新页面 1. 查询数据库中的数据 在 LinqDataSource 控件中, 我们可以通过 Where 和 OrderBy 来指定不同的查询参数。

单击图 中的【Where(W). . 】或【OrderBy】按钮来设置。

(1)定义 Where 子句 Where 参数使用和其他数据源控件一样的 Parameters 语法创建的, 它可以使用各种运 行期间产生的数据源提供数据。

如:Form 字段、QueryString 和 Session 等等。

可以通过 图 5-18 来设置。

第 20 页

ASP.NET 应用程序开发技术图 5-18 配置 Where 表达式页面 (2)定义 OrderBy 子句 通过图 5-19, 可以定义 OrderBy 子句, 向导默认生成以逗号隔开的字段列表的 OrderBy 属性值。

图 5-19 配置 OrderBy 页面5.2.4 任务的设计与实现在 网 站 的 根 目 录 下 新 建 一 个 以 MasterPage.master 为 模 板 页 的 名 为 MobileByType.aspx 的内容页, 用来显示按品牌展示的商品信息页面。

在该页面中首先显示 该品牌文本信息, 这通过一个名为 lbName 的 Label 控件来显示, 它的值在页面 Page_Load 时加载;采用名为 dlistMobileByType 的 DataList 控件作为数据显示控件,该控件的数据源 来自名为 ldsMobile 的 LinqDataSource 控件。

1. 给 模 板 页 中 显 示 商 品 品 牌 的 dlistType 控 件 添 加 ItemCommand 事 件 dlistType_ItemCommand: protected void dlistType_ItemCommand(object source, DataListCommandEventArgs e)第 21 页

ASP.NET 应用程序开发技术{ if (e.CommandName == "imagebutton") { Label lb = e.Item.FindControl("lbTypeId") as Label; Response.Redirect("MobileByType.aspx?MbTypeId=" + lb.Text); } } 2. lbName 控件的值由以下方法获得: private void ShowTypeName() { int id = int.Parse(Request.QueryString["MbTypeId"]); DataClassesDataContext dc = new DataClassesDataContext(); var query = from m in dc.mbtype where m.TypeId == id select m; foreach (mbtype mt in query) { lbName.Text = mt.MbTypeName; } } 3. dlistMobileByType 控件的 ItemTemplate 模板的布局如图 5-20 所示:图 5-20 dlistMobileByType 控件布局 显示按品牌显示的 DataList 控件及其子控件相关属性设置同表 5-6。

4. 数据源控件 ldsMobile 的属性设置按图 5-21 至图 5-24 所示:第 22 页

ASP.NET 应用程序开发技术图 5-21 配置步骤一图 5-22 配置步骤二图 5-23 配置步骤三 然后单击【添加】 、 【确定】按钮,完成 LinqDataSource 控件的配置。

最后指定 dlistMobileByType 的数据源为 ldsMobile。

如图 5-24 所示:第 23 页

ASP.NET 应用程序开发技术图 5-24 配置步骤四 至此,本学习任务描述的商品信息按品牌展示模块基本完成。

5.3 课业任务及指导一. 课业任务场景 某公司为规范公司管理,降低人事部的工作负荷,提高工作效率,决定开发一套人事管 理系统。

现根据本学习单元所学知识完成该系统的部分主要功能:浏览自己的基本资料、 提出请假申请、请假审核。

二. 课业指导 1、 功能分析 根据课业任务场景说明,可以将该系统划分为查询自己的详细信息、提交请假申请、审 核请假申请等三个主要功能。

(1) 查询自己的详细信息。

包括员工 ID、员工姓名、电子邮件、所在部门名称和自我 介绍;修改自己的自我介绍;修改登录密码;查询、搜索其他同事的相关信息。

(2) 提交请假申请。

包括显示员工本人年假总小时数、已使用小时数。

当前可用小时 数;查看员工本人某段时期内的请假记录、申请、批准状态等。

(3) 审核请假申请。

显示某段时间内所有/部分员工的请假记录汇总;显示当前所有待 批准的请假记录,可以在上面执行“批准/否决”操作。

2、 数据库设计 可以有三个数据表——员工数据表 Staff、部门表 Department 和请假单表 ALeave, 描述如下: Staff= { 员工编号,员工姓名,员工登录密码,员工电子邮件,员工所属部门编号, 员工自我介绍,员工剩余假期,员工的级别 } Department = { 部门编号,部门名称,部门描述 } ALeave={ 请假申请编号,员工编号,提交时间,开始时间,结束时间,理由说明, 小时数,申请状态,审核者编号 } 3、 设计实现方法推荐 (1) 导航控件 Header.ascx。

管理页面顶部设计一个导航栏,该导航栏列出所有功能模第 24 页

ASP.NET 应用程序开发技术块的链接,单击链接可以进入相应的模块主界面,方便员工在不同模块之间切换,例如图 5-25 所示。

图 5-25 导航栏 控件说明如表 5-9 所示: 表 5-9 导航栏中主要控件说明 控件 员工资料管理 请假申请 请假审核 名字 退出 控件类型 超链接 超链接 超链接 标签 按钮 控件功能描述 *这是一个超链接,点击后显示员工资料 *这是一个超链接,点击后显示请假申请表 *这是一个超链接,点击后显示待批准的请假申请 *这是一个文本标签,显示当前登录员工姓名 *这是一个按钮,点击后退出登录状态(2) 员工资料管理。

该模块可以有三个页面:显示当前登录员工信息 ListStaff.aspx, 员工查询 QueryStaff.aspx 和修改当前员工的登录密码 ChangPassword.aspx。

ListStaff.aspx 是该模块的起始页,界面如图 5-26。

页面左侧的链接按钮可以导航到图 5-27 的查询页和图 5-28 的修改密码页,相应的页面在网页右侧显示。

图 5-26 员工资料页图 5-27 查询员工页图 5-28 修改密码页 页第 25 页

ASP.NET 应用程序开发技术图 5-26、5-27 和 5-28 页面中的各控件说明如表 5-10、表 5-11 和表 5-12 所示。

表 5-10 ListStaff.aspx 中主要控件说明 控件 显示员工资料 员工查询 修改登录密 码 员工信息数 据绑定控件 修改 控件类型 超链接 超链接 超链接 DataList 按钮 控件功能描述 *这是一个超链接,点击后显示员工资料页 *这是一个超链接,点击后显示员工查询页面 *这是一个超链接,点击后显示修改密码页面 *这是一个数据绑定控件,编辑该控件的模板,按 图中给的布局加上合适的窗体控件 *这是一个按钮,点击后可以修改自我介绍表 5-11 QueryStaff.aspx 中主要控件说明 控件 查询姓名 搜索 查询结果 控件类型 文本框 按钮 GridView 控件功能描述 *此处输入要查询的员工姓名 *搜索员工的信息时使用此按钮 *显示查询结果记录集,包括登录名、姓名、部门 和电子邮件表 5-12 ChangPassword.aspx 中主要控件说明 控件 旧密码 新密码 确认密码 修改密码 控件类型 文本框 文本框 文本框 按钮 控件功能描述 *此处输入原来密码,不能为空 *此处输入原来密码,不能为空,不与旧密码同 *输入与上面新密码相同的密码,不能为空 *提交修改密码请求(3) 提交请假申请。

员工可以通过单击导航栏上的“请假提交”链接进入该模块,默 认页面为如图 5-29 的 SubmitLvReq.aspx 页。

图 5-29 提交请假申请页 页 图 5-29 所示页面中的各控件说明如表 5-13 所示。

第 26 页

ASP.NET 应用程序开发技术表 5-13 SubmitLvReq.aspx 中主要控件说明 控件 控件类型 控件功能描述 *显示该员工还能享受的年假小时数 *默认选中当天日期的第二天 *默认起始时间为 9:00,时间为 9:00-17:00 等 8 各选项,12:00 属于午休时间 *默认结束时间为 17:00,时间为 10:00-17:00 等 9 个选项 *默认为空,提交时该文本框不能为空 *提交请假请求时使用剩余年假小时数 标签 开始、结束日 日历控件 期 开始时间 结束时间 请假事由 提交 下拉框 下拉框 文本框 按钮(4) 请假审核。

员工可以通过单击导航栏上的“请假审核”进入该模块,默认页面为 CheckLvReq.aspx。

该页面有权限设置,普通员工和经理的权限是不同的,在本学习任务 中,暂时假设任何用户都可以访问该页面。

不同用户类型对该页面的不同访问处理将留在 第 7 学习单元的课业任务中解决。

图 5-30 审核请假申请页 图 5-30 所示页面中的各控件说明如表 5-14 所示。

表 5-14 CheckLvReq.aspx 中主要控件说明 控件 控件类型 控件功能描述 *显示全部待审核的请假申请 *显示请假申请的员工的姓名、开始时间、结束时 间;详细信息链接;批准和否决按钮等 *显示某条待审核请假申请的详细内容 *当单击详细链接时,显示该控件,默认隐藏待审核的记录集 GridView 详细信息 DataList以上给出了各页面中主要的控件描述和效果图,读者可根据以上内容自行设计修改, 如页面中的输入框也可为其添加验证控件,提高系统的可用性。

第 27 页

 
 

微信扫一扫 送福利