第15章应用开发——数据库通用类的设计由于系统中对于数据库操作都需要处理连接字符串、创建连接、执行查询、更新等通用操作,为了提高代码的复用性,在软件开发时一般都创建数据库通用类完成数据库的通用操作。本章介绍了流行的三层体系架构的概念、利用LINQtoSQL自动创建数据库通用类的方法和利用数据库通用类操作数据库的简单例子。系统分析数据库分析和设计系统设计运行系统在我的WinForm应用中应用本系统开发过程常见问题及解决系统分析数据库分析和设计系统设计运行系统在我的WinForm应用中应用本系统开发过程常见问题及解决15.1系统分析使用ADO.NET访问数据库时,每次操作都要设置数据库连接connection属性、建立连接、使用SQLcommand和进行事务处理等,比较繁琐且有很多重复操作。项目开发中一般创建数据库通用类把这些繁琐的、常用的操作封装起来,以更方便、安全地使用ADO.NET。15.1.1三层体系结构目前,流行的项目多采用三层体系结构。三层体系结构就是在表示层(界面层)与数数据访问层之间加入一个中间层,叫做业务逻辑层,一般将业务规则、数据访问、合法性校验等工作放到中间层进行处理。通常情况下,客户端不直接与数据库进行交互,而是通过中间层与数据库进行交互。典型的三层结构包括表示层、业务逻辑层和数据访问层,使用三层结构创建的应用系统,由于层与层之间的低耦合和层内部的高内聚,使得解决方案的维护变得更容易。表示层:主要是指与用户交互的界面,用于显示数据和接收用户的输入,将用户输入的数据传递给业务逻辑层,一般不包含任何实际的业务处理,当业务逻辑层的数据发生变化时,表示层就会显示出更新的结果。表示层是应用程序提供给用户的操作界面,通常是包含Windows窗体或Web页面的Windows窗体应用程序或Web应用程序。业务逻辑层:是表示层和数据访问层之间的桥梁,它代表应用程序的核心功能,负责处理数据层的数据,实现具体的业务逻辑。业务逻辑层通常为类库。数据访问层:主要实现对数据的操作,将数据库中的数据提交给业务层,同时将业务层处理过的数据保存到数据库中。数据访问层可以访问关系数据库、文本文件或者XML文件,数据访问层通常为类库。使用三层结构的目的是是使项目结构更清楚,分工更明确,有利于维护。三层架构就像员工、经理和董事长之间的关系一样,员工向经理汇报工作,经理汇总后再向董事长汇报,反之,董事长有什么命令传达给经理即可,再由经理通知每位员工。如果员工都直接找董事长,管理就会变得比较混乱。三层架构搭建好之后,有一个问题需要解决,如何在三层之间传递数据呢?目前通用的解决方法有两种:一种是创建实体层使用实体层中的实体类在三层之间传递数据,另一种是使用数据集在三层之间传递数据。使用实体类的优点是实体类是一个比较容易控制的对象,它具有面向对象的基本特征,可以自由的向实体类中添加行为等;实体类消除了关系数据和对象之间的差异,便于操纵关系数据;能更好地发挥分层的作用,更好地进行复用和扩展,增强灵活性。15.1.2系统分析系统分析是开发应用系统的关键,通过系统分析了解客户需要什么样的程序,系统需要完成什么功能。通过软件需求规格说明书描述系统的总体要求,并且作为各方面沟通的依据,也为下一步工作提供基准。系统开发人员要按照软件需求规格说明书完成相应的功能。本节介绍的“数据库通用类”的设计来源于第24章的“人力资源管理系统”,重点介绍如何利用LINQtoSQL建立负责数据库操作的通用实体类。“人力资源管理系统”中的主要功能,如员工管理、考评管理、员工调动管理、培训管理、奖惩管理等都需要操作数据库,每次操作需要设置连接属性、建立连接、使用SQLcommand、事务处理等,非常麻烦并有很多重复工作,所以创建一个通用类,以更方便、安全地操作数据库。“人力资源管理系统”采用三层架构模型。利用LINQtoSQL创建数据库通用实体类实现在三个模块之间使用对象进行数据传递和负责操作数据库。利用.NETFramework3.5中新增的LINQ可以简化三层体系架构的搭建,在以往的系统中,数据访问层要访问数据字段,业务逻辑层要得到数据都需要通过数据访问层来实现,通常创建数据库通用类来辅助数据访问层操作数据库,数据库通用类可以看做单独的一层(数据模型层),LINQ可以自动生成数据模型层,产生一个dbml(DatabaseMarkLanguage数据库描述语言)文件用来描述数据库信息,dbml文件是xml格式的文档,有了它可以快速生成实体类,实体类作为实体层负责对数据库操作。如下图的DataLinq层就是实体层和数据模型层的组合。利用LINQ创建的三层体系结构如下图所示。表示层业务逻辑层数据访问层DataLinq层数据库系统分析数据库分析和设计系统设计运行系统在我的WinForm应用中应用本系统开发过程常见问题及解决15.2数据库分析和设计数据库设计是系统建设中非常重要的环节,合理有效的数据库设计对系统的性能至关重要,也是创建系统的基础。15.2.1数据库分析和设计通过系统分析,“人力资源管理系统”数据库中包含如下多个表。在SQLServer2008或者SQLServer2005中创建数据库HrManage和系统中用到的表。表和表结构如下。1.考勤表(Attendance),用于存放员工考勤的信息。列名数据类型是否空描述AidIntNo标识列,编号EIdVarchar(10)No员工编号DateVarchar(10)Yes统计月份ResultVarchar(5)No考勤结果DetailsMoneyNo考勤内容RemarksFloatYes备注2.奖惩表(RewardsInfo),用于记录员工的考奖惩信息。列名数据类型是否空描述RIdIntNo标识列,编号EidVarchar(10)No员工编号DateVarchar(12)No日期TypeVarchar(5)No奖惩类型ReasonIntYes原因ScoreIntYes奖惩分数remarksVarchar(200)Yes备注3.员工培训表(TrainInfo):记录员工的培训信息。列名数据类型是否空描述TidIntNo标识列,编号EidVarchar(10)No员工编号DateVarchar(50)Yes日期CourseVarchar(20)No培训课程RemarksVarchar(200)Yes备注4.员工调动表(EmpTransfer),用于记录员工的调动信息。列名数据类型是否空描述ETidIntNo标识列,编号EidVarchar(10)No员工编号rawSectionVarchar(10)No调动前部门rawPostVarchar(5)No调动前职务nowSectionVarchar(10)No调动后部门nowPostVarchar(5)No调动后职务DateVarchar(50)Yes调动日期reasonVarchar(20)No原因remarksVarchar(200)yes备注5.员工信息表(EmployInfo)列名数据类型是否空描述EIdVarchar(10)No标识列,员工编号ENameVarchar(10)No姓名ESexVarchar(10)No性别EBirthdayVarchar(20)Yes生日Ecardchar(18)Yes身份证Etelchar(13)Yes电话EaddressVarchar(30)Yes地址列名数据类型是否空描述SidIntYes部门PidIntYes职务EwageMoneyYes薪水EnterTimeVarchar(50)Yes入职时间StateVarchar(5)Yes当前状态DimissionVarchar(50)Yes离职时间ResumeVarchar(200)Yes简历RemarksVarchar(200)Yes备注EphotoImageYes照片6.职位表(PostInfo)列名数据类型是否空描述Pidintno编号,自动编号postNameVarchar(10)no职务名列名数据类型是否空描述Sidintno编号,自动编号SectionNameVarchar(10)no部门名7.部门表(Section)8.工资变动表(TransferWage)列名数据类型是否空描述TWidintNo编号,自动编号EidVarchar(10)No员工编号DateVarchar(50)Yes调薪日期rawWageMoneyNo原来薪水nowWageMoneyNo调后薪水reasonVarchar(20)No原因remarksVarchar(200)yes备注15.2.2数据库通用类的创建本节利用LINQtoSQL创建一个DataLinq层来组织数据库通用类,DataLinq层包含一个DataContext类和若干实体类,其结构如下:DataContext实体类1实体类2实体类n……DataContext类:项目中的每一个LINQtoSQL设计器将自动创建一个DataContext类,用来查询数据库、检索数据记录和更新数据库操作的主要类,它包含了每一个表的属性。实体类:LINQtoSQL为添加到设计器(.dbml文件)中的每一个表创建对应的实体类,这些实体类包含了强类型属性集合,映射到数据库中对应表的字段。LINQtoSQL使用这些实体类来生成数据操作的SQL脚本,同时,也可以创建实体类的实例,给实例赋值,然后在不同的层之间作为数据传输对象进行传递。DataContext类中的实体类和属性直接映射到对应数据表和字段。缺省情况下,在DataContext类中,LINQ使用继承抽象类MappingSource的AttributedMappingSource类来存放表和字段的映射信息,从数据库中检索记录和提交数据更新到数据库时需要这些映射信息。利用VisualStudio2008创建数据库通用类的步骤如下。➊启动VisualStudio2008,新建一个“类库”项目,名称为“DataLinq”。➋单击菜单【项目】【添加类】,选择【LinqtoSQL类】,输入类的名称“HrDataLinq”。单击【添加】按钮后,系统将增加HrDataLinq类到项目中,并自动创建一个空白的设计器(.dbml文件),同时附有【服务器资源管理器】的链接,也创建相关的dbml.layout文件(XML文件)和designer.cs文件(DataContext类文件)。➌打开【服务器资源管理器】,并建立到HrManage数据库的链接,然后导航到HrManage数据库,将数据库中的表拖放到设计器。最后,保存文件后就自动生成了包含相关的属性、方法的DataContext类和实体类。➍单击【生成】-【生成解决方案】,数据库通用类和实体类就可以使用了。自动生成的数据库通用类DataContext(类名是HrDataLinqDataContext)类图如下:系统分析数据库分析和设计系统设计运行系统在我的WinForm应用中应用本系统开发过程常见问题及解决15.3系统设计自动生成的数据库通用类DataContext中的实体类和属性直接映射到对应数据表和字段。缺省情况下,在DataContext类中,LINQ使用继承抽象类MappingSource的AttributedMappingSource类来存放表和字段的映射信息,从数据库中检索记录和提交数据更新到数据库时需要这些映射信息。部分代码如下(代码15-1.txt)。系统分析数据库分析和设计系统设计运行系统在我的WinForm应用中应用本系统开发过程常见问题及解决15.4运行系统为了使用数据库通用类,下面我们开发一个查询职位信息的三层结构的例子。系统体系结构设计如下:1.DataLinq层DataLinq层是15.3节中设计的数据库通用类。2.添加数据访问层在解决方案中添加类库项目HrDAL,添加对DataLinq层的引用,编写代码如下:3.创建