1、 淮 海 工 学 院 计算机科学系课程设计汇报设计名称: 数据库原理及应用课程设计 姓 名: 李维清 学 号: 专业班级: 计算机科学和技术 043 系 (院): 计算机科学系 设计时间: .1.2.1.12 设计地点: 机房和教室 成绩:指导老师评语: 署名: 年 月 日数据库原理及应用课程设计一、课程设计目标数据库原理及应用课程设计是计算机科学和技术专业集中实践性步骤之一,是学习完数据库原理及应用课程后进行一次全方面综合练习。本课程设计关键在于加深学生对数据库基础理论和基础知识了解,掌握数据库应用系统设计开发基础方法,达成深入使学生综合利用所学知识和增强实际动手能力目标。二、课程设计任务和
2、要求要求学生依据本身对题目标了解情况,从给定设计题目中选择一个,以MS SQL Server作为后台数据库平台,以PowerBuilder作为前台开发工具,完成一个小型数据库应用系统系统分析、设计和开发。三、课程设计说明书报刊订阅管理系统 1系统需求分析现在伴随网络、计算机和数据库快速发展,报刊订阅也不再是传统低效纸笔统计了,已经转向网络。本系统就是面向一个企业报刊订阅管理系统。此系统是一个比较智能化管理系统,它面向全部企业部门职员用户,但含有比较高安全性能。它能够实现报刊订阅基础功效,包含新报刊信息录入、订阅、查询等操作和后台数据库备份和恢复。用户正当注册后必需输入有效密码才能成功进入此系统
3、,能够进行订阅报刊,查询信息,统计信息等操作。对于非法操作,系统有识别和防护方法。1.1系统功效需求分析本系统关键面向用户有系统管理员、读者。下面分角色对该系统不一样操作范围做说明。本系统关键有以下功效模块:l (1)登陆功效:登陆系统为身份验证登录。分为管理员登录和通常见户登录。分别经过不一样用户名和密码进入报刊订阅管理界面。l (2)录入新信息功效:对于管理员,包含新用户信息和新报刊信息录入功效,信息一旦提交就存入到后台数据库中;一般用户自行注册进行录入个人信息。l (3)订阅功效:用户能够订阅报刊,系统自动计算所需金额,并显示在界面上;管理员不可订阅报刊,必需以用户身份订阅报刊。l (4
4、)查询功效:用户能够查询并显示自己所订阅信息;管理员能够按人员、报刊、部门分类查询。查询出信息显示在界面上。l (5)统计功效:管理员能够按用户、部门、报刊统计报刊销售情况,并对部分关键订阅信息进行统计;一般用户能够统计出自己订阅情况。l (6)系统维护功效:管理员能够对用户、报刊、部门、订阅等信息进行添加、删除、更改等维护工作;管理员还要常常备份数据库,以备出现故障后恢复。用户能够更改自己注册信息,但用户名不能更改。2 系统总体设计2.1系统总体结构设计报刊订阅管理系统关键是由登录、录入、订阅、信息查询、统计、系统维护等关键模块组成。本系统结构功效图:2.2系统数据模型设计2.2.1 E-R
5、图本系统采取E-R图(实体-关系图)方法进行数据库概念结构设计。系统E-R图以下所表示:部门 1 报刊包含 n 订阅 n 用户 m 各实体E-R图:部门:部 门部门号部门名用户:订阅报刊种类数真实姓名用户名家庭地址联络电话用 户性 别部门号密码 管理员:管理员名字姓名报刊:报刊代号报刊名出版社六个月订阅价整年订阅价类型报 刊出版周期关系表E-R图:报刊号用户名金额订 阅订阅年限份数2.2.2 关系模式部门(部门号,部门名)用户(用户名,密码,真实姓名,性别,部门号,联络电话,联络地址,订阅报刊种类数)管理员(管理员名,密码)报刊(报刊代号,报刊名,类型,出版报社,出版周期,六个月订约价,整年订
6、约价)订阅(用户名,报刊代号,订阅年限,订阅数量,所需金额)2.2.3 数据表(1).部门表(表department)Dnumber为部门号,Dname为部门名(2).用户表(表consumer)Uname是用户名,Urealname是真实姓名,Upassword是密码,Usex是性别,Dnumber是部门号(和部门表相关系),Uphone是联络电话,Uaddress是联络地址;subscribenum是订阅报刊种类数;(3).管理员表(表administrator)Aname是管理员名,Apassword是密码;(4).报刊表(表magazine)Mnumber是报刊代号,Mname是报刊名
7、,Mkind是类型,Mpress出版报社,Mtime出版周期,Mhalfprice六个月订阅价,Mwhole整年订阅价;(5).订阅表(表subscribe)Uname是用户名(和用户表主键相关系),Mnumber是报刊代号(和报刊表主键相关系),Syear是订阅年限,Snumber是订阅份数,Ssum是金额;3系统实施结合PowerBuilder进行数据库应用开发特点,设计过程可按以下步骤进行:关键开发步骤:(1)打开PowerBuilder,新建一个工作区,取名为magazine;(2)新建一个Application,取名app,连接数据库,并将连接数据库代码复制到app中代码;代码:op
8、en(w_welcome)/ Profile magazineSQLCA.DBMS = MSS Microsoft SQL ServerSQLCA.Database = magazineSQLCA.ServerName = 3968391D9B384C0SQLCA.LogId = saSQLCA.AutoCommit = FalseSQLCA.DBParm = connect;if sqlca.sqlcode0 thenmessagebox(错误,数据库连接错误,请检验后重试!,stopsign!)returnend if close(w_welcome) open(w_login)(3)制作
9、等候界面w_welcome;(4)制作登录界面w_login;确定按钮代码:string id,password,getpasswordid=trim(sle_1.text)getpassword=trim(sle_2.text)if id= or id= then MessageBox(系统提醒,请输入用户名!) returnelseif getpassword= or getpassword= thenMessageBox(系统提醒,请输入密码!) returnend ifif rb_1.checked=true thenselect Aname,Apassword into :gs_op
10、erator_id,:gs_passwordfrom administrator where Aname=:id;if sqlca.sqlcode0 then messagebox(系统提醒,无此管理员!)sle_2.text= sle_1.text= sle_1.setfocus() returnend ifif getpasswordgs_password thenmessagebox(警告,口令错误!) sle_2.text= sle_2.setfocus() returnend ifopen(w_main) close(w_login)elseif rb_2.checked=true
11、thenselect Uname,Upasswordinto :gs_operator_id,:gs_passwordfrom consumerwhere Uname=:id;if sqlca.sqlcode0 then messagebox(系统提醒,无此用户!)sle_2.text=sle_1.text=sle_1.setfocus()returnelseif getpasswordgs_password thenmessagebox(警告,口令错误!)sle_2.text=sle_2.setfocus()returnend ifgs_operator_id=idopen(w_consum
12、ermain)close(w_login)elseif rb_1.checked=false and rb_2.checked=false thenmessagebox(系统提醒,请选择用户类型!)returnend if(5)制作注册界面w_enroll;代码:注册按钮:string name,realname,password,copypassword,sex,number,phone,address,number1string nname=trim(sle_1.text)password=trim(sle_2.text)copypassword=trim(sle_8.text)realn
13、ame=trim(sle_4.text)if rb_1.checked=true thensex=男elseif rb_2.checked=true thensex=女end ifnumber=trim(sle_5.text)phone=trim(sle_6.text)address=trim(sle_7.text)if name= or name= thenMessageBox(系统提醒,对不起!请输入用户名!不然无法注册!)sle_1.setfocus()returnend ifselect Unameinto :nfrom consumerwhere Uname=:name;if sql
14、ca.sqlcode=0 then MessageBox(系统提醒,对不起,此用户名已被注册!请另选一个试试!)sle_1.text=returnend ifif password= or password= thenMessageBox(系统提醒,对不起!请输入登录密码!不然无法注册!)sle_2.setfocus()returnend ifif copypassword= or copypassword= thenMessageBox(系统提醒,对不起!请再次输入登录密码!不然无法注册!)sle_8.setfocus()returnend ifif passwordcopypassword
15、 thenMessageBox(系统提醒,对不起!两次输入密码必需一致!不然无法注册!)sle_8.setfocus()returnend ifif realname= or realname= thenMessageBox(系统提醒,对不起!请输入真实姓名!不然无法注册!)sle_4.setfocus()returnend ifif number= or number= thenMessageBox(系统提醒,对不起!请输入部门号!不然无法注册!)sle_5.setfocus()returnend ifselect Dnumberinto :number1from departmentwhe
16、re Dnumber=:number;if sqlca.sqlcode0 then messagebox(警告,您输入部门号无效!无此部门!)sle_5.text=sle_5.setfocus()returnend ifINSERT INTO consumer(Uname,Upassword,Urealname,Usex,Dnumber,Uphone,Uaddress) VALUES(:name,:password,:realname,:sex,:number,:phone,:address) ;MessageBox(系统提醒,恭喜!注册成功!)取消按钮:close(w_enroll)(6)制
17、作管理员主菜单mainmenu,制作管理员主界面w_main,将mainmenu放入w_main中;菜单:主界面:(7)制作管理员主菜单中录入菜单:制作录入数据窗口d_magazien, d_inputconsumer;制作管理员录入报刊界面w_inputmagazine,录入用户界面w_inputconsumer;将d_magazien,d_inputconsumer分别放入w_inputmagazine,d_inputconsumer中;录入报刊代码及界面:(录入用户代码及界面类似,不再列出)窗口代码:dw_1.settransobject(sqlca) dw_1.retrieve()数据
18、窗框控制框代码:int b_select string num,nameif dwo.name=b_2 thenb_select=messagebox(系统提醒,确定删除所选列?,exclamation!,yesno!)if b_select=1 thendw_1.deleterow(0)end ifend ifif dwo.name=b_3 thendw_1.update()if sqlca.sqlcode0 thenrollback;messagebox(操作非法!,无法保留!);returnelsecommit;messagebox(系统提醒,信息保留成功!)returnend ifen
19、d ifif dwo.name=b_4 then close(parent)end if数据窗口:界面:(9)制作管理员主菜单中查询菜单:分别制作制作查询数据窗口d_consumer_ruery, d_dept_query, d_magazine_query,分别制作管理员按用户查询界面w_consumer_ruery,按部门查询界面w_dept_query,按报刊查询界面w _magazine_query;将d_consumer_ruery, d_dept_query, d_magazine_query分别放入w_consumer_query,w_dept_query, w _magazin
20、e_query中;以下仅列出按报刊查询代码和界面(按用户、部门查询类似,不再列出);窗口代码:dw_1.settransobject(sqlca) sle_1.setfocus()检索按钮:string number,copynumber,namelong ll_rownumber=trim(sle_1.text)if number= or number= then messagebox(系统提醒,请输入报刊号!) returnend ifselect Mnumber,Mname into :copynumber,:name from magazinewhere Mnumber=:number
21、;if sqlca.sqlcode0 thenmessagebox(系统提醒,无此报刊!) sle_1.text= returnend ifsle_2.text=namedw_1.setfilter(subscribe_mnumber=+number+)dw_1.filter()ll_row=dw_1.retrieve()if ll_row=0 then messagebox(系统提醒,无统计!) returnend if按报刊查询数据窗口:按报刊查询界面:(10) 制作管理员主菜单中统计菜单:制作统计数据窗口d_consumer_stat, d_query_dept, d_stat_maga
22、zine;制作管理员按用户统计界面w_stat_consumer,按部门统计界面w_stat_department,按报刊统计界面w_stat_magazine;将d_consumer_stat, d_query_dept, d_stat_magazine分别放入w_stat_consumer, w_stat_department,w_stat_magazine中;以下仅列出按出按部门统计代码和界面抓图(按用户、报刊统计类似,不再列出);代码:按部门统计代码:窗口代码:long ll_rowdw_1.settransobject(sqlca)dw_1.setfilter()dw_1.filte
23、r()ll_row=dw_1.retrieve()if ll_row=0 thenmessagebox(系统提醒,无统计!)returnend if按部门统计数据窗口:按部门统计界面:(11)制作管理员主菜单中系统维护菜单中信息维护菜单:制作信息维护数据窗口d_maintenance_consumer,d_maintenance_dept,d_maintenance_magazine,d_maintenance_subscribe;制作管理员用户信息维护界面w_maintenance_consumer, 部门信息维护界面w _maintenance_dept,报刊信息维护界面 w _maint
24、enance_magazine,订阅信息维护界面w _maintenance_subscribe;将d_maintenance_consumer,d_maintenance_dept,d_maintenance_magazine,d_maintenance_subscribe分别放入w_maintenance_consumer,w _maintenance_dept,w _maintenance_magazine,w _maintenance_subscribe中;以下仅列出订阅信息维护代码和界面抓图(其它信息维护类似,不再列出)订阅信息维护代码:窗口代码:dw_1.settransobjec
25、t(sqlca) dw_1.retrieve()数据窗口控制框代码:int b_selectif dwo.name=b_3 thenb_select=messagebox(系统提醒,确定删除所选列?,exclamation!,yesno!)if b_select=1 thendw_1.deleterow(0)end ifend ifif dwo.name=b_4 then messagebox(系统提醒,保留成功!) end ifif dwo.name=b_5 then close(parent) end if数据窗口:界面:(12)制作管理员主菜单中更改登录菜单:代码:int b_selec
26、t b_select=messagebox(系统提醒,确定,exclamation!,yesno!)if b_select=1 then open(w_login) close(w_main) end if(13)制作用户主菜单m_consumer_menu;制作用户主界面w_consumermain,将m_consumer_menu放入其中;用户主菜单:用户主界面:(14)制作用户菜单中更改信息菜单:w_modify_consumer;代码:窗口代码:/定义变量,用于存放用户各字段 string name,realname,pass,sex,dept,phone,address/查询登陆者相
27、关信息select Uname,Upassword,Urealname,Usex,Dnumber,uphone,Uaddressinto :name,:pass,:realname,:sex,:dept,:phone,:addressfrom consumerwhere Uname=:gs_operator_id;/无信息if sqlca.sqlcode0 then messagebox(,) return end if/在界面上显示信息sle_1.text=namesle_2.text=passsle_3.text=realnamesle_4.text=deptsle_5.text=phon
28、esle_6.text=addressif sex=男 thenrb_1.checked=trueelseif sex=女 thenrb_2.checked=trueend if确定按钮:string name,realname,pass,sex,dept,phone,addressint b_selectb_select=messagebox(系统提醒,确定修改?,exclamation!,yesno!)if b_select=1 thenname=trim(sle_1.text)pass=trim(sle_2.text)realname=trim(sle_3.text)dept=trim(
29、sle_4.text)phone=trim(sle_5.text)address=trim(sle_6.text)if rb_1.checked=true then sex=男elseif rb_2.checked=true then sex=女end ifif pass= or pass= thenMessageBox(系统提醒,对不起!密码不能为空!) sle_2.setfocus() returnend ifif realname= or realname= thenMessageBox(系统提醒,对不起!真实姓名不能为空!)sle_3.setfocus() returnend ifif
30、 sex= or sex= thenMessageBox(系统提醒,对不起!性别不能为空!) returnend ifif dept= or dept= thenMessageBox(系统提醒,对不起!部门号不能为空!) sle_2.setfocus() returnend ifupdate consumerset Upassword=:pass,Urealname=:realname,Usex=:sex,Dnumber=:dept,Uphone=:phone,Uaddress=:addresswhere Uname=:name;if sqlca.sqlcode0 thenmessagebox
31、(系统提醒,更改错误!)returnend ifmessagebox(系统提醒,更改成功!);end if取消按钮:close(parent)界面:(15)制作用户菜单中订阅菜单:制作数据窗口d_show_magazine,制作订阅报刊界面:w_subscribe,将d_show_magazine加入其中;代码:窗口代码:sle_1.setfocus()dw_1.settransobject(sqlca)dw_1.retrieve()提交按钮代码:string name,password,magazinenum,num,ctime,number,moneydouble yearint numb
32、,kindnumdouble halfprice,wholeprice,summoneystring num1,name1name=trim(sle_1.text)password=trim(sle_5.text)magazinenum=trim(sle_2.text)ctime=trim(sle_3.text)number=trim(sle_4.text)if name= or name= thenmessagebox(系统提醒,对不起!请您输入用户名!)returnend ifif password= or password= thenmessagebox(系统提醒,对不起!请您输入密码)
33、returnend ifif magazinenum= or magazinenum= thenmessagebox(系统提醒,对不起!请您输入报刊号!)returnend ifif ctime= or ctime= thenmessagebox(系统提醒,对不起!请您输入订阅年限!)returnend ifif number= or number= thenmessagebox(系统提醒,对不起!请您输入数量!)returnend ifif ctime=0 or ctime= or ctime=0.0 or ctime=0.00 thenmessagebox(系统提醒,请输入有效数字!)sl
34、e_3.text=returnelseif ctime=0.5 thenyear=0.5elseif ctime=1 or ctime=1.0 thenyear=1.0elseif ctime=1.5 thenyear=1.5elseif ctime=2 or ctime=2.0 thenyear=2.0elseif ctime=2.5 thenyear=2.5elseif ctime=3 or ctime=3.0 thenyear=3.0elseif ctime=3.5 thenyear=3.5elseif ctime=4 or ctime=4.0 thenyear=4.0elseif ct
35、ime=4.5 thenyear=4.5elseif ctime=5 or ctime=5.0 thenyear=5.0else messagebox(系统提醒,订阅年限输入不正确!请根据示例方法输入:1或1.0,并不要超出5.0!)end ifif number=0 then messagebox(系统提醒,请输入有效数字!) sle_4.text=returnelseif number=1 thennumb=1elseif number=2 thennumb=2elseif number=3 then numb=3elseif number=4 thennumb=4elseif numbe
36、r=5 thennumb=5else messagebox(系统提醒,输入不正确!请根据示例方法输入:1,并不要超出5!)returnend ifselect Uname,Upasswordinto :gs_operator_id,:gs_passwordfrom consumerwhere Uname=:name;if sqlca.sqlcode0 then messagebox(系统提醒,无此用户!)sle_1.text=sle_5.text=sle_1.setfocus()returnend ifif passwordgs_password thenmessagebox(警告,口令错误!
37、)sle_5.text=sle_5.setfocus()returnend ifselect Mnumberinto :numfrom magazinewhere Mnumber=:magazinenum;if sqlca.sqlcode0 then messagebox(系统提醒,无此报刊!)sle_2.text=returnend ifselect Mhalfprice,Mwholeinto :halfprice,:wholepricefrom magazinewhere Mnumber=:magazinenum;if sqlca.sqlcode0 then messagebox(系统提醒
38、,该报刊未输入价格!)returnend ifif year=0.5 or year=1.5 or year=2.5 or year=3.5 or year=4.5 thensummoney=(-0.5+year)*wholeprice+halfpricesummoney=summoney*numbelseif year=1 or year=2 or year=3 or year=4 or year=5 then summoney=year*wholeprice summoney=summoney*numbend ifselect Uname,Mnumberinto :name1,:num1f
39、rom subscribewhere Uname=:name and Mnumber=:magazinenum;if sqlca.sqlcode=0 then MessageBox(系统提醒,对不起,您已经订阅过此报!)sle_1.text= sle_2.text= sle_3.text= sle_4.text=sle_5.text=returnend ifINSERT INTO subscribe(Uname,Mnumber,Syear,Snumber,Ssum) VALUES(:name,:magazinenum,:ctime,:number,:summoney) ;select Ssum
40、into :moneyfrom subscribewhere Uname=:name and Mnumber=:magazinenum ;MessageBox(系统提醒,恭喜!订阅成功!所需金额为+money)/更新用户订阅报刊种类select count(Uname)into :kindnumfrom subscribewhere Uname=:name ;update consumerset subscribenum=:kindnumwhere Uname=:name ;清空按钮代码:sle_1.text= sle_2.text= sle_3.text= sle_4.text=sle_5.
41、text=数据窗口图:订阅图:(16)制作用户菜单中查询菜单:制作用户查询界面:同管理员按用户查询界面;代码:窗口代码:dw_1.settransobject(sqlca) sle_1.setfocus()检索按钮代码同管理员界面检索按钮基础相同,仅将不一样点列出:dw_1.setfilter(subscribe_uname=+name+)dw_1.filter()ll_row=dw_1.retrieve()if ll_row=0 thenmessagebox(系统提醒,无统计!)returnend if退出按钮代码:close(w_consumer_query)订阅界面:(17)制作用户菜单中统计菜单:制作用户统计界面:w_consumer_stat,将数据窗口d_consumer_stat放入 w_consumer_stat中;代码:窗口代码:int ll_rowdw_1.settransobject(sqlca)dw_1.setfilter(consumer_uname=+gs_operator_id+)dw_1.filter()ll_row=dw_1.retri