




已阅读5页,还剩17页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
数据库课程设计报 告班级: 姓名: 学号: 指导老师: 2011年12月24日课程设计说明12月初数据库课程开始进行课程设计,第一次上机面对老师的上机要求我感觉实现一个数据库系统挺复杂。当时自己所在的一个项目组正好需要做一个单机版的数据库,于是我带着强烈的热情和较高的目标开始认真地做课程设计。经过在图书馆一周的针对性学习,我对mfc的odbc技术有了深入的理解,对完成一个数据库系统的步骤和方案有了初步了解。第二次上机,我开始模仿老师提供的pdf文档案例进行我的数据库设计。通过三次上机,通过不断地查阅资料不断地与同学交流,我终于完成了系统的雏形。虽然给老师验收了,但我知道初始的系统有很多的漏洞与缺陷,在之后的课余时间内我不断地测试优化,遇到问题并解决问题,最终实现了一个相对较完善的系统。虽然这个系统只是个简单的单机数据库系统,但它是通过自己一步步的学习、循序渐进的实践编写完成的,它的里面充满着自己学习的痕迹,所以我将把它进一步完善并作为自己以后数据库编程的基础。系统使用说明书:功能:1.对教师信息的管理与查询;2.对图书信息的管理查询与借阅操作方法:1.进入登录界面,需要输入用户名和密码; 2.数据库已存有的用户名有:管理员“20091001695”,普通用户“20091002718”等,其密码都是“123”;3.进入教师系统,如果是管理员则可以对信息进行添加修改删除操作,普通用户只能查看信息;4.进入图书系统,如果是管理员则可以对信息进行添加修改删除操作,普通用户只能查看信息,管理员与普通用户都可以进行借阅归还查看自己的借阅情况操作。目 录1、 立题 04 1.基本要求 042.确定主题 042、 需求分析 051. 数据库分析 051) 表的数目及属性 052) 采用sql server 2008 052. 编程语言选择 053. 资料准备 053、 系统设计 061. 教师管理系统设计 061) 数据库设计 062) 安装sql,定义数据源 073) 创建mfc appwizard应用程序 074) 用classwizard 为数据库中的每一个表映射一个记录集类 075) 教师信息管理系统界面设计 086) 几个主要函数的实现 097) 设计登录对话框 102. 图书借阅与管理系统设计 111) 该系统基本类的添加 112) 新对话框设计 113) 关键函数操作 124、 系统优化与完善 161. 漏洞发现与解决 162. 界面优化 175、 总结难点与亮点 176、 最终版运行结果 187、 收获与展望 221、 立题1. 基本要求课题背景:现计算机系有一批书作为公共书籍供全系老师借阅。本课程设计针对这一情况做一个应用程序进行借书的管理。基本功能:对书籍信息的维护,比方说增加,删除,以及修改书籍信息。扩充功能:由于计算机系正处于成长阶段,为了增强教师力量,会引进新的人才,还会进一步细化教研室。各个教研室的老师也有可能互相调动。目前本系有三个教研室:网络,应用,软件。还有一些老师不属于任何一个教研室,即不从事于教学,但属于本系的领导及办公人员,他们也可以借阅书籍。所以有余力的话,此课程设计也应有管理教师信息的功能。技术要求:a用access或sql server 2000 建库,库如何建自由发挥。b用delphi,也vb,vc等开发应用程序访问,维护数据库。2. 确定主题根据设计基本要求,实现该系统可以分为两大步,即可以分解成对“教师信息管理系统”和“图书借阅管理系统”这两个系统的设计。由于胡老师提供的pdf资料上有类似“教师信息管理系统”的数据库开发案例,阅读过后我发现该案例操作步骤清晰明了,每一个细节都说得比较详细,所以第一步将设计“教师信息管理系统”这一初始系统,在完成该系统的基础上再自由发挥完成“图书借阅管理”这一完善系统。综上分析,我已经明确自己的设计目标与思路了。目标就是实现一个数据库管理系统,该系统包含两个子系统:一个子系统能够对教职工信息进行管理,另一个子系统能够实现管理员对图书的管理以及教职工对书籍的借还操作。在此做一下说明,下文对该两系统简称为系统一系统二。2、 需求分析1. 数据库分析 1)表的数目及属性本系统需要定义一个数据库用于存储登录者、教师、图书等信息,系统一需要建立两张表,即登录者表和教师信息表,系统二也需要两张表,即图书信息表还有教师与图书之间的借阅关系表。所以本数据库一共需要设计四张表。登录者表应该有三个属性:有户名、用户密码以及用户权限;教师表可以有一下属性:职工编号、姓名、所在部门、性别、出生年月、职称、文化程度、毕业学校、政治面貌、联系电话;图书表可以有:书号、书名、作者、出版社、剩余量、借阅者等属性;借阅关系表应该有以下属性:借阅者号、书号。 2)采用sql server 2008通过学习我了解到常用的数据库管理系统(dbms)主要可以总结为以下几类: a.基于pc的有microsoft的access(和foxpro);b.基于网络的有sql server 和oracle ;它们都提供了一个sql接口,差别主要是存储量的差别。本系统因为目标是设计在单机上运行,所以完全可以用access做,但由于我们数据课程讲授的是sql server数据库,所以为了巩固所学知识,为了现学现用我决定选择sql最新的08版做数据库。2. 编程语言的选择目前我接触的计算机编程语言主要用c语言、汇编语言、c+、java,而对vc+的基于mfc编程相对熟练,本系统恰好需要有可视化界面,所以我果断的选择利用vc6.0基于mfc的对话框编程完成本系统。3. 资料准备除了数据库课本,老师提供的pdf资料,我还去图书馆借来了一本数据编程实例书籍,当然每次上机还拥有强大的网络资源支持。3、 系统设计1) 教师管理系统设计1.数据库设计利用sql server 2008创建一个数据库 teacherdb.sql, 其中包含四张表 ,用户登录表 users 、教师基 本信息表teachers、图书信息表book以及借阅关系表borrow,其详细定义如下:用户口令表 users 的结构 序 号 字段名 字段类型 字段大小 字段含义 1 username 文本 10 用户名 2 userpswd 文本 15 口令 3 usertype 数字 整型 用户类型,0:系统管理员,1:普通用户 教师基本信息表 teachers 的结构 序 号 字段名称 字段类型 字段大小 说 明 1 emp_id 文本 12 职工编号 2 emp_name 文本 15 职工姓名 3 department 文本 30 所在部门名称 4 sex 文本 2 职工性别 5 birthday 文本 10 出生年月 6 title 文本 10 职称 7 culture_level 文本 10 文化程度 8 graduateschool 文本 30 毕业学校 9 political_party 文本 8 政治面貌10 telephone 文本 12 联系电话 22图书信息表 book的结构 序 号 字段名称 字段类型 字段大小 说 明 1 book_id 文本 10 书号 2 book_name 文本 15 书名 3 book_writer 文本 15 作者 4 book_public 文本 20 出版社5 book_available 文本 10 剩余量6 book_borrow 文本 10 借阅者借阅关系表 borrow的结构 序 号 字段名 字段类型 字段大小 字段含义 1 emp_id 文本 12 借阅者号2 book_id 文本 10 书号其中users主码为用户名 、teachers 主码为职工编号、book主码为书号、borrow主码为借阅者和书号两者。2. 安装sql server 2008,定义数odbc据源1) 前几节上机,我是利用机房电脑编程的,机房装的是sql server 2000,用起来相对好用,但是由于机房机器装了还原卡,每次上机都要重新导入数据库,相对麻烦。之后,我决定带自己电脑去编程,我首先要在自己电脑上安装数据库管理系统,sql server 2008系统较2000更加稳定,但是其安装较麻烦,我通过跟着安装视频花了半天终于安装08成功。2)定义odbc数据源建立了数据库之后,必须配备 odbc 数据源,使其指向刚刚建立的数据库。选择“控制面板”中“管理工具”下的“数据源(odbc)”项。 双击 odbc 图标,弹出“odbc 数据源管理器”对话框。在这里用户可以设置数据源的一些信息,其中的“用户 dsn”选项卡是用户定义的在本地计算机上使用的数据源名(dsn),如图 7.3 所示。 定义用户 dsn 的步骤如下。 (1) 单击“添加”按钮,弹出“创建新数据源”对话框,如图 7.4 所示。 图 7.3 “odbc 数据源管理器”对话框 图 7.4 “创建新数据源”对话框 (2) 为新的数据源选择数据库驱动程序。由于使用的是 sql数据库,所以选择 microsoft sql选项,并单击“完成”按钮。 (3) 为该数据源起了一个名字teacherdb。 3. 创建 mfc appwizard 应用程序 用 mfc appwizard(exe)创建一个对话框应用程序 teachermis。为了是程序支持数据库对象,在头文件 stdafx.h 中加入#include。 4. 用 classwizard 为数据库中的每一个表映射一个记录集类 具体映射过程相对简单,老师给的pdf资料上有详细步骤,这里我以book表为例映射一个记录类集。 定义记录集类cbookset为 cbookset 类选择 odbc 数据源 为 cbookset 类选择数据库表 5. 教师信息管理系统界面设计由于该系统基本是参照pdf编程案例设计的,所以界面设计近似其界面,截图如下: 对话框控件属性、关联变量和消息处理函数 6. 几个重要变量的定义及函数的实现1) 变量定义需要为csunlight1210dlg对话框类添加一个public成员变量int m_usertype,用于记录用户类型,添加一个protected成员变量cdatabase m_database,用于打开、关闭数据源。2) 函数定义1 初始化函数oninitdialog()该函数用于初始化对话框,在其中主要实现登录者权限的识别以及列表框的初始化工作。操作见源程序。2 添加 private 成员函数 listall(cstring strsql)该函数主要作用是将数据库中某个表的某些记录显示出来,它可以被添加、修改、删除函数调用。其中需要利用记录集的对象对表进行操作,实现代码如下:void csunlight1210dlg:listall(cstring strsql)m_listteacher.deleteallitems(); /清空列表视图cteacherset m_teacherset; /定义教师记录集对象try if(m_teacherset.isopen() /如果记录集是打开的,关闭之m_teacherset.close(); if(!m_teacherset.open(crecordset:snapshot,strsql) /以 snapshot 的方 式打开教师表,如果不能打开,报错处理messagebox(打开数据库失败!,数据库错误,mb_ok); return ; catch ( cdbexception *e ) / 异常捕获 e-reporterror(); int nindex=0; /列表视图指向第 1 行m_teacherset.movefirst(); /记录指针指向第 1 条记录while(!m_teacherset.iseof() lv_item lvitem; lvitem.mask=lvif_text; lvitem.iitem=nindex; /行lvitem.isubitem=0; /列lvitem.psztext=; m_listteacher.insertitem(&lvitem); /在列表视图中插入一行,每行 10 列m_listteacher.setitemtext(nindex,0,m_teacherset.m_emp_id); m_listteacher.setitemtext(nindex,1,m_teacherset.m_emp_name ); m_listteacher.setitemtext(nindex,2,m_teacherset.m_department); m_listteacher.setitemtext(nindex,3,m_teacherset.m_sex); m_listteacher.setitemtext(nindex,4,m_teacherset.m_birthday); m_listteacher.setitemtext(nindex,5,m_teacherset.m_title); m_listteacher.setitemtext(nindex,6,m_teacherset.m_culture_level); m_listteacher.setitemtext(nindex,7,m_teacherset.m_graduateschool); m_listteacher.setitemtext(nindex,8,m_teacherset.m_political_party);m_listteacher.setitemtext(nindex,9,m_teacherset.m_telephone); m_teacherset.movenext(); /后移记录 nindex+; /行数加 1 m_teacherset.close(); /关闭记录集 3 添加 private 成员函数 void doexecutesql(cstring strsql)该函数执行对数据库具体的sql操作,遇到异常则返回异常,实现如下:void csunlight1210dlg:doexecutesql(cstring strsql)try m_database.executesql(strsql); catch(cdbexception, ex) afxmessagebox(ex-m_strerror); afxmessagebox(ex-m_strstatenativeorigin); and_catch(cmemoryexception, pex) pex-reporterror(); afxmessagebox(memorry exception); and_catch(cexception, e) tchar szerror100; e-geterrormessage(szerror,100); afxmessagebox(szerror); end_catch 4 添加、修改、删除函数在系统一中这几个函数操作相对简单,与pdf类似,这里不做介绍。而系统二中这几个消息响应函数的实现由于需要对几张表进行操作,所以相对较复杂,将在系统二设计时详细介绍。7. 设计登录对话框系统登录界面如图所示,在本系统登陆界面可以通过输入用户名与口令进入两个不同的系统,现在已实现的是教职工系统。下面将继续系统二的设计。2) 图书借阅与管理系统设计1. 基本类与对话框的添加该系统在系统一基础上又增加了三个类cbookdlg、cbookset、cborrow,其添加方法与系统一的构建一样,不再说明。2. 新添对话框的设计图书信息对话框该对话框可以实现管理员对书的管理操作,用户对书的借阅操作,其中管理操作与系统一相似但是,其可能关联多张表,借阅与还书以及借阅情况查询操作都用到了两张表,下面我将对这几个功能函数做具体说明。3. 关键函数操作1) 添加函数操作void cbooksdlg:onbuttonadd() / todo: add your control notification handler code hereupdatedata(); cstring strsql; strsql.format(insert into book values(%s,%s,%s,%s,%s,%s) , m_bookid, m_bookname,m_bookwriter,m_bookpublic,m_bookavailable,m_bookborrower); /向表 employees 插入一条 新记录doexecutesql(strsql); strsql=select * from book; /重新查询 book 表doexecutesql(strsql); listall(strsql); 该函数操作过程是,先利用format函数格式化sql插入操作,然后调用doexecutesql(strsql);函数对数据库进行实际插入操作,之后再格式化选择操作,最后调用listall(strsql);函数显示插入记录后表的情况。2) 修改函数操作void cbooksdlg:onbuttonedit() / todo: add your control notification handler code hereupdatedata(); cstring strsql; strsql.format(updatebooksetbook_id=book_name=%s,book_writer=%s,book_public=%s,book_available=%s,book_borrower=%s where book_id=%s, m_bookid,m_bookname,m_bookwriter,m_bookpublic,m_bookavailable,m_bookborrower,m_bookid); doexecutesql(strsql); strsql=select * from book; doexecutesql(strsql); listall(strsql); 该函数作用是以当前界面显示的书号为条件查找库中该条记录,然后将其修改,最后也调用listall(strsql)显示修改后的结果。3) 删除函数操作void cbooksdlg:onbuttondel() / todo: add your control notification handler code herecstring sql;sql.format(delete from book where book_id=%s ,m_bookid);doexecutesql(sql); sql=select * from book; doexecutesql(sql); listall(sql); 该函数作用依然是以当前界面显示的书号为条件查找库中该条记录,然后利用sql删除语句将其删除,最后也调用listall(strsql)显示修改后的结果。4) 查找函数操作void cbooksdlg:onbuttonseach() / todo: add your control notification handler code hereupdatedata(); cstring strsql,strfield,str; if(m_combo_seach=作者) strfield=book_writer; if(m_combo_seach=出版社) strfield=book_public; if(m_combo_seach=书名) strfield=book_name; if(m_combo_seach=书号) strfield=book_id; strsql.format(select * from book where %s =%s,strfield, m_edit_seach); cbookset m_bookset; try if (m_bookset.isopen() )m_bookset.close(); m_bookset.open(crecordset:snapshot,strsql); /执行查询/ 判断数据库中是否有记录,如果没有则退出if ( m_bookset.getrecordcount()=0 ) messagebox(无此记录); return; else /将查询出来的第一条记录显示在编辑区m_bookset.movefirst(); m_bookid=m_bookset.m_book_id;m_bookname=m_bookset.m_book_name; m_bookwriter=m_bookset.m_book_writer; m_bookpublic=m_bookset.m_book_public; m_bookavailable=m_bookset.m_book_available; m_bookborrower=m_bookset.m_book_borrower; updatedata(false); listall(strsql); /将查询出来的全部记录显示在列表视图中 catch ( cdbexception *e ) / 异常捕获 e-reporterror(); return; 该函数作用是以用户输入的查找条件对数据库进行查找库,如果找不到该条记录则提示无此记录,有则利用sql投影语句将其在列表框中显示。5) 借书函数操作void cbooksdlg:onborrow() / todo: add your control notification handler code hereupdatedata(); cstring strsql,sql; /clogindlg m_username;strsql.format(select * from book where %s between -1 and 0,m_bookavailable); /优化borrow等于0的情况cbookset m_bookset; try if (m_bookset.isopen() )m_bookset.close(); m_bookset.open(crecordset:snapshot,strsql); /执行查询/ 判断数据库中是否有记录,如果没有则退出if ( m_bookset.getrecordcount()=1 ) messagebox(此书已全部借出); return; else /未借出则执行以下操作strsql.format(insert into borrow values(%s,%s) , username,m_bookid ); /向表 borrow 插入一条 新记录doexecutesql(strsql); sql.format(update book set book_available=book_available-1 where book_id=%s ,m_bookid ); doexecutesql(sql); strsql=select * from book; /重新查询 book 表doexecutesql(strsql); listall(strsql); /将查询出来的全部记录显示在列表视图中 catch ( cdbexception *e ) / 异常捕获 e-reporterror(); return; 该函数作用是响应当前用户借书操作,其需要实现对两张表进行操作,首先需要将book表中该书数目减1,然后还需要在borrow表中添加该用户的一条借书记录。操作过程中如有异常需要进行异常处理,最后将book表被借阅后的情况在列表框中显示出来。具体实现操作见以上代码。6) 还书函数操作void cbooksdlg:onreturnback() / todo: add your control notification handler code herecstring sql,strsql;sql.format(delete from borrow where emp_id=%s and book_id=%s ,username,m_bookid);/有点瑕疵,同一个人借同一本书多次如何办/strsql=select book.book_id, book.book_name,book.book_writer,book.book_public,book.book_available,book.book_borrower from book,borrow where borrow.book_id = book.book_id; /sql.format(delete from borrow where emp_id=%s and book_id=%s ,username,m_bookid);doexecutesql(sql); sql.format(update book set book_available=book_available+1 where book_id=%s ,m_bookid); doexecutesql(sql); strsql=select book.book_id, book.book_name,book.book_writer,book.book_public,book.book_available,book.book_borrower from book,borrow where borrow.book_id = book.book_id; doexecutesql(strsql); listall(strsql); 该函数作用是响应当前用户还书操作,其也需要实现对两张表进行操作,首先需要将book表中该书数目加1,然后还需要在borrow表中删除该用户的一条借书记录。操作过程中如有异常需要进行异常处理,最后将book表被借阅后的情况在列表框中显示出来。具体实现操作见以上代码。7) 我的借阅情况函数操作void cbooksdlg:listborrowall(cstring strsql)m_booklist.deleteallitems(); /清空列表视图cborrowset m_borrowset; /定义教师记录集对象try if(m_borrowset.isopen() /如果记录集是打开的,关闭之m_borrowset.close(); if(!m_borrowset.open(crecordset:snapshot,strsql) /以 snapshot 的方 式打开教师表,如果不能打开,报错处理messagebox(打开数据库失败!,数据库错误,mb_ok); return ; catch ( cdbexception *e ) / 异常捕获 e-reporterror(); int nindex=0; /列表视图指向第 1 行m_borrowset.movefirst(); /记录指针指向第 1 条记录while(!m_borrowset.iseof() lv_item lvitem; lvitem.mask=lvif_text; lvitem.iitem=nindex; /行lvitem.isubitem=0; /列lvitem.psztext=; m_booklist.insertitem(&lvitem); /在列表视图中插入一行,每行 10 列m_booklist.setitemtext(nindex,0,m_borrowset.m_book_id); m_booklist.setitemtext(nindex,1,m_borrowset.m_emp_id ); m_borrowset.movenext(); /后移记录 nindex+; /行数加 1 m_borrowset.close(); /关闭记录集 该函数作用是响应当前用户的借阅情况,它首先需要以当前用户为条件查看borrow表,然后将表中该用户的信息投影显示出来,具体实现操作见以上代码。4、 系统优化与完善1. 漏洞发现与解决1) 登录密码的隐藏刚开始时,登录界面上用户输入密码是可见的,这违背了信息安全因素与现实情况,通过上网查资料,我才知道原来编辑框本身带有设置隐藏文本的功能,这就解决了这个安全漏洞。2) 实现返回登录界面系统初步实现,我开始运行时发现有一个地方很不用户有好,那就是用户一旦进入某一个系统如果想返回就需要完全退出系统。而一般我们希望的是有一个返回操作,它能实现返回登陆界面让用户再次选择进入的系统。要实现这个理论上还简单,就是在教职工信息对话框和图书信息对话框上添加一个返回按钮,其响应函数主要是先关闭当前对话框然后利用domadal()再调用出登录对话框。对于关闭当前对话框操作,我开始是用的destorywindow( )操作,试了几次后都实现不了,和同学讨论后我发现oncancel( )函数可以简单实现销毁当前对话框操作。3) 借书操作漏洞测试运行后发现,借书操作设计时只考虑了数目减1操作,漏了借光了的情况。所以在进入借书函数时首先判断该书剩余量是否大于0,已经为0了则提醒用户“此书已经借光”。4) 还书操作漏洞和借书操作一样,调试运行发现,还书操作设计时只考虑了boorow表删除记录的操作,忽略了book表数目复原的操作,添加之后程序漏洞得到弥补。5) 数据库中数据定义成int 型执行查询语言出错2. 界面优化登录界面优化:插入了一个位图、修改字体大小与背景色、更改编辑框的背景色如下教师系统界面优化:实现与登陆界面同样风格的背景色和字体如下 5、 总结难点与亮点1. 系统实现过程中难点的总结 难点1.两个系统对数据库的添加、修改、删除操作
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 入职安全教育培训记录卡课件
- 桂林医学院口腔门诊部扩建项目环评报告
- 保育员理论知识培训体会课件
- 长城经销商管理办法
- 《内部资料管理办法》
- 数学与生活:探秘概率起源
- 机场保安考试题库及答案
- 烟草投诉举报管理办法
- 特种药品药店管理办法
- 企业安全知识培训台账课件
- 2025-2026学年人教版小学数学四年级上册教学计划及进度表
- 2025年秋季学期(统编版)二年级上册语文教学工作计划及教学进度表
- 《铁路调车工作》课件
- 改革开放以来教育方面的变化课件
- 系统硬件-通信模块741-s使用手册
- 四年级上册数学单元测试-8.垂线与平行线 苏教版 (含解析)
- 河西走廊课件
- (高职)电子商务英语电子课件教学PPT(完整版)
- 汽车材料(第三版)整套课件汇总完整版电子教案(全)
- 古今滑稽诗话 稽山范范左青编
- 牙龈出血牙龈肥大
评论
0/150
提交评论