1、成绩课 程 设 计课程名称 数据库系统课程设计题目名称学生学院专业班级学 号学生姓名指导教师2013 年 1 月评价标准分数比例()成绩论文论文结构包含:1、相关技术介绍、需求分析、2、概念结构设计(涉及的实体至少三个以上)、3、逻辑结构设计(有完整性约束说明)、4、数据库物理设计、5、数据库完整性设计(违反实体、参照完整性时的解决办法,比如触发器、存储过程等)5、数据库安全性设计、6、数据库实施、系统测试方案和测试报告、7、系统的主要功能和使用说明、系统安装说明。要求论文完整、内容详细,格式规范.40程序1、 系统运行正确;2、功能完善:有增、删、改、查功能,输入、输出功能;3、有基本的统计
2、、报表功能4、有多表连接查询、自身连接查询、字符串匹配查询、模糊查询、分组查询等。5、工作量充分;6、系统实现技术的难度。30数据库设计E-R图设计正确;数据库逻辑结构设计规范化;数据库物理设计合理.30总评成绩优 良中及格不及格总分19目录1绪论11。1课题背景及现实意义11。2航空票务管理系统简介11。2。1 定义11。2.2 主要功能11。2。3 重要性11。3 开发技术介绍22 系统需求分析设计42.1需求分析的目的42.2 系统需求分析42.2.1 系统功能需求42.2。2 软件运行环境42。3数据流图52。3。1 数据流图介绍52。3.2 系统数据流图53 系统整体设计73.1 系
3、统分析与设计73.2 系统功能模块设计图73。3 数据库设计74详细设计154.1 数据库连接154.2举例航班管理代码174。2。1 航班管理界面初始化174。2。3新增航班的实现214。2。4撤销航班的实现234。2。5修改航班的实现264。3购买机票284.3。1 选择机票并确认购买284。3.2 填写客户信息294.4其他界面与功能305 课程设计小结33参考文献341绪论1。1课题背景及现实意义随着科技的发展和人们生活水平的日益提高,人们在不断追求更加快捷的交通方式以满足人们快节奏的生活方式,航空系统在交通系统中已扮演着一个越来越重要的角色。然而,交通的快捷离不开信息的快捷。随着随着
4、计算机的发展和普及,人们的生活方式发生了巨大的改变,计算机在代替和延伸脑力劳动方面发挥着越来越重要的作用.在交通系统中,有大量的数据需要被处理,而这些工作有人来完成几乎是不可能的,而交给计算机处理,就可以很好地满足我们的需求.航空售票管理系统可以根据乘客和管理人员的要求,进行方便快速的查询、购票、退票和管理等工作。本文介绍了简易航空售票管理系统的实现过程。1。2航空票务管理系统简介1。2。1定义航空票务管理系统中主要包括了用户的基本信息(用户名、密码、权限),客户信息(姓名、性别、身份证号、联系电话、备注等),航班信息(航班编号、出发城市、到达城市等).可以添加、查询、修改、删除各表的基本信息
5、,满足客户购买机票、退票等多种需求。一切的统计和计算都计算机代为管理了,航空票务管理系统对企业的合理化管理起到了很大的作用,它为企业信息化的建设打响了头炮,企业的信息化建设已成为现代各个企业发展的需要。1。2.2主要功能本系统主要功能有:(1)系统登录(用户名与密码)(2)客户信息(客户信息修改与添加、查询、删除)(3)航班信息(航班信息的增加、撤销、修改)(4)订单信息(查看订单的情况,退票) (5)购买机票(选择对应的机票并且购买)(6)关于(显示版权信息) 1.2。3重要性 实践证明,一个企业中管理与效益是息息相关的,实现数据规范化、自动化的电脑管理,是一个管理规范、运作高效的企事业单位
6、的必然要求.随着现代科技的进步,用计算机来进行票务管理也成为现代化企业运作必不可少的一部分。 使用计算机来进行票务的管理的主要有以下几个方面好处:(1)大大降低了工作人员的工作量,提高了工作效率;(2)节省成本,包括人力资源;(3)安全准确的购票、管理航班的作用;1.3开发技术介绍航空票务管理系统的开发平台和工具为:后台数据库使用SQL Server 2008,前台开发工具使用VS2010。1、VS2010是一个功能强大的可视化应用程序开发工具,用于Windows环境下32位的应用程序的开发,是计算机界公认的最优秀的应用开发工具之一。在提供可视化的编程方式的同时,VS2010也适用于编写直接对
7、系统底层操作的程序,生成代码的质量也优于其它的开发工具。在VS2010环境下,利用Microsoft的基本类库MFC(Microsoft Foundation Class Library),可以使用完全的面向对象的方法来进行Windows应用程序的开发,使得Windows程序员从大量的复杂劳动中解救出来,体会到真正的程序语言的强大功能和良好的灵活性2.VS2010编程是一个面向对象的程序设计方法.同传统的结构化程序设计方法相比,它缩短软件的研制时间,提高软件的开发效率,使程序员可以更好地理解和管理庞大而复杂的程序。面向对象的程序设计吸取了结构化程序设计的精华,它利用了人们根据对事物分类和抽象的
8、倾向,引入了类和对象的概念,具有封装性(数据抽象)、继承和多态的特点。与结构化程序设计不同的是,面向对象程序设计是用类抽象代表现实的实体,用类之间的继承关系表示程序设计的抽象过程.函数只是对数据的操作,没有数据的概念,而类是数据和数据操作的集合,由于面向对象的程序设计方法非常近现实,所以越来越流行.VS2010中集成了大量的最新技术,如ActiveX、COM等技术,程序开发人员可以紧紧地把握住软件开发技术发展的方向,开发出功能强大的应用程序。VS2010还提供了丰富的技术资源,MSDN(Microsoft Develop Network)提供了强大的联机帮助支持,同时还可以通过访问Micros
9、oft的网上站点来获得最新的技术文档。2、SQL Server是一个关系数据库管理系统,SQL Server是一个全面的数据库平台,使用集成的商业智能(BI)工具提供了企业级的数据管理.SQL Server数据库引擎为关系型数据和结构化数据提供了更安全可靠的存储功能,方便安全可靠地构建和管理用于业务的高可用和高性能的数据应用程序。SQL Server特点5:(1)真正的客户机/服务器体系结构。 (2)图形化用户界面,使系统管理和数据库管理更加直观、简单。 (3)丰富的编程接口工具,为用户进行程序设计提供了更大的选择余地. (4)SQL Server与Windows NT完全集成,利用了NT的许
10、多功能,如发送和接受消息,管理登录安全性等.SQL Server也可以很好地与Microsoft BackOffice产品集成。 (5)具有很好的伸缩性,可跨越多种平台使用。 2 系统需求分析设计2.1需求分析的目的软件的需求分析必须要有对原业务的一个深入了解、提取、抽象、升华的过程,管理软件需求分析尤其如此。 软件的需求分析是从用户的业务中提取出软件系统能够帮助用户解决的业务问题,通过对用户业务问题的分析,规划出我们的软件产品。这个步骤是对用户业务需求的一个升华,是一个把用户业务管理流程优化,转化为软件产品,从而提升管理而实现的质的飞跃,这一步是否成功,直接关系到开发出来的软件产品能否得到用
11、户认可,顺利交付给客户,客户能否真正运用我们的产品帮助他解决业务或管理问题。 按照软件工程对软件开发过程的描述,需求阶段细分为需求调研和需求分析两个小阶段,需求调研需要充分细致的了解客户目标,用户业务内容、流程等,这是一个对需求的采集过程,是进行需求分析的基础准备.2。2 系统需求分析2。2.1系统功能需求航空票务管理系统中主要要解决的是:1、用户在登录应用程序界面时,检查用户的合法性,并根据用户的权限为其分配功能。2、本系统可以由售票员、经理、总经理几个身份进入,不同身份拥有不同权限。例如,只有总经理可以在航班管理中修改和撤销航班,只有经理以上才能退票。而售票员只能售票.3、系统管理员可以通
12、过应用程序对用户信息进行统一管理,进行各种信息的修改与操作。4、应用程序内部要可以通过SQL语句对数据库内的数据进行更新、插入(增加)、修改和删除等操作。5、当系统管理员对相关信息进行操作时,系统要自动检测输入的数据是否合理,并弹出相应的提示信息.6、应用程序中要有该程序的相关简介和使用说明,帮助系统管理员和用户更好地使用该程序。2。2.2软件运行环境操作系统:Windows Xp、Windows 7Cpu: Intel Celeron 448MHz或更高配置内存: 256M或更大硬盘: 100M或更大空间2.3 数据流图2.3。1数据流图介绍数据流图也称为数据流程图date flow dia
13、gram , DFD,是一种便于用户理解和分析系统数据流程的图形工具,摆脱了系统和具体内容,精确的在逻辑上描述系统的功能、输入、输出和数据存储等,是系统逻辑模型的重要组成部分.数据流图的基本组成成分:(1)数据流:是由一组固定成分的数据组成,表示数据的流向。值得注意的是,数据流图中描述的是数据流,而不是控制流。除了流向数据存储或从数据存储流出的数据不必命名外,每个数据流必须要有一个合适的名字,以反映该数据流的含义.(2)加工:加工描述了输入数据流到输出数据之间的变换,也就是输入数据流经过什么处理后变成了输出数据。每个加工都有一个名字和编号.编号能反映该加工位于分层的数据流图的哪个层次和哪张图中
14、,能够看出它是由哪个加工分解出来的子加工.(3)数据存储:数据存储表示暂时存储的数据。每个数据存储都有一个名字。(4)外部实体:外部实体是存在于软件系统之外的人员或组织,指出数据所需要的发源地或系统所产生的数据的归属地。2。3。2系统数据流图管理员用户管理信息航空票务管理系统 数存取 据 获取 库客户客户订购信息文 件图2。1 数据流图图2.2 数据流图3 系统整体设计3.1 系统分析与设计基于上面的分析,按照软件工程的思想,对航空票务管理系统进行功能分析:(1)实现系统登录功能;(2)输入客户基本信息,包括姓名、性别、身份证等;(3)浏览和修改航班信息;(4)购买机票;(5)查询订单和退票;
15、(6)查询航班信息3.2 系统功能模块设计图通过各种系统的分析,得到了航空票务管理系统的主要功能模块及其关系,如图3。1所示:航空票务管理系统关于版权模块设置用户模块密码修改模块相关查询模块航班管理信息订单购买信息客户基本信息系统登录信息图3。1 系统功能模块设计图3。3 数据库设计一个成功的管理系统,是由:50% 的业务 +50 的软件 所组成,而 50% 的成功软件又有 25 的数据库 + 25 的程序 所组成,数据库设计的好坏是一个关键。如果把企业的数据比做生命所必需的血液,那么数据库的设计就是应用中最重要的一部分。基于上述原因,系统的数据库采用熟悉的MSSQL2008,并以简单、高效为
16、基本原则对系统数据库进行了分析和设计。3.3.1数据库概念设计由于ER模型与人们认识现实世界的相似形,因此在描述数据库的概念结构或全局逻辑结构时,采用ER图这种图形化的表示有非常大的好处,一是图形化表示的简单性;二是图形化表示的清晰性6。通过详细的研究和分析,按照企业的一般的要求和运作程序,得到基本的实体关系图如图3.2所示。图3。2ER图3。3。2数据库逻辑设计基于之前的详细模块及功能设计,系统需要设计到下列各表,这些表共同存储着系统所需要的数据。在设计数据库表的过程中,主要遵循以下几条原则:1、数据库设计一个表只存储一个实体或对象的相关信息,不同的实体存储在不同的数据表中;2、扩充信息和动
17、态变化的信息一定要分开在不同的表里;3、尽量避免出现多对多这样的表关系系统。因此需要建立以下几个数据库:员工信息表、出勤信息表、工资信息表、用户表。由于开发时使用的数据量较小,因此这些表都集中在同一个数据库中.(1)用户信息表中包括用户名、密码、权限字段。具体设置如表3.1所示。表3。1 用户信息表字段名数据类型说明用户Varchar(18)字段大小为18(主键)密码Varchar(18)字段大小为18权限int不允许NULL图3。3 用户表设计(2)客户信息表中包括姓名、性别、身份证号、客户电话、备注等字段。具体设置如表3。2所示。表3。2 客户信息表字段名数据类型说明姓名Varchar(2
18、0)not null性别Varchar(4)not null身份证号Varchar(18)(主键)客户电话Varchar (11)备注Varchar(50)图3.4 客户信息设计(3)航班信息表中包括航班编号、出发城市、到达城市、出发日期、机票价格、备注等字段.具体设置如表3。3所示。表3。3 工资信息表字段名数据类型说明航班编号Varchar(12)(主键)出发城市Varchar(50)not null到达城市Varchar(50)not null出发日期Varchar(50)not null机票价格intnot null备注Varchar(50)图3。5 航班信息设计(4)订单信息表中包括
19、订单号、航班编号、身份证号等字段.具体设置如表3。4所示。表3。4 订单信息表字段名数据类型说明订单号Varchar(10)(主键)身份证号Varchar(18)外键航班编号Varchar(12)外键购买票数Intnot null购买日期Varchar(50)not null售票员Varchar(18)外键备注Varchar(50)图3.6 订单信息设计图3。7 数据库关系图(5)外键设置图3。8 外键设置图3.9 航班编号外键设置图3。10 身份证号外键设置图3。11 用户外键设置4 详细设计4。1 数据库连接采用ADO方式,应用程序可通过ADO直接与数据库连接;在创建应用程序实例初始化时,
20、进行数据库连接。在登陆框初始化时,执行sql查询。相关的连接程序如下:BOOL CADOtestApp::InitInstance()AfxEnableControlContainer();AfxOleInit();m_pConnection。CreateInstance(_uuidof(Connection);/在ADO操作中建议语句中要常用try.catch()来捕获错误信息,/因为它有时会经常出现一些想不到的错误trym_pConnection-Open(”driver=SQL Server;Server=.;Database=SL;UID=;PWD=”,”,”,adModeUnknow
21、n);/Server后是服务器的计算机名,可以用。表示本地,Database后是数据库名,/这里使用的windows验证,没有设置用户名和密码,catch(_com_error e)AfxMessageBox(数据库连接失败!);return FALSE;连接成功后应在相应的对话框中完成初始化工作(以登录界面为例):BOOL CAirHoldingSystemDlg::OnInitDialog()CDialogEx::OnInitDialog();SkinH_Attach();/ 调用dll皮肤文件,换一层皮肤/SetCursor((HCURSOR)GetDlgItem(IDC_PWD));/
22、GetDlgItem(IDC_PWD)SetFocus();/MessageBox(a);m_User = 李锦樑;/ 初始化用户名是为了方便调试m_Password = ”123”;UpdateData(FALSE);/ 将“关于。.”菜单项添加到系统菜单中。/ IDM_ABOUTBOX 必须在系统命令范围内。ASSERT(IDM_ABOUTBOX 0xFFF0) = IDM_ABOUTBOX);ASSERT(IDM_ABOUTBOX ShowWindow(SW_HIDE);GetDlgItem(IDC_REMOVE)-ShowWindow(SW_HIDE);m_List.InsertCol
23、umn(0,航班编号”,LVCFMT_CENTER,85);m_List。InsertColumn(1,”出发城市”,LVCFMT_CENTER,85);m_List。InsertColumn(2,到达城市”,LVCFMT_CENTER,85);m_List.InsertColumn(3,”机票价格”,LVCFMT_CENTER,85);m_List。InsertColumn(4,出发日期,LVCFMT_CENTER,85);m_List。InsertColumn(5,”备注,LVCFMT_CENTER,85);UpdateData(false);m_pConnection.CreateIns
24、tance(_uuidof(Connection));m_pRecordset。CreateInstance(_uuidof(Recordset));/在ADO操作中建议语句中要常用try。catch()来捕获错误信息,/因为它有时会经常出现一些想不到的错误try /打开本地 Sql Server库studentm_pConnectionOpen(”driver=SQLServer; Server=.;Database=AirHolding;UID=”;PWD=”,”,adModeUnknown);/Server后是服务器的计算机名,Database后是数据库名/这里使用的windows验证,
25、没有设置用户名和密码,/如果是windows和SQL server混合验证,UID=”;PWD=”要写入相应的用户名和密码catch(_com_error e)AfxMessageBox(”数据库连接失败!”);return FALSE; / TODO: Add your control notification handler code heretrym_pRecordset-Open(”SELECT FROM 航班信息”, / 查询Good表中所有字段theApp。m_pConnection.GetInterfacePtr(), / 获取库接库的IDispatch指针adOpenDynam
26、ic,adLockOptimistic,adCmdText);catch(_com_error *e)AfxMessageBox(eErrorMessage());/m_List。InsertItem(4,”ab”);/m_List。InsertItem(5,”ab”);if(!m_pRecordsetadoEOF)m_pRecordsetMoveFirst();while(!m_pRecordset-adoEOF)_variant_t price = m_pRecordsetGetCollect(”机票价格);price.bstrVal;int line=m_List。GetItemCoun
27、t();m_List.InsertItem(line,(char *)(_bstr_t)(m_pRecordset-GetCollect(”航班编号”));m_List。SetItemText(line,1,(char *)(_bstr_t)(m_pRecordsetGetCollect(”出发城市);m_List。SetItemText(line,2,(char *)(_bstr_t)(m_pRecordset-GetCollect(到达城市”)));m_List。SetItemText(line,3,(char )(_bstr_t)(m_pRecordsetGetCollect(”机票价格
28、);m_List.SetItemText(line,4,(char *)(_bstr_t)(m_pRecordsetGetCollect(出发日期”));_variant_t str = m_pRecordsetGetCollect(”备注”);if(str.vt = VT_NULL)m_List。SetItemText(line,5,无”); elsem_List。SetItemText(line,5,(char )(_bstr_t)str);m_pRecordsetMoveNext();/ TODO: 在此添加额外的初始化return TRUE; / return TRUE unless
29、you set the focus to a control/ 异常: OCX 属性页应返回 FALSE初始化成功后,得如下界面:图4。3 航班管理界面4.2.3新增航班的实现对多用户数据库程序来说,不同的用户应有不同的权限。比如管理员可以无任何限制,有的用户只有查询的权限没有修改的权限,有的用户只可以输入数据不能查询等等.所以新增航班这一功能只有拥有总经理的权限才能使用,否则此按钮将被隐藏起来,如图4。4,与4.3形成对比。图4.4 售票员航班管理界面图4。5新增航班信息界面/新增航班void CFlight:OnBnClickedNew()/ 弹出新增航班对话框CAddFlight add
30、Flight;addFlight.DoModal();Refresh();/ 这是用户刷新listCtrl列表的,下面有代码/ TODO: 在此添加控件通知处理程序代码图4。6 新增航班编号1114。2.4撤销航班的实现同样地,撤销航班只有总经理权限才能使用。/撤销航班void CFlight:OnBnClickedRemove()int i = (int)m_List。GetFirstSelectedItemPosition() - 1;if(i = -1)::MessageBox(NULL,请先选中要撤销的航班。”,”提示”,0);/MessageBox(请先选中要撤销的航班,提示,MB_
31、OK);return;if(MessageBox(”是否撤销该航班?,”确认,MB_YESNO) != IDYES)return;m_pRecordsetMoveFirst();while(!m_pRecordsetadoEOF)_variant_t str1 = m_List.GetItemText(i,0);_variant_t str = m_pRecordset-GetCollect(”航班编号);if(str = str1)trym_pRecordset-Delete(adAffectCurrent);m_pRecordset-Update();:MessageBox(NULL,撤销
32、航班成功!”,”提示”,0);/MessageBox(”撤销航班成功!”);Refresh();UpdateData(false);catch (_com_error e)AfxMessageBox(e。Description());return;m_pRecordset-MoveNext();/ TODO: 在此添加控件通知处理程序代码/Refresh()void CFlight:Refresh(void)m_List.DeleteAllItems();/ m_List。InsertColumn(0,”航班编号,LVCFMT_CENTER,85);/ m_List.InsertColumn(
33、1,”出发城市,LVCFMT_CENTER,85);/ m_List.InsertColumn(2,”到达城市,LVCFMT_CENTER,85);/ m_List.InsertColumn(3,”机票价格”,LVCFMT_CENTER,85);/ m_List。InsertColumn(4,出发日期”,LVCFMT_CENTER,85);/ m_List。InsertColumn(5,”备注,LVCFMT_CENTER,85);UpdateData(false);/m_pRecordsetRequery();m_pRecordset-MoveFirst();while(!m_pRecords
34、etadoEOF)_variant_t price = m_pRecordset-GetCollect(”机票价格”);price。bstrVal;int line=m_List.GetItemCount();m_List.InsertItem(line,(char )(_bstr_t)(m_pRecordsetGetCollect(”航班编号);m_List。SetItemText(line,1,(char *)(_bstr_t)(m_pRecordsetGetCollect(”出发城市”)));m_List.SetItemText(line,2,(char *)(_bstr_t)(m_pR
35、ecordset-GetCollect(到达城市)));m_List.SetItemText(line,3,(char )(_bstr_t)(m_pRecordset-GetCollect(机票价格”);m_List。SetItemText(line,4,(char )(_bstr_t)(m_pRecordsetGetCollect(”出发日期”);_variant_t str = m_pRecordset-GetCollect(”备注”);if(str。vt = VT_NULL)m_List。SetItemText(line,5,”无”); elsem_List.SetItemText(li
36、ne,5,(char )(_bstr_t)str);m_pRecordsetMoveNext();4。2。5修改航班的实现图4。7。修改航班/修改航班void CFlight::OnBnClickedUpdate()int i = (int)m_List。GetFirstSelectedItemPosition() - 1;if(i = -1):MessageBox(NULL,请先选中要修改的航班”,”提示,0);return;m_pRecordset-MoveFirst();while(!m_pRecordsetadoEOF)_variant_t str1 = m_List。GetItemT
37、ext(i,0);_variant_t str = m_pRecordsetGetCollect(”航班编号”);if(str = str1)try/ 修改航班对话框CUpdateFlight updateFlight;updateFlight。flightID = m_pRecordset-GetCollect(航班编号”);updateFlight。origin = m_pRecordsetGetCollect(出发城市”);updateFlight.arrival = m_pRecordsetGetCollect(”到达城市”);updateFlight.date = m_pRecord
38、setGetCollect(”出发日期);_variant_t t = m_pRecordsetGetCollect(”机票价格”);updateFlight。price = t.intVal;_variant_t temp = m_pRecordset-GetCollect(”备注”);if(temp。vt = VT_NULL)updateFlight。noteInfo = ”无”;elseupdateFlight。noteInfo = m_pRecordset-GetCollect(”备注);updateFlight。DoModal();Refresh();UpdateData(false
39、);catch (_com_error& e)AfxMessageBox(e.Description());return;m_pRecordsetMoveNext();/updateFlight/ TODO: 在此添加控件通知处理程序代码图4。8 修改航班111的价格为5884。3购买机票4.3.1选择机票并确认购买图4.9选择机票4。3。2填写客户信息图4。10 填写客户信息并购买机票4。4其他界面与功能购票后,可以到订单查询中查询以及退票等操作,退票要求有经理以上的权限,按钮才会显示出来:图4.11订单信息查询订单号158图4。12订单查询如果是总经理,可以对此退票:图4.13点击显示所有
40、,发现订单已经被取消图4.14关于界面:图4。155课程设计小结这次课程设计我写的是航空票务管理系统,因为时间安排不合理,还有好多想到的功能都没来得及增加,这是我感觉最遗憾的。曾经我写过一个管理系统是基于ODBC的,但是这次用的是ADO编程,我感觉ADO比ODBC方便多了,但是还是在连接数据库上花了一整天的时间。数据库设计的比较简单,只有四个表,因为时间仓促,我不敢把表写的太复杂,但是这个表是我经过反复修改琢磨写出来的,一开始订票信息表是由身份证号和航班编号一齐作为主码的,原以为是可行的,但实际开发时发现如果这样的话,会导致同一个人,不能买同一航班的票两次,这明显与显示不符合,因此又增加了订单
41、号,并单独以此为主码。此数据库设计起码满足BCNF范式以上.通过这次数据库课程设计,虽然只有短短的一周不到的时间,我掌握了连接数据库的方法,这是我学到的最大的东西.不足的地方是对ADO的函数认识还不是很多,只有简单的几个,有些感觉能用函数实现的,也是要我自己编写找出来,比较死板。_CommandPtr也没有用,总感觉可以使用它的execute指令来查询sql,但我却没有去用,反而是自己编写了一个Select函数,通过每次关闭_Recordset对象再打开的时候查询,这是我感觉最死板的地方。另外就是这个是MFC基于对话框的工程,如果再给我写一次,我就绝对不会用基于对话框了,因为我感觉基于对话框的不够美观