软件工程设计计划书.doc 60页

  • 746.00 KB
  • 2022-04-22 11:23:59 发布

软件工程设计计划书.doc

  • 60页
  • 当前文档由用户上传发布,收益归属用户
  1. 1、本文档共5页,可阅读全部内容。
  2. 2、本文档内容版权归属内容提供方,所产生的收益全部归内容提供方所有。如果您对本文有版权争议,可选择认领,认领后既往收益都归您。
  3. 3、本文档由用户上传,本站不保证质量和数量令人满意,可能有诸多瑕疵,付费之前,请仔细先通过免费阅读内容等途径辨别内容交易风险。如存在严重挂羊头卖狗肉之情形,可联系本站下载客服投诉处理。
  4. 文档侵权举报电话:19940600175。
'软件工程设计计划书1.引言1.1编写目的学生宿舍管理系统对于一个学校来说是必不可少的组成部分。由于大学院校的宿舍管理数据庞大,手工记录油太大的缺陷,因此为了代替“某某大学院校”繁琐的手工记录方法,方便宿舍管理员管理,我们设计了这款学生宿舍管理系统软件。1.2背景说明:a.这款软件的名称为“宿舍管理系统”。b.本项目的提出者是1512201班学生。c.该软件系统应用于设备管理终端。1.3定义SDMS:Studentdormitorymanagementsystem学生宿舍管理系统。SQLSever2005:所采用的数据库管理系统。VisualStudio2008:微软公司退出的开发环境,VisualStudio可以用来创建Windows平台下Windows应用程序和网络应用程序,也可以用来创建网络服务,智能设备应用程序和Office插件。B/S结构:浏览器和服务器结构,它是随着Internet技术的兴起,对B/S结构的一种变化或者改进结构。1.4参考资料《软件工程》,《SQLsever数据库设计》,《ASP.NET2.0简明教程》2.可行性研究的前提:2.1开展宿舍管理系统项目的原因:由于现今大学生管理系统的繁琐性,舍管部人员需要付出大量的时间及精力去进行管理。为了提高管理效率以及减轻舍管部人员工作负担,所以开发大学生宿舍管理系统2.2要求60 A.功能与性能:功能:每所大学的在读生都会有近万人,每个学生都有不同的学号,姓名,班级,出生日期宿舍楼号等基本信息;每间寝室都有不同的床号等信息;学校需要对每个学生以及寝室的基本信息进行统一管理,以便对每个学生及寝室的信息进行查询.浏览和修改…性能:管理系统性能可靠数据保密性高。B.系统的输入与输出由管理员输入学生的学籍信息及寝室信息,对学生的宿舍寝室信息进行实时管理。输入:用户名称宿舍编号。输出:用户信息宿舍信息备注信息。C.处理流程进入宿舍管理系统界面,进入系统后,按照提示进行相应的操作即可…D.安全保密要求于此系统较小,所以没有设置身份认可模块,能够使用系统的人员均被鉴定为合法使用人员。2.3目标以最低的成本,在最短的时间内开发具有管理学校学生宿舍和用户信息功能的学生宿舍管理系统。系统实现后,可提高宿管部人员的管理程度及效率,降低管理中的错误发生,减少信息交流的繁琐过程以及设备费用,提高管理的准确率。2.4条件,假定和限制条件说明对这项开发中给出的条件,假定和所受到的限制。如:a.建议该系统运行的最短寿命为6年;b.进行系统方案选择比较的时间限一星期。2.5进行可行性研究的方法通过调查分析数据库管理系统现阶段所具备的能力及实现的方法,确定主体结构,利用现阶段所能达到的能力,以最简洁,最容易的办法,边开发边测试,实现这个应用软件。2.6评价尺度在短时间内开发出的具有改善管理漏洞的较简单的管理系统。60 3.技术可行性1.系统概述该系统的应用可以方便学生宿舍对广大住宿学生信息的管理,可以科学的管理学校宿舍,优化宿舍资源的使用等,同时方便管理员对学生的安全管理,可以使用改系统方便的查询学生信息。开发目标系统实现后,大大提高后勤人员的服务效率。降低后勤管理中的错误发生率,减少信息交流的烦琐过程及其带来的开销。后勤人员工作得到精简,信息的准确率得到极大提升。2处理流程和数据流程学生宿舍管理系统主界面添加住户删除信息查询信息保存信息浏览信息读取写入数据库4.经济可行性4.1支出A.采购,开发及安装整套设施(包括房屋,数据通信设备,环境的保护设备,安全与保密设备,操作系统以及软件和数据库软件)所需的金钱若干。B.研究开发数据库的建立以及软件的转换,和后期的维修和技术管理费用可忽略不计。C.若系统工作正常,每次采购及维护所降低的成本若干。D.系统升级所需费用,信息掌握情况的改进,硬件设施的提升或更替所需费用。60 4.2收益本系统方便了人员的管理,节约了人力资源的成本,有利于宿舍管理人员查询注入信息,能够更好的统计宿舍人员的入住情况。极大地降低了管理人员人工管理学生信息的费用。4.3投资回收周期若系统正常工作,本系统的生命期在2~5年,最大支出为X,最小收益Y,且Y>X,预计回收周期为2到4年。若负荷工作,硬件配置损坏,将降低使用时间,缩短收益及使用时间。4.4敏感度分析设计系统周期为1周。处理速度普遍<1秒。5社会因素方面的可行性:对于当今学校公寓来说,其数据量大,各种信息管理内容复杂,查询和管理学生信息和学校内的公寓信息等,工作由人人工完成将是很累的,这不仅浪费许多人力,物力资源,而且很容易出差错有一个符合的软件对其进行智能化管理是再好不过了,节省了人力物力资源,并对其信息的把握和操作也更加方便了,对所有信息有理一个全局的把握。5.1法律方面的可行性。所使用的系统的研制和开发都是自行实现的,将不会侵犯他人。该软件的开发集体和国家的利益,不会违反相关的国家政策和法律。系统的开发仅仅是作为课设作业,因而没有太大的实用价值,将不会触犯法律。5.2使用方面的可行性系统的研制和开发充分考虑从用户工作流程,计算机操作水平等,尽可能提供更人性化,直观的界面,满足用户要求,尽可能的使系统更加容易使用。系统的操作方式在用户组织内可行,需要一名懂得计算机操作的人员使用。60 6综合结论新系统说入的资金与系统投入使用后所带来的经济效益进行比较,投资效益比远大于100%,并且系统简洁易懂且功能强大。技术、经济、操作都有可行性,可以进行开发。60 需求分析1.1编写目的在编写《学生宿舍管理系统》软件之前,对同类型产品的市场进行了前期调查,与多位软件设计者和使用者进行了探讨和分析,之后由软件项目小组向系统分析人员与软件设计人员提出了这份需求规格说明书。该需求规格说明书对学生宿舍管理系统软件进行了全面细致的用户需求分析,明确所要开发的软件应具有的功能、性能与界面。该需求规格说明书供概要设计人员阅读。1.2项目背景软件技术基础教程课程设计。学生宿舍管理系统软件是一功能比较完善的数据管理软件,具有数据操作方便高效迅速等优点。该软件采用功能强大的数据库软件开发工具进行开发,可在应用范围较广的WINDOWS系列等操作系统上使用。1.3定义SAMS:StudentApartmentManagementSystem,学生宿舍管理系统。1.概述2.1目标本设计要实现的是高校学生宿舍管理系统,在设计该系统时,应尽可能的贴近学生,便于用户操作。系统在实现上应该具有如下功能:1.系统应该提供学生住宿情况的基本登记。2.系统应提供查询功能,以方便用户对学生基本信息的查询(要实现按多种条件的查询)及楼房信息的查询。3.系统应提供增加、删除、修改学生信息的功能。2.2运行环境输入设备键盘/鼠标操作系统Windows72.3条件与限制由于时间比较短,使用计算机不方便以及对于网络编程不熟悉,本学生宿舍管理系统并没有提供数据的远程访问功能。对信息的保护手段仅限于设置用户级别,以及提供数据文件的备份,比较简单,安全性能有待进一步完善。60 1.数据描述3.1静态数据学生寝室管理系统的静态数据包括:学生(Student):Stu_Key学号Stu_Name姓名Stu_Sex性别Stu_Enr入学日期Stu_Major专业3.2动态数据输入数据:鼠标对按钮的点击查询方式、查询关键字;录入学生信息项;输出数据:查询关键字确定的数据库记录的子集;统计结果及其格式化文件;信息增加、删改结果;内部数据:查询操作建立的索引;3.3数据库描述数据库采用MicrosoftAccess数据库。3.4数据流图60 住宿信息姓名床铺号专业学号用户用户信息录入信息修改信息查询按姓名查询按学号查询按专业查询按床铺号查询按宿舍类型查询增加信息删除信息学生基本信息学生基本信息查询信息宿舍类型住宿信息住宿信息3.5学生个人信息表数据字典学号姓名性别专业入学时间字符型字符型字符型字符型字符型宿舍类型楼号房间号床铺号宿舍电话字符型字符型字符型字符型字符型3.6数据采集:通过键盘输入。60 3.7用例图查看信息增加住户用户删除住户1.功能需求4.1系统功能设计在整体设计中,我们将宿舍管理系统分为两个个大的功能:信息查询功能、信息修改功能。下面将具体进行介绍每个功能。4.2信息查询功能信息查询功能基本上包括:按学号进行查询、按姓名进行查询、按专业查询、按床铺号查询、每宿舍类型情况查询五个部分。4.3信息修改功能信息修改功能包括:学生基本信息修改等。5运行需求5.1用户界面对话框。5.2硬件接口支持各种x86系列PC机。5.3软件接口运行于Windows95/98及更高版本具有WIN32API的操作系统之上。5.4故障处理60 正常使用时不应出错,对于用户的输入错误应给出适当的改正提示。若运行时遇到不可恢复的系统错误,也必须保证数据库完好无损。60 60 概要设计说明书60 1引言1.1编写目的1.2背景1.3定义1.4参考资料2总体设计2.1需求规定2.2运行环境2.3基本设计概念和处理流程2.4结构2.5功能器求与程序的关系2.6人工处理过程2.7尚未问决的问题3接口设计3.1用户接口3.2外部接口3.3内部接口4运行设计4.1运行模块组合4.2运行控制4.3运行时间5系统数据结构设计5.1逻辑结构设计要点5.2物理结构设计要点5.3数据结构与程序的关系6系统出错处理设计6.1出错信息6.2补救措施6.3系统维护设计60 1.引言1.1编写目的经过实际分析调查,一个学生宿舍管理系统主要是要方便宿舍管理人员的工作,提高其工作效率,不仅可以方便广大学生,而且还可以方便于教师和相关人员,同时与多位软件使用者进行了全面深入地探讨和分析的基础上,提出了这份概要设计说明书。此概要设计说明书对《学生信息管理系统》软件做了全面细致的用户需求分析,明确所要开发的软件应具有的功能、性能与界面,使系统分析人员及软件开发人员能清楚地了解用户的需求,并在此基础上进一步完成后续设计与开发工作。本说明书的预期读者为学校管理员、需求分析人员、测试人员、项目管理定义.1.2背景说明:A宿舍管理系统。B项目的任务提出者是本次课程设计辅导老师储剑波老师,项目问题的选取是由本小组人员自行决定的。1.3定义本软件是基于microsoftvisualc++6.0+acess2003开发的简易数据库管理系统,以实现学生宿舍的管理。术语定义:ID学号STUDENTNAME姓名SEX性别STARTYEAR入学年份MAJOR专业60 ROMETYPE宿舍类型BUILDINGNUM楼号HOUSETEL房间电话REMARKS备注1.4参考资料1.软件技术基础教程南京航空航天大学万晓东、施玉霞、孔德明编著2.Vc++教程南京航空航天大学王珊珊编著3.Mfc软件可视化界面制作教程4.安装包制作教程2总体设计2.1需求规定设计开发一个具备完善前台操作界面和功能强大的后台数据库管理功能的宿舍管理系统。该系统主要是宿舍管理员系统,由管理员进入和退出系统,实现学生信息的录入,删除,查询。系统自行实现学生信息的存储。学生信息包含了姓名,性别,专业,学号,楼栋号,房间号,床位号,宿舍电话和备注。有一个主界面,供选择和调用上述选项。2.2运行环境windowsXP,windows2000,windows7,windows8,宿舍管理机终端60 2.3基本设计概念和处理流程1.系统整体设计需要完成管理界面进入,选择用户类型,完成数据库的连接。2.后勤宿管主要完成宿舍片区的管理,对宿舍管理员的管理,以及新生入校宿舍分配、毕业生离校宿舍回收、宿舍单元的添加、删除、修改、查询,接受申请并审核以及完成宿舍调整等。3.宿舍管理员主要完成所管辖所有宿舍的成员添加、删除、修改、查询。2.宿舍单元主要完成人员查询,可查询空置宿舍床位情况,提出宿舍调整申请。学生宿舍管理系统主界面模块添加住户模块删除信息模块查询信息模块保存信息模块浏览信息模块读取写入数据库2.4结构2.5功能器求与程序的关系本条用一张如下的矩阵图说明各项功能需求的实现同各块程序的分配关系:60 功能需求程序单元进入主界面服务模块添加添加住户服务模块删除删除住户服务模块查询查询住户服务器模块保存保存信息服务模块浏览浏览信息服务模块2.6人工处理过程根据用户的需求,随时单击各种按钮,以决定系统进程。其最终用户是宿舍系统的管理员,宿舍管理员以及南京航空航天大学学生,他们都具备一定计算机使用能力,对计算机的操作十分熟练的。同时,系统的维护人员是计算机专业人员,熟悉数据库、操作系统、网络维护工作。3接口设计3.1用户接口下图是主界面,通过3个按钮实现系统的添加,删除,查询。60 下图是学生信息的添加界面60 下图是学生的删除界面下图是学生的查询界面60 下图是学生信息的修改界面3.2外部接口软件接口硬件接口键盘鼠标显示器主模块üü管理员模块üüü查询模块üüü3.3内部接口需要实现系统之内的各个系统元素之间各个类之间的的接口,内部接口方面,各模块之间采用函数调用、参数传递、返回值的方式进行信息传递。具体参数的结构将在下面数据结构设计的内容中说明。接口传递的信息将是以数据结构封装了的数据,以参数传递或返回值的形式在各模块间传输。60 4运行设计4.1运行模块组合进入——>用户类型——>后勤宿管——>功能界面进入——>用户类型——>宿舍管理员——>功能界面进入——>用户类型——>宿舍单元管理员——>功能界面4.2运行控制连接数据库获取学生信息填充到主界面是否退出主界面信息模块注册信息模块删除信息模块查询信息模块浏览信息模块成功失败结束否4.3运行时间初步测试每种操作运行时间均在1秒以内。60 5系统数据结构设计5.1数据库数据结构设计序号字段名数据类型说明1Id文本学号2Studentname文本学生姓名3Sex文本性别4Startyear文本入学年份5Major文本专业6Roomtype文本宿舍类型7Buildingmum数字楼号8Bednum数字房间号9Housetel文本宿舍电话10Remarks文本备注5.2物理结构设计要点1.管理员信息2.楼栋信息1楼栋号2宿舍类型3宿舍号4铺位号5宿舍电话60 3学生信息1.姓名2.性别3.学号4.入学年份5.专业6.电话7.备注信息等5.3数据结构与程序的关系由于数据的存取是通过界面的接口和数据库进行连接的,所以在实现过程中必不可少的是应用程序实现它们的连接。常用的访问有:查询、删除、添加、修改等。6系统出错处理设计6.1出错信息查询信息不在数据库范围内,系统将静止不动。6.2补救措施关闭已打开窗口,重新进入该界面。6.3系统维护设计由于系统较小没有外加维护模块,仅靠数据库的一些基本维护措施即可。为便于维护,应该设计了三种日志:系统运行日志、操作日志、出错日志。三种日志根据不同的重要程度采取存放在文件和数据库的方式,系统管理员可以很轻松的监控系统运行情况,数据表的建立和删除有数据系统管理员予以维护。60 详细设计说明书60 1.引言:1、1编写目的:在前一阶段(概要设计说明书)中,已解决了实现该系统需求的程序模块设计问题。包括如何把该系统划分成若干个模块、决定各个模块之间的接口、模块之间传递的信息,以及数据结构、模块结构的设计等。在以下的详细设计报告中将对在本阶段中对系统所做的所有详细设计进行说明。在本阶段中,确定应该如何具体地实现所要求的系统,从而在编码阶段可以把这个描述直接翻译成用具体的程序语言书写的程序。主要的工作有:根据在《需求分析说明书》中所描述的数据、功能、运行、性能需求,并依照《概要设计说明书》所确定的处理流程、总体结构和模块外部设计,设计软件系统的结构设计、逐个模块的程序描述(包括各模块的功能、性能、输入、输出、算法、程序逻辑、接口等等),解决如何1.添加住户:向数据库中添加住户,并实时显示。2.删除住户:根据输入条件判断要删除的住户。3.查询住户2.总体设计:软件结构:学生宿舍管理系统主界面模块添加住户模块删除信息模块查询信息模块保存信息模块浏览信息模块读取写入数据库功能模块分析:60 主界面模块:连接数据库获取学生信息填充到主界面是否退出主界面信息模块注册信息模块删除信息模块查询信息模块浏览信息模块成功失败结束否查询模块输入新学生信息查询数据库主界面是选择添加学生功能否写入数据库提示错误重新输入是否有同名记录?继续添加?是否60 删除模块选择要删除的住宿记录删除成功?到数据库中执行返回主界面主界面否选择删除住户功能是显示剩余记录给出提示数据库表的设计:数据库文件StuDormMS.mdb序号字段名数据类型说明1Id文本学号2Studentname文本学生姓名3Sex文本性别4Startyear文本入学年份5Major文本专业6Roomtype文本宿舍类型7Buildingmum数字楼号8Bednum数字房间号9Housetel文本宿舍电话10Remarks文本备注60 各类代码及函数代码:CAboutDlg:类视图:如右图,IDD具体名为IDD_ABOUTBOX,该类关联的是软件的“关于”对话框:CAddUserDlg:类视图如右图,IDD具体名为IDD_DIALOG_ADDUSER,该类对应的是”添加住户”对话框:对话框中每个控件ID为:学生姓名:IDC_EDIT_STUDENTNAME性别:IDC_EDIT_SEX入学时间:IDC_EDIT_NATIONAL学号:IDC_EDIT_ID专业:IDC_EDIT_MAJOR宿舍类型:IDC_EDIT_ROOMTYPE楼号:IDC_EDIT_BUILDINGNUM房间号:IDC_EDIT_ROOMNUM床铺号:IDC_EDIT_BED宿舍电话:IDC_EDIT_HOMETEL备注:IDC_EDIT_REMARKS60 在本类中添加的成员变量:public继承:CStringm_strMajor;//专业intm_nBuildingNum;//楼号intm_nRoomNum;//房间号CStringm_strRemarks;//备注CStringm_strHomeTel;//宿舍电话CStringm_strStudentname;//学生姓名CStringm_strId;//学号CStringm_strSex;//性别CStringm_strNationNal;//入学时间intm_nBedNum;//床号CStringm_strStudentName;//宿舍类型消息处理函数:OnOK()为添加住户对话框的按下OK键的消息处理函数:voidCAddUserDlg::OnOK(){//判断输入信息的合法性UpdateData(TRUE);CEdit*p;if(m_strStudentname==""){AfxMessageBox("请填学生姓名");p=(CEdit*)GetDlgItem(IDC_EDIT_STUDENTNAME);p->SetFocus();return;}if(m_strStudentName==""){AfxMessageBox("请填宿舍类型");p=(CEdit*)GetDlgItem(IDC_EDIT_ROOMTYPE);p->SetFocus();return;}if(m_nBuildingNum==0){AfxMessageBox("楼号不能为零");p=(CEdit*)GetDlgItem(IDC_EDIT_BUILDINGNUM);p->SetFocus();return;60 }if(m_nRoomNum==0){AfxMessageBox("房间号不能为零");p=(CEdit*)GetDlgItem(IDC_EDIT_ROOMNUM);p->SetFocus();return;}if(m_nBedNum==0){AfxMessageBox("床铺号不能为零");p=(CEdit*)GetDlgItem(IDC_EDIT_BED);p->SetFocus();return;}CMainFrame*pFrame=(CMainFrame*)AfxGetApp()->m_pMainWnd;CInhabitantsDoc*pDoc=(CInhabitantsDoc*)pFrame->GetActiveDocument();//让用户确认操作if(this->MessageBox("确定添加这条记录?","宿舍管理系统",MB_YESNO)==IDNO){CDialog::OnCancel();return;}//增加学生到数据库中STUDENTuser;user.strRoomtype=m_strStudentName;user.nBuildingnum=m_nBuildingNum;user.nRoomnum=m_nRoomNum;user.nBednum=m_nBedNum;user.strName=m_strStudentname;user.strHouseTel=m_strHomeTel;user.strSex=m_strSex;user.strNationNal=m_strNationNal;user.strMajor=m_strMajor;user.strId=m_strId;user.strRemarks=m_strRemarks;switch(pDoc->AddUser(user)){case0:60 {//已经存在该学生了CStringstr;str.Format("%s%d号楼%d号房间%d号床铺已有学生入住!",m_strStudentName,m_nBuildingNum,m_nRoomNum,m_nBedNum);AfxMessageBox(str);CEdit*p=(CEdit*)GetDlgItem(IDC_EDIT_BED);p->SetFocus();return;break;}case1:{//增加成功后刷新左边的树视图pFrame->m_pLeftView->AddUserToTree(m_strStudentName,m_nBuildingNum,m_nRoomNum,m_nBedNum);break;}default:return;break;}CDialog::OnOK();}CHouseAccessor:类视图如右图,该类是OLEDB数据源类,定义了数据库中存储的学生信息classCHouseAccessor{public:TCHARm_major[51];//专业LONGm_buildingnum;//楼号LONGm_roomnum;//房间号TCHARm_remarks[51];//备注TCHARm_studentname[51];//学生姓名TCHARm_housetel[51];//宿舍电话TCHARm_id[51];//学号TCHARm_sex[51];//性别TCHARm_national[51];//入学时间LONGm_bednum;//床铺号TCHARm_roomtype[51];//宿舍类型BEGIN_COLUMN_MAP(CHouseAccessor)//定义显示方式COLUMN_ENTRY(1,m_studentname)60 COLUMN_ENTRY(2,m_roomtype)COLUMN_ENTRY(3,m_buildingnum)COLUMN_ENTRY(4,m_roomnum)COLUMN_ENTRY(5,m_bednum)COLUMN_ENTRY(6,m_housetel)COLUMN_ENTRY(7,m_sex)COLUMN_ENTRY(8,m_national)COLUMN_ENTRY(9,m_major)COLUMN_ENTRY(10,m_id)COLUMN_ENTRY(11,m_remarks)END_COLUMN_MAP()DEFINE_COMMAND(CHouseAccessor,_T("SELECTstudentname,roomtype,buildingnum,roomnum,bednum,housetel,sex,national,major,id,remarksFROMhouse"))//Youmaywishtocallthisfunctionifyouareinsertingarecordandwishto//initializeallthefields,ifyouarenotgoingtoexplicitlysetallofthem.voidClearRecord(){memset(this,0,sizeof(*this));}};CHouse类:类视图如右图,继承于CHouseAccessor类,用于对数据库进行操作。classCHouse:publicCCommand>{public:HRESULTOpen()//打开数据库{60 HRESULThr;hr=OpenDataSource();//打开数据源,并返回结果集if(FAILED(hr))returnhr;returnOpenRowset();//打开所有行记录的结果集}HRESULTOpenDataSource(){HRESULThr;CDataSourcedb;CDBPropSetdbinit(DBPROPSET_DBINIT);//定义数据库连接字串//设置数据库连接字串的属性dbinit.AddProperty(DBPROP_AUTH_CACHE_AUTHINFO,true);dbinit.AddProperty(DBPROP_AUTH_ENCRYPT_PASSWORD,false);dbinit.AddProperty(DBPROP_AUTH_MASK_PASSWORD,false);dbinit.AddProperty(DBPROP_AUTH_PASSWORD,OLESTR(""));dbinit.AddProperty(DBPROP_AUTH_USERID,OLESTR("Admin"));dbinit.AddProperty(DBPROP_INIT_DATASOURCE,OLESTR("StuDormMS.mdb"));//打开的数据源文件文件名dbinit.AddProperty(DBPROP_INIT_MODE,(long)16);dbinit.AddProperty(DBPROP_INIT_PROMPT,(short)4);dbinit.AddProperty(DBPROP_INIT_PROVIDERSTRING,OLESTR(""));dbinit.AddProperty(DBPROP_INIT_LCID,(long)1033);hr=db.Open(_T("Microsoft.Jet.OLEDB.4.0"),&dbinit);//打开数据库文件if(FAILED(hr))returnhr;returnm_session.Open(db);}HRESULTOpenRowset(){//SetpropertiesforopenCDBPropSetpropset(DBPROPSET_ROWSET);propset.AddProperty(DBPROP_IRowsetChange,true);propset.AddProperty(DBPROP_UPDATABILITY,DBPROPVAL_UP_CHANGE|DBPROPVAL_UP_INSERT|DBPROPVAL_UP_DELETE);returnCCommand>::Open(m_session,NULL,&propset);}CSessionm_session;};60 CInhabitantsApp类:应用程序类,派生于CWinApp,负责管理整个程序,是整个程序的入口,用于初始化整个应用程序和完成程序结束的收尾工作。主要函数:ExitInstance()退出程序函数InitInstance()初始化程序函数InitATL()初始化ATL函数OnAppAbout()程序运行时函数CInhabitantsDoc类:文档类,派生于CDocument,管理程序的文档BOOLCInhabitantsDoc::OnNewDocument(){if(!CDocument::OnNewDocument())returnFALSE;//打开数据库HRESULTresult=m_dbHouse.Open();if(FAILED(result))AfxMessageBox("opendatabasefailed!");//设置程序标题SetTitle("学生宿舍管理系统");returnTRUE;}AddUser()函数,添加用户intCInhabitantsDoc::AddUser(STUDENT&user){/*返回值:0已经存在-1添加失败1添加成功*///判断是否存在该学生了CStringstrSql;strSql.Format("select*fromhousewhereroomtype="%s"andbuildingnum=%dandroomnum=%dandbednum=%d",user.strRoomtype,user.nBuildingnum,user.nRoomnum,user.nBednum);CCommand>dbHouse;60 long*pCount=newlong;if(dbHouse.Open(m_dbHouse.m_session,strSql,NULL,pCount)!=S_OK){AfxMessageBox("error");deletepCount;return-1;}if(dbHouse.MoveFirst()==S_OK){deletepCount;dbHouse.Close();return0;}deletepCount;dbHouse.Close();//增加学生到数据库中m_dbHouse.MoveLast();_tcscpy(m_dbHouse.m_roomtype,user.strRoomtype);m_dbHouse.m_buildingnum=user.nBuildingnum;m_dbHouse.m_roomnum=user.nRoomnum;m_dbHouse.m_bednum=user.nBednum;_tcscpy(m_dbHouse.m_studentname,user.strName);_tcscpy(m_dbHouse.m_major,user.strMajor);_tcscpy(m_dbHouse.m_remarks,user.strRemarks);_tcscpy(m_dbHouse.m_housetel,user.strHouseTel);_tcscpy(m_dbHouse.m_id,user.strId);_tcscpy(m_dbHouse.m_sex,user.strSex);_tcscpy(m_dbHouse.m_national,user.strNationNal);HRESULThResult=m_dbHouse.Insert();if(FAILED(hResult)){AfxMessageBox(_T("Errorinsertingthecurrentrecord"));return-1;}return1;}//删除符合条件的学生BOOLCInhabitantsDoc::DeleteUser(CStringstrSql){CCommand>dbHouse;long*pCount=newlong;60 if(dbHouse.Open(m_dbHouse.m_session,strSql,NULL,pCount,DBGUID_DEFAULT,FALSE)!=S_OK){AfxMessageBox("error");deletepCount;returnFALSE;}deletepCount;dbHouse.Close();returnTRUE;}voidCInhabitantsDoc::DeleteContents(){//关闭数据库m_dbHouse.Close();m_dbHouse.m_session.Close();CDocument::DeleteContents();}CInhabitantsModule类:ATL类。CInhabitantView类:程序视图类CLeftTreeView类:树视图类,用于显示程序左边的树视图添加的成员变量:protected继承:HTREEITEMm_hHitItem;CImageListm_ImageList;添加的成员函数://将数据库中的所有学生到加到树中voidCLeftTreeView::AddUsersToTree()60 {CInhabitantsDoc*pDoc=(CInhabitantsDoc*)GetDocument();if(pDoc==NULL)return;//清空树GetTreeCtrl().DeleteAllItems();//取数据库中得所有记录CStringstrSql="select*fromhouse";CCommand>dbHouse;long*pCount=newlong;if(dbHouse.Open(pDoc->m_dbHouse.m_session,strSql,NULL,pCount)!=S_OK){AfxMessageBox("error");deletepCount;return;}deletepCount;if(dbHouse.MoveFirst()==S_OK){do{AddUserToTree(dbHouse.m_roomtype,dbHouse.m_buildingnum,dbHouse.m_roomnum,dbHouse.m_bednum);}while(dbHouse.MoveNext()==S_OK);}dbHouse.Close();}voidCLeftTreeView::OnInitialUpdate(){CTreeView::OnInitialUpdate();//设置树风格::SetWindowLong(m_hWnd,GWL_STYLE,WS_VISIBLE|WS_TABSTOP|WS_CHILD|WS_BORDER|TVS_HASBUTTONS|TVS_LINESATROOT|TVS_HASLINES|TVS_DISABLEDRAGDROP|TVS_SHOWSELALWAYS);//为树视图创建图标连表CInhabitantsApp*pApp=(CInhabitantsApp*)AfxGetApp();CTreeCtrl*pTreeCtrl=&GetTreeCtrl();60 m_ImageList.Create(16,16,ILC_COLOR16,4,4);m_ImageList.Add(pApp->LoadIcon(IDI_ICON_SECTION));m_ImageList.Add(pApp->LoadIcon(IDI_ICON_BUILDING));m_ImageList.Add(pApp->LoadIcon(IDI_ICON_CELL));m_ImageList.Add(pApp->LoadIcon(IDI_ICON_USER));pTreeCtrl->SetImageList(&m_ImageList,TVSIL_NORMAL);//将学生加入树中AddUsersToTree();pTreeCtrl->SortChildren(TVI_ROOT);}voidCLeftTreeView::AddUserToTree(CStringstrStudentName,intnBuildingNum,intnRoomNum,intnBedNum){HTREEITEMhSectionItem=AddSectionToTree(strStudentName);HTREEITEMhBuildingItem=AddBuildingToTree(hSectionItem,nBuildingNum);HTREEITEMhCellItem=AddCellToTree(hBuildingItem,nRoomNum);if(hCellItem==NULL)return;CTreeCtrl*pCtrl=&GetTreeCtrl();TV_INSERTSTRUCTTCItem;//插入数据项数据结构TCItem.hParent=hCellItem;TCItem.hInsertAfter=TVI_LAST;TCItem.item.mask=TVIF_TEXT|TVIF_PARAM|TVIF_IMAGE|TVIF_SELECTEDIMAGE;//设屏蔽TCItem.item.lParam=0;//序号TCItem.item.iImage=3;//正常图标TCItem.item.iSelectedImage=3;//选中时图标CStringstr;str.Format("%d号床铺",nBedNum);TCItem.item.pszText=(LPTSTR)(LPCTSTR)str;pCtrl->InsertItem(&TCItem);pCtrl->SortChildren(hCellItem);}//将宿舍类型加到树视图中HTREEITEMCLeftTreeView::AddSectionToTree(CStringstrStudentName){CTreeCtrl*pCtrl=&GetTreeCtrl();HTREEITEMhRootItem=pCtrl->GetRootItem();if(hRootItem)60 {while(hRootItem){CStringstrItemText=pCtrl->GetItemText(hRootItem);if(strItemText==strStudentName)returnhRootItem;hRootItem=pCtrl->GetNextSiblingItem(hRootItem);}}TV_INSERTSTRUCTTCItem;//插入数据项数据结构TCItem.hParent=TVI_ROOT;TCItem.hInsertAfter=TVI_LAST;TCItem.item.mask=TVIF_TEXT|TVIF_PARAM|TVIF_IMAGE|TVIF_SELECTEDIMAGE;//设屏蔽TCItem.item.lParam=0;//序号TCItem.item.iImage=0;//正常图标TCItem.item.iSelectedImage=0;//选中时图标TCItem.item.pszText=(LPTSTR)(LPCTSTR)strStudentName;HTREEITEMhSectionItem=pCtrl->InsertItem(&TCItem);pCtrl->SortChildren(TVI_ROOT);returnhSectionItem;}HTREEITEMCLeftTreeView::AddBuildingToTree(HTREEITEMhSectionItem,intnBuildingnum){if(hSectionItem==NULL)returnNULL;CTreeCtrl*pCtrl=&GetTreeCtrl();CStringstrBuildingNum;strBuildingNum.Format("%d号楼",nBuildingnum);if(pCtrl->ItemHasChildren(hSectionItem)){HTREEITEMhItem=pCtrl->GetChildItem(hSectionItem);while(hItem){CStringstrItemText=pCtrl->GetItemText(hItem);if(strItemText==strBuildingNum)returnhItem;hItem=pCtrl->GetNextSiblingItem(hItem);}}TV_INSERTSTRUCTTCItem;//插入数据项数据结构60 TCItem.hParent=hSectionItem;TCItem.hInsertAfter=TVI_LAST;TCItem.item.mask=TVIF_TEXT|TVIF_PARAM|TVIF_IMAGE|TVIF_SELECTEDIMAGE;//设屏蔽TCItem.item.lParam=0;//序号TCItem.item.iImage=1;//正常图标TCItem.item.iSelectedImage=1;//选中时图标TCItem.item.pszText=(LPTSTR)(LPCTSTR)strBuildingNum;HTREEITEMhBuildingItem=pCtrl->InsertItem(&TCItem);pCtrl->SortChildren(hSectionItem);returnhBuildingItem;}HTREEITEMCLeftTreeView::AddCellToTree(HTREEITEMhBuildingItem,intnRoomnum){if(hBuildingItem==NULL)returnNULL;CTreeCtrl*pCtrl=&GetTreeCtrl();CStringstrRoomNum;strRoomNum.Format("%d房间",nRoomnum);if(pCtrl->ItemHasChildren(hBuildingItem)){HTREEITEMhItem=pCtrl->GetChildItem(hBuildingItem);while(hItem){CStringstrItemText=pCtrl->GetItemText(hItem);if(strItemText==strRoomNum)returnhItem;hItem=pCtrl->GetNextSiblingItem(hItem);}}TV_INSERTSTRUCTTCItem;//插入数据项数据结构TCItem.hParent=hBuildingItem;TCItem.hInsertAfter=TVI_LAST;TCItem.item.mask=TVIF_TEXT|TVIF_PARAM|TVIF_IMAGE|TVIF_SELECTEDIMAGE;//设屏蔽TCItem.item.lParam=0;//序号TCItem.item.iImage=2;//正常图标TCItem.item.iSelectedImage=2;//选中时图标TCItem.item.pszText=(LPTSTR)(LPCTSTR)strRoomNum;HTREEITEMhCellItem=pCtrl->InsertItem(&TCItem);60 pCtrl->SortChildren(hBuildingItem);returnhCellItem;}voidCLeftTreeView::OnSelchanged(NMHDR*pNMHDR,LRESULT*pResult){NM_TREEVIEW*pNMTreeView=(NM_TREEVIEW*)pNMHDR;*pResult=0;//获得被选择项CTreeCtrl*pCtrl=&GetTreeCtrl();HTREEITEMhSelItem=pCtrl->GetSelectedItem();m_hHitItem=hSelItem;//如果没有项被选择,则将右边的列表视图清空CMainFrame*pFrame=(CMainFrame*)AfxGetApp()->m_pMainWnd;if(hSelItem==NULL){pFrame->SwitchToView(USERSVIEW);pFrame->m_pUsersView->ShowUsers("");return;}//判断选择项在树中的位置HTREEITEMhParentItem=pCtrl->GetParentItem(hSelItem);CStringstrSql,strStudentName,strBuildingNum,strRoomNum,strBedNum;if(hParentItem==NULL){//小区CStringstrStudentName=pCtrl->GetItemText(hSelItem);strSql.Format("select*fromhousewhereroomtype="%s"",strStudentName);pFrame->SwitchToView(USERSVIEW);pFrame->m_pUsersView->ShowUsers(strSql);return;}hParentItem=pCtrl->GetParentItem(hParentItem);if(hParentItem==NULL){//楼strStudentName=pCtrl->GetItemText(pCtrl->GetParentItem(hSelItem));CStringstr=pCtrl->GetItemText(hSelItem);intn=str.Find("号楼");strBuildingNum=str.Left(n);strSql.Format("select*fromhousewhereroomtype="%s"andbuildingnum=%s",strStudentName,strBuildingNum);60 pFrame->SwitchToView(USERSVIEW);pFrame->m_pUsersView->ShowUsers(strSql);return;}hParentItem=pCtrl->GetParentItem(hParentItem);if(hParentItem==NULL){//单元strStudentName=pCtrl->GetItemText(pCtrl->GetParentItem(pCtrl->GetParentItem(hSelItem)));CStringstr=pCtrl->GetItemText(pCtrl->GetParentItem(hSelItem));intn=str.Find("号楼");strBuildingNum=str.Left(n);str=pCtrl->GetItemText(hSelItem);n=str.Find("房间");strRoomNum=str.Left(n);strSql.Format("select*fromhousewhereroomtype="%s"andbuildingnum=%sandroomnum=%s",strStudentName,strBuildingNum,strRoomNum);pFrame->SwitchToView(USERSVIEW);pFrame->m_pUsersView->ShowUsers(strSql);return;}//选择项是房间号,则右边视图显示该住户的详细信息strStudentName=pCtrl->GetItemText(pCtrl->GetParentItem(pCtrl->GetParentItem(pCtrl->GetParentItem(hSelItem))));CStringstr=pCtrl->GetItemText(pCtrl->GetParentItem(pCtrl->GetParentItem(hSelItem)));intn=str.Find("号楼");strBuildingNum=str.Left(n);str=pCtrl->GetItemText(pCtrl->GetParentItem(hSelItem));n=str.Find("房间");strRoomNum=str.Left(n);strBedNum=pCtrl->GetItemText(hSelItem);pFrame->SwitchToView(USERINFOVIEW);pFrame->m_pUserinfoView->UpdateUserInfo(strStudentName,atoi(strBuildingNum.GetBuffer(0)),atoi(strRoomNum.GetBuffer(0)),atoi(strBedNum.GetBuffer(0)));}voidCLeftTreeView::OnOperateDelete(){if(m_hHitItem==NULL)60 return;CMainFrame*pFrame=(CMainFrame*)AfxGetApp()->m_pMainWnd;CInhabitantsDoc*pDoc=(CInhabitantsDoc*)GetDocument();CTreeCtrl*pCtrl=&GetTreeCtrl();HTREEITEMhParentItem=pCtrl->GetParentItem(m_hHitItem);CStringstrSql;if(hParentItem==NULL&&m_hHitItem!=NULL){//宿舍类型CStringstrStudentName=pCtrl->GetItemText(m_hHitItem);strSql.Format("delete*fromhousewhereroomtype="%s"",strStudentName);if(this->MessageBox("确定要删除该宿舍区中的所有学生吗?","学生宿舍管理系统",MB_YESNO)==IDNO)return;}elseif(hParentItem!=NULL&&pCtrl->GetParentItem(hParentItem)==NULL){//楼CStringstrStudentName=pCtrl->GetItemText(pCtrl->GetParentItem(m_hHitItem));CStringstr=pCtrl->GetItemText(m_hHitItem);intn=str.Find("号楼");CStringstrBuildingNum=str.Left(n);strSql.Format("delete*fromhousewhereroomtype="%s"andbuildingnum=%s",strStudentName,strBuildingNum);if(this->MessageBox("确定要删除该楼中的所有学生吗?","学生宿舍管理系统",MB_YESNO)==IDNO)return;}elseif(pCtrl->GetParentItem(hParentItem)!=NULL&&pCtrl->GetParentItem(pCtrl->GetParentItem(hParentItem))==NULL){//房间CStringstrStudentName=pCtrl->GetItemText(pCtrl->GetParentItem(pCtrl->GetParentItem(m_hHitItem)));CStringstr=pCtrl->GetItemText(pCtrl->GetParentItem(m_hHitItem));intn=str.Find("号楼");CStringstrBuildingNum=str.Left(n);str=pCtrl->GetItemText(m_hHitItem);n=str.Find("房间");CStringstrRoomNum=str.Left(n);strSql.Format("delete*fromhousewhereroomtype="%s"andbuildingnum=%sandroomnum=%s",strStudentName,strBuildingNum,strRoomNum);if(this->MessageBox("确定要删除该房间中的所有学生吗?","学生宿舍管理系统",MB_YESNO)==IDNO)return;60 }else{//学生CStringstrStudentName=pCtrl->GetItemText(pCtrl->GetParentItem(pCtrl->GetParentItem(pCtrl->GetParentItem(m_hHitItem))));CStringstr=pCtrl->GetItemText(pCtrl->GetParentItem(pCtrl->GetParentItem(m_hHitItem)));intn=str.Find("号楼");CStringstrBuildingNum=str.Left(n);str=pCtrl->GetItemText(pCtrl->GetParentItem(m_hHitItem));n=str.Find("房间");CStringstrRoomNum=str.Left(n);CStringstrBedNum=pCtrl->GetItemText(m_hHitItem);strSql.Format("delete*fromhousewhereroomtype="%s"andbuildingnum=%sandroomnum=%sandbednum=%s",strStudentName,strBuildingNum,strRoomNum,strBedNum);if(this->MessageBox("确定要删除该学生吗?","学生宿舍管理系统",MB_YESNO)==IDNO)return;}pDoc->DeleteUser(strSql);AddUsersToTree();}voidCLeftTreeView::OnUpdateOperateDelete(CCmdUI*pCmdUI){pCmdUI->Enable(m_hHitItem!=NULL);}CMainFrame类:主框架类成员变量:public继承:CLeftTreeView*m_pLeftView;//树视图CUsersListView*m_pUsersView;//学生列表视图CUserinfoView*m_pUserinfoView;//学生详细信息视图protected继承:CStatusBarm_wndStatusBar;//状态栏CToolBarm_wndToolBar;//工具栏CSplitterWndm_wndSplitter;消息处理函数:60 BOOLCMainFrame::OnCreateClient(LPCREATESTRUCTlpcs,CCreateContext*pContext){//returnCFrameWnd::OnCreateClient(lpcs,pContext);if(!m_wndSplitter.CreateStatic(this,1,2))returnFALSE;if(!m_wndSplitter.CreateView(0,0,RUNTIME_CLASS(CLeftTreeView),CSize(100,100),pContext))returnFALSE;if(!m_wndSplitter.CreateView(0,1,RUNTIME_CLASS(CUsersListView),CSize(100,100),pContext))returnFALSE;m_pLeftView=(CLeftTreeView*)m_wndSplitter.GetPane(0,0);m_pUsersView=(CUsersListView*)m_wndSplitter.GetPane(0,1);returnTRUE;}/***************************************功能:切换右边的视参数:nViewType=0CUsersListView1CUserinfoView*/voidCMainFrame::SwitchToView(intnViewType){CView*pView=(CView*)m_wndSplitter.GetPane(0,1);CRectrcRight,rcFrame;pView->GetClientRect(&rcRight);GetClientRect(&rcFrame);switch(nViewType){caseUSERSVIEW://CUsersListView{if(!pView->IsKindOf(RUNTIME_CLASS(CUsersListView))){m_wndSplitter.DeleteView(0,1);m_wndSplitter.CreateView(0,1,RUNTIME_CLASS(CUsersListView),CSize(rcRight.Width(),rcRight.Height()),NULL);m_wndSplitter.RecalcLayout();m_pUsersView=(CUsersListView*)m_wndSplitter.GetPane(0,1);}break;}60 caseUSERINFOVIEW://CUserinfoView{if(!pView->IsKindOf(RUNTIME_CLASS(CUserinfoView))){m_wndSplitter.DeleteView(0,1);m_wndSplitter.CreateView(0,1,RUNTIME_CLASS(CUserinfoView),CSize(rcRight.Width(),rcRight.Height()),NULL);m_wndSplitter.RecalcLayout();m_pUserinfoView=(CUserinfoView*)m_wndSplitter.GetPane(0,1);}break;}default:break;}}//增加学生voidCMainFrame::OnOperateAdduser(){CAddUserDlgdlg;dlg.DoModal();}//查询学生voidCMainFrame::OnOperateQuery(){CQueryDlgdlg;if(dlg.DoModal()==IDOK){BOOLbIsFirst=TRUE;CStringstrSql,strRoomtype,strBuildingnum,strRoomnum,strBednum,strStudentname,strHomeTel,strSex,strMajor,strId,strRemarks;//判断宿舍类型是否输入了条件if(dlg.m_strStudentName!=""){strRoomtype="roomtype=""+dlg.m_strStudentName+""";bIsFirst=FALSE;}elsestrRoomtype="";//判断楼号是否输入了条件if(dlg.m_nBuildingNum!=0)60 {if(bIsFirst==TRUE)strBuildingnum.Format("buildingnum=%d",dlg.m_nBuildingNum);elsestrBuildingnum.Format("andbuildingnum=%d",dlg.m_nBuildingNum);bIsFirst=FALSE;}elsestrBuildingnum="";//判断房间号是否输入了条件if(dlg.m_nRoomNum!=0){if(bIsFirst==TRUE)strRoomnum.Format("roomnum=%d",dlg.m_nRoomNum);elsestrRoomnum.Format("androomnum=%d",dlg.m_nRoomNum);bIsFirst=FALSE;}//判断床铺号是否输入了条件if(dlg.m_nBedNum!=0){if(bIsFirst==TRUE)strBednum.Format("bednum=%d",dlg.m_nBedNum);elsestrBednum.Format("andbednum=%d",dlg.m_nBedNum);bIsFirst=FALSE;}//判断房主是否输入了条件if(dlg.m_strStudentname!=""){if(bIsFirst==TRUE)strStudentname="studentname=""+dlg.m_strStudentname+""";elsestrStudentname="andstudentname=""+dlg.m_strStudentname+""";bIsFirst=FALSE;}//判断宿舍电话是否输入了条件if(dlg.m_strHomeTel!=""){if(bIsFirst==TRUE)60 strHomeTel="housetel=""+dlg.m_strHomeTel+""";elsestrHomeTel="andhousetel=""+dlg.m_strHomeTel+""";bIsFirst=FALSE;}//判断性别是否输入了条件if(dlg.m_strSex!=""){if(bIsFirst==TRUE)strSex="sex=""+dlg.m_strSex+""";elsestrSex="andsex=""+dlg.m_strSex+""";bIsFirst=FALSE;}//判断专业是否输入了条件if(dlg.m_strMajor!=""){if(bIsFirst==TRUE)strMajor="major=""+dlg.m_strMajor+""";elsestrMajor="andmajor=""+dlg.m_strMajor+""";bIsFirst=FALSE;}//判断学号是否输入了条件if(dlg.m_strId!=""){if(bIsFirst==TRUE)strId="id=""+dlg.m_strId+""";elsestrId="andid=""+dlg.m_strId+""";bIsFirst=FALSE;}//判断remarks是否输入了条件if(dlg.m_strRemarks!=""){if(bIsFirst==TRUE)strRemarks="remarks=""+dlg.m_strRemarks+""";elsestrRemarks="andremarks=""+dlg.m_strRemarks+""";bIsFirst=FALSE;60 }//生成完整的查询条件if(bIsFirst==TRUE)//没有输入任何条件strSql="select*fromhouse";elsestrSql="select*fromhousewhere"+strRoomtype+strBuildingnum+strRoomnum+strBednum+strStudentname+strHomeTel+strSex+strMajor+strId+strRemarks;//切换到CUsersListView,根据查询条件显示学生SwitchToView(USERSVIEW);m_pUsersView->ShowUsers(strSql);}}CQueryDlg类:类视图如右图,IDD具体名为IDD_DIALOG_QUERY,该类关联的是软件的“查询住户”对话框:对话框中每个控件的ID同“添加住户”对话框中每个控件ID。在本类中添加的成员变量(也同CAddUserDlg类)CStringm_strMajor;intm_nBuildingNum;intm_nRoomNum;CStringm_strRemarks;CStringm_strHomeTel;CStringm_strStudentname;CStringm_strId;CStringm_strSex;60 CStringm_strNationNal;intm_nBedNum;CStringm_strStudentName;消息处理函数:voidCQueryDlg::OnOK(){CDialog::OnOK();}voidCQueryDlg::OnClickTree2(NMHDR*pNMHDR,LRESULT*pResult){//TODO:Addyourcontrolnotificationhandlercodehere*pResult=0;}voidCQueryDlg::OnSelchangeList3(){//TODO:Addyourcontrolnotificationhandlercodehere}CUserinfoView类:用户信息视图类,对应用户信息的对话框:对话框中每个控件ID同CAddUserDlg类,添加的成员变量也同CAddUserDlg类。其构造函数和析构函数以及DoDataExchange函数基本同CAddUserDlg类。60 消息处理函数:voidCUserinfoView::UpdateUserInfo(CStringstrStudentName,intnBuildingNum,intnRoomNum,intnBedNum){//查询该学生CStringstrSql;strSql.Format("select*fromhousewhereroomtype="%s"andbuildingnum=%dandroomnum=%dandbednum=%d",strStudentName,nBuildingNum,nRoomNum,nBedNum);CInhabitantsDoc*pDoc=(CInhabitantsDoc*)GetDocument();CCommand>dbHouse;long*pCount=newlong;if(dbHouse.Open(pDoc->m_dbHouse.m_session,strSql,NULL,pCount)!=S_OK){AfxMessageBox("error");deletepCount;return;}//显示信息if(dbHouse.MoveFirst()==S_OK){m_strStudentname=dbHouse.m_studentname;m_strRoomtype=dbHouse.m_roomtype;m_nBuildingnum=dbHouse.m_buildingnum;m_nRoomnum=dbHouse.m_roomnum;m_nBednum=dbHouse.m_bednum;m_strHouseTel=dbHouse.m_housetel;m_strSex=dbHouse.m_sex;m_strNationNal=dbHouse.m_national;m_strMajor=dbHouse.m_major;m_strId=dbHouse.m_id;m_strRemarks=dbHouse.m_remarks;}dbHouse.Close();UpdateData(FALSE);}voidCUserinfoView::OnChangeEditRemarks(){//TODO:IfthisisaRICHEDITcontrol,thecontrolwillnot//sendthisnotificationunlessyouoverridetheCFormView::OnInitDialog()60 //functionandcallCRichEditCtrl().SetEventMask()//withtheENM_CHANGEflagORedintothemask.//TODO:Addyourcontrolnotificationhandlercodehere}CUserListView类:用户信息列表类消息处理函数:voidCUsersListView::SetListCtrlStyle(){DWORDdwStyle=GetWindowLong(m_hWnd,GWL_STYLE);dwStyle&=~(LVS_TYPEMASK);dwStyle&=~(LVS_EDITLABELS);//Makesurewehavereportviewandsendeditlabelmessages.SetWindowLong(m_hWnd,GWL_STYLE,dwStyle|LVS_REPORT|LVS_NOLABELWRAP|LVS_SHOWSELALWAYS);//Enablethefullrowselectionandthedragdropofheaders.DWORDstyles=LVS_EX_FULLROWSELECT|LVS_EX_GRIDLINES;//UsemacrosincethisisnewandnotinMFC.ListView_SetExtendedListViewStyleEx(m_hWnd,styles,styles);}voidCUsersListView::SetTitle(){TCHARrgtsz[5][10]={_T("学生姓名"),_T("宿舍类型"),_T("所属楼号"),_T("所属房间"),_T("床铺号")};LV_COLUMNlvcolumn;CRectrect;this->GetWindowRect(&rect);for(inti=0;i<5;i++){lvcolumn.mask=LVCF_FMT|LVCF_SUBITEM|LVCF_TEXT60 |LVCF_WIDTH|LVCF_ORDER;lvcolumn.fmt=LVCFMT_LEFT;lvcolumn.pszText=rgtsz[i];lvcolumn.iSubItem=i;lvcolumn.iOrder=i;lvcolumn.cx=rect.Height()/3;GetListCtrl().InsertColumn(i,&lvcolumn);}}voidCUsersListView::OnInitialUpdate(){CListView::OnInitialUpdate();SetListCtrlStyle();SetTitle();}voidCUsersListView::ShowUsers(CStringstrSql){CListCtrl*p=&GetListCtrl();//清空列表p->DeleteAllItems();if(strSql=="")return;CInhabitantsDoc*pDoc=(CInhabitantsDoc*)GetDocument();CCommand>dbHouse;long*pCount=newlong;//按照strSql查询符合条件的学生if(dbHouse.Open(pDoc->m_dbHouse.m_session,strSql,NULL,pCount)!=S_OK){AfxMessageBox("error");deletepCount;return;}intiItem=0;LV_ITEMlvitem;intiActualItem=0;//将查询得到的学生都逐个加入列表中if(dbHouse.MoveFirst()==S_OK){60 do{for(intiSubItem=0;iSubItem<5;iSubItem++){lvitem.mask=LVIF_TEXT|(iSubItem==0?LVIF_IMAGE:0);lvitem.iItem=(iSubItem==0)?iItem:iActualItem;lvitem.iSubItem=iSubItem;lvitem.iImage=(iItem%2)?0:2;CStringstr="";switch(iSubItem){case0://学生str=dbHouse.m_studentname;lvitem.pszText=(LPTSTR)(LPCTSTR)str;break;case1://宿舍类型{str=dbHouse.m_roomtype;lvitem.pszText=(LPTSTR)(LPCTSTR)str;break;}case2://楼号{str.Format("%d",dbHouse.m_buildingnum);lvitem.pszText=(LPTSTR)(LPCTSTR)str;break;}case3://房间号{str.Format("%d",dbHouse.m_roomnum);lvitem.pszText=(LPTSTR)(LPCTSTR)str;break;}case4://床铺号{str.Format("%d",dbHouse.m_bednum);lvitem.pszText=(LPTSTR)(LPCTSTR)str;}}if(iSubItem==0)iActualItem=GetListCtrl().InsertItem(&lvitem);elseGetListCtrl().SetItem(&lvitem);}60 iItem++;}while(dbHouse.MoveNext()==S_OK);}dbHouse.Close();}voidCUsersListView::OnLButtonDblClk(UINTnFlags,CPointpoint){CListView::OnLButtonDblClk(nFlags,point);//获得双击的项CListCtrl*pCtrl=&GetListCtrl();intnHitItem=pCtrl->HitTest(point,NULL);if(nHitItem<0)return;CStringstrStudentName=pCtrl->GetItemText(nHitItem,1);CStringstrBuildingNum=pCtrl->GetItemText(nHitItem,2);CStringstrRoomNum=pCtrl->GetItemText(nHitItem,3);CStringstrBedNum=pCtrl->GetItemText(nHitItem,4);CMainFrame*pFrame=(CMainFrame*)AfxGetApp()->m_pMainWnd;CInhabitantsDoc*pDoc=(CInhabitantsDoc*)GetDocument();pFrame->SwitchToView(USERINFOVIEW);pFrame->m_pUserinfoView->UpdateUserInfo(strStudentName,atoi(strBuildingNum.GetBuffer(0)),atoi(strRoomNum.GetBuffer(0)),atoi(strBedNum.GetBuffer(0)));}voidCUsersListView::OnOperateDelete(){CListCtrl*pCtrl=&GetListCtrl();POSITIONpos=pCtrl->GetFirstSelectedItemPosition();if(pos==NULL){AfxMessageBox("请选择要删除的学生");return;}if(this->MessageBox("你真的要删除选择的所有学生吗?","学生宿舍管理系统",MB_YESNO)==IDNO)return;//删除选择的所有学生60 while(pos){intnHitItem=pCtrl->GetNextSelectedItem(pos);CStringstrStudentName=pCtrl->GetItemText(nHitItem,1);CStringstrBuildingNum=pCtrl->GetItemText(nHitItem,2);CStringstrRoomNum=pCtrl->GetItemText(nHitItem,3);CStringstrBedNum=pCtrl->GetItemText(nHitItem,4);CStringstrSql;strSql.Format("delete*fromhousewhereroomtype="%s"andbuildingnum=%sandroomnum=%sandbednum=%s",strStudentName,strBuildingNum,strRoomNum,strBedNum);CInhabitantsDoc*pDoc=(CInhabitantsDoc*)GetDocument();pDoc->DeleteUser(strSql);}CMainFrame*pFrame=(CMainFrame*)AfxGetApp()->m_pMainWnd;pFrame->m_pLeftView->AddUsersToTree();}voidCUsersListView::OnUpdateOperateDelete(CCmdUI*pCmdUI){pCmdUI->Enable(GetListCtrl().GetFirstSelectedItemPosition()!=NULL);}结构体student的定义:typedefstructstudent{public:CStringstrName;//学生姓名CStringstrSex;//学生性别CStringstrNationNal;//入学年份CStringstrMajor;//专业CStringstrId;//学号CStringstrRoomtype;//宿舍类型intnBuildingnum;//宿舍楼号intnRoomnum;//房间号intnBednum;//床位号CStringstrHouseTel;//宿舍电话CStringstrRemarks;//备注信息HTREEITEMhItem;//树形节点}STUDENT;60 资源视图中主菜单:主菜单界面如图所示:系统维护选项:1、增加住户:ID:ID_OPERATE_ADDUSER事件处理函数:voidCMainFrame::OnOperateAdduser()【见P23页】2、删除住户:ID:ID_OPERATE_DELETE事件处理函数:voidCLeftTreeView::OnOperateDelete()voidCLeftTreeView::OnUpdateOperateDelete(CCmdUI*pCmdUI)【见P20页】voidCUsersListView::OnOperateDelete()【见P33页】,3、查询住户ID:ID_OPERATE_QUERY事件处理函数:voidCMainFrame::OnOperateQuery()【见P24页】4、退出查看选项:1、工具栏2、状态栏版权信息:关于60 程序维护手册1.引言¨编写目的软件维护是软件生命周期的最后一个阶段,它处于系统投入生产性运行以后的时期中,因此不属于系统开发过程。软件维护需要的工作量非常大,虽然在不同应用领域维护成本差别很大,但是,平均说来,大型软件的维护成本高达开发成本的四倍左右。目前国外许多软件开发组织把60%以上的人力用于维护已有的软件,而且随着软件数量增多和使用寿命延长,这个百分比还在持续上升。软件维护就是在软件已经交付使用之后,为了改正错误或者满足新的需要而修改软件的过程。它有如下几种性质的维护:l改正性维护因为软件测试不可能暴露出一个大型软件系统中所有潜藏的错误,所以在使用期间,用户必然会发现程序错误,并且把他们遇到的问题报告给维护人员。我们把诊断和改正错误的过程称为改正性维护。l适应性维护计算机科学技术领域的各方面都在迅速进步,需要经常地修改版本。为了和变化了的环境适当地配合而进行的修改软件的活动称为适应性维护。l完善性维护在软件编写完成之后,投入实践,在使用软件的过程中,用户往往提出增加新功能或修改已有的功能的建议,这就需要进行完善性维护。l预防性维护为了改进未来的可维护性或可靠性,或为了给未来的改进奠定更好的基础而修改软件时,就需要进行预防性维护。维护的过程本质上是修改和压缩了的软件定义和开发过程,而且事实上远在提出一项维护要求之前,与软件维护有关的工作已经开始了。鉴于以上各点,编写维护软件的文档十分重要。它给软件维护人员提供了一份完整,清晰的说明文档,便于其快速有效地进行维护工作。¨开发单位项目的提出者:金飞腾、古龙、刘虎林开发者:金飞腾、古龙、刘虎林用户:学校使用场所:学生宿舍¨定义和缩写2.系统说明¨系统用途添加住户:添加学生住宿基本信息。删除住户:删除一个或者一组学生的基本信息。查询住户:按一定条件查询住户的信息并列表显示。60 2.操作环境¨设备安装有Windows系统的电脑。¨支持软件支持常用的数据库应用软件:MicrosoftAccess数据库¨数据库标识符:姓名,性别,入学年份,学号,专业,宿舍类型,楼号,房间号,床铺号,宿舍电话,备注。静态数据:存储在硬盘上的数据。动态数据:正处于处理过程中的数据。数据库的存储媒体:硬盘。1.维护过程¨规则1.设计原则1.密切结合结构(数据)设计和行为(处理)设计。2.有机结合硬件,软件,技术和管理的界面。3.具体程序实现过程中,对记录,字段的引用参照PersInfo类。4.存储区的标识符也参照PersInfo类。5.在设计过程中参照瀑布模型,ER模型,层次图,Jackson程序设计方法。2.设计程序变更的准则1.检查可供选择的设计方案,寻找一种与程序的原始设计原理相容的变更设计。2.努力使设计简化。3.能满足可变性要求的设计。4.不降低程序质量。5.用可测试的并具备测试方法的术语描述设计。6.考虑处理时间,存储量和操作过程方面的变化。7.考虑标更对用户服务的干扰以及实施变更的代价与时间。3.修改程序代码的准则1.必须要先熟悉整个程序的控制流程。2.不要做不必要的修改。3.不影响原始程序的风格和相容性。4.记录所作过的修改。5.审查软件质量是否符合标准。6.更新程序文档以反映修改并保留修改前的程序代码版本。4.重新验证程序的准则1.首先测试程序故障,然后测试程序的未改动部分,最后测试程序的修改部分。2.不允许做修改的维护程序员成为唯一的重新验证程序的人。3.鼓励终端用户参与到重新测试进程中来。4.在重新验证进程中,记录出错的次数与类型,并把结果同所提供的测试功能进行比较,以便估量出程序是否退化。¨验证过程60 每当软件被修改后,都要校验其正确性。维护员应该有选择地作些重新测试工作,不仅要证实新的逻辑的正确性,而且要校验实程序的为修改部分是否无损害,并且整个程序运行正确。若发现错误,则要马上进行修正。¨出错及纠正方法查询系统模块的更正:问题发现:在测试系统时发现,查询住户对话框中查询条件“入学时间”修改较复杂,必须修改对应正确的时间,在输入其他信息才可以进行查询,比较繁琐。问题修正:取消在查询时对“入学时间”条件的判断。删除代码://判断入学年份是否输入了条件if(dlg.m_strNationNal!=""){if(bIsFirst==TRUE)strNationNal="national=""+dlg.m_strNationNal+""";elsestrNationNal="andnational=""+dlg.m_strNationNal+""";bIsFirst=FALSE;}并删除相应的变量,调试后发现问题解决。60'