第18章最常用的操作——信息查询系统数据库操作中使用最频繁是查询,就是通过系统在数据库中查找所需要的结果。本章通过向“人力资源管理系统”查询和浏览员工奖惩信息模块介绍如果查询和浏览数据库中的记录,本系统采用三层体系架构进行分析、设计和实现,并描述了开发过程中常见的问题及解决方法。系统分析数据库分析和设计系统设计运行系统在我的WinForm应用中应用本系统开发过程常见问题及解决系统分析数据库分析和设计系统设计运行系统在我的WinForm应用中应用本系统开发过程常见问题及解决18.1系统分析查询是使用最频繁的一种操作,“人力资源管理系统”的主要功能模块中都涉及到查询数据库表中记录,并显示查询结果的操作。如:员工管理模块中查询和浏览所有员工信息和查询满足条件的员工信息;考评管理模块中查询和浏览有员工的考评信息和查询满足条件的员工考评信息;员工调动管理模块中查询和浏览员工的调动信息;培训管理模块中查询和浏览员工的培训信息;奖惩管理模块中查询和浏览员工的奖惩信息等。这些对信息的查询和浏览操作基本上是类似的,在三层体系结构中,表示层提供查询和浏览的操作界面,业务逻辑层实现具体查询和浏览的业务逻辑,数据访问层负责把在数据库中进行检索。本章下面以查询和浏览员工奖惩信息为例来介绍如何在数据库中进行查询和浏览操作。系统分析数据库分析和设计系统设计运行系统在我的WinForm应用中应用本系统开发过程常见问题及解决18.2数据库分析和设计查询和浏览员工奖惩信息涉及到四个表:一个是存放员工奖惩信息的员工奖惩表,其他三个是员工信息表和其有外键约束的员工职位表和员工部门表。数据库设计如下:员工奖惩表(RewardsInfo)是记录员工奖惩信息的,其中Rid是主键,Eid是外键约束。员工信息表(EmployInfo)部门表和职位表在第16章已经列出,在员工信息表中,字段Sid和Pid的值来自职位表和部门表中的字段。员工奖惩表(RewardsInfo)结构如下:由于奖惩信息表中存储的是员工编号,为了能显示出培训员工的姓名,职位和所属部门,需要在多个表中进行LINQ查询。和第17章一样我们创建一个视图用于查询,视图名为RewardsView。列名数据类型是否空描述RIdIntNo标识列,编号EidVarchar(10)No员工编号DateVarchar(12)No日期TypeVarchar(5)No奖惩类型ReasonIntYes原因ScoreIntYes奖惩分数remarksVarchar(200)Yes备注创建视图RewardsView的步骤如下。➊打开SQLServer2008或2005,或在VisualStudio2008中打开服务器资源管理器,展开数据库Hrmanage下的视图项,在视图上单击鼠标右键创建新视图。➋添加所用到的四个表和所需的字段,一个新的视图就创建好了。➌单击保存按钮,保存视图待用。系统分析数据库分析和设计系统设计运行系统在我的WinForm应用中应用本系统开发过程常见问题及解决18.3系统设计本节和第17章类似,使用LINQtoSQL从视图中进行信息查询。分别在HrDAL、HrBLL表示数据访问层和业务逻辑层添加相应的查询方法,在表示层实现操作界面。下面介绍代码的编写。1.在DataLinq层在DataLinq层中打开设计好的HrDataLinq.dbml,把新建的视图RewardsView从服务器资源管理器中拖放到dbml设计器中,单击保存,自动重新生成DataContext类,完成视图对应视图的创建和映射。如下图。2.在HrDAL数据访问层在HrDAL数据访问层HrDAL.cs文件中新建类DALRewardsInfo用于管理对RewardsView视图操作的方法:SelectRecordAll方法用于查询所有的奖惩信息;SelectByName方法是通过输入姓名来查询对应员工的奖惩记录,SelectBySection方法是按部门查询部门所有员工的奖惩信息的。代码如下(代码18-1.txt)。3.在业务逻辑层在业务逻辑层,分别添加与数据访问层中的方法的对应方法:SelectRecordAll方法、SelectBySection方法和SelectByName方法分别实现三种不同的查询。在项目HrBLL中HrBLL.cs文件中添加一个BLLRewardsInfo类和三个方法,代码如下代码18-2.txt:4.在表示层在表示层,设计奖惩信息查询窗体queryRewards窗体如下。分别添加一个toolStrip、DataGridView、textBox,ComboBox控件和两个Button控件,将DataGridView、textBox,ComboBox和Button控件Visible属性设置为false。编写按钮单击事件如下(详见源代码)或(代码18-3.txt)。系统分析数据库分析和设计系统设计运行系统在我的WinForm应用中应用本系统开发过程常见问题及解决18.4运行系统在Program.cs中更改查询奖惩窗体为启动窗体,按照部门进行查询的运行界面如下。系统分析数据库分析和设计系统设计运行系统在我的WinForm应用中应用本系统开发过程常见问题及解决18.5在我的Windows窗体应用程序中应用本系统本章编写信息查询系统模块的数据访问层和业务逻辑层的代码可以直接用在整个“人力资源管理系统”项目中,表示层界面部分要稍做修改以适合项目的整体要求。系统分析数据库分析和设计系统设计运行系统在我的WinForm应用中应用本系统开发过程常见问题及解决18.6开发过程常见问题及解决开发过程中经常出现的问题和解决方案如下:1.无法将类型“System.Linq.IQueryableDataLinq.RewardsView”隐式转换为“System.Data.Linq.TableDataLinq.RewardsView”。解决方法:出现这样的错误,一般是由于数据类型不一致造成的。保证调用相应方法时保持和定义方法时的数据类型相一致。objDataContext.RewardsView;返回的是TableRewardsView泛型;(fromrewardinobjDataContext.RewardsViewwherereward.EName==nameselectreward).Single()返回的是RewardsView视图;(fromrewardinobjDataContext.RewardsViewwherereward.SectionName==sectionselectreward).ToList()返回的是ListRewardsView泛型2.按照部门查询时出现为处理的NullReferenceException异常,画面如下。原因是没有选择“部门”,传给SelectBySection方法的参数为空。解决方法:添加判断代码如下,如没有选中部门,给出提示然后返回。if(comboBox1.SelectedItem==null){MessageBox.Show(请选择部门!);return;}