数据库应用系统设计报告.docx
《数据库应用系统设计报告.docx》由会员分享,可在线阅读,更多相关《数据库应用系统设计报告.docx(41页珍藏版)》请在冰点文库上搜索。
数据库应用系统设计报告
《数据库应用系统》
课程设计指导书
课程名称:
数据库应用系统设计理论
院系年级:
12级电气信息工程系
专业班级:
计算机科学与技术一班
学号:
姓名:
指导老师:
河海大学文天学院
2014年12月
一引言
数据库应用系统是计算机应用的一个重要领域,在各行各业的管理工作中都发挥着非常重要的作用。
数据库应用系统设计开发是一项复杂且困难的工作,主要体现在开发环境的复杂性、用户需求的多样性、技术手段的综合性三个方面。
小型的数据库图书馆管理系统是一种典型的信息管理系统,图书馆管理系统包括许多内容,有图书的基本信息以及添加、删除、修改等,读者的基本信息以及借阅书籍的相关信息,用P0werBuilder9.0编写运行环境,它是一个集成的完全可视化的开发工具,使用PowerBuilder9.0可以用一种可视、直观的方式来创建应用程序所需的用户界面和数据库接口。
通过数据窗口,用户可以轻松地完成客户端与服务器之间的数据交互,利用数据窗口控件,则可以方便地显示、修改和更新数据库中的数据。
二相关技术
2.1数据库应用工程原理
数据库应用编程通过对嵌入式的使用SQL语言,只有操作功能没有编辑功能。
数据库应用中包括主语言系统、数据库系统等协调运行必须解决那些关键句属,动态SQL,数据库管理系统集中管理数据资源,实时监听应用系统有何种需求,应用请求立即响应,向应用程序返回操作,由主语言系统实现算法流程,主语言系统编译器不仅能在原有的主语言系统编译器的所有功能,而且可以嵌入式的主语言程序、编译程序调用。
数据通信,游标通信,主变量的实现,游标实现不确定结果集的传递,数据库接口。
2.2数据库技术
数据库技术有主语言程序连接数据事务对象的SQL技术、动态技术、事务控制技术、事务驱动程序的设计技术、数据库通信技术,数据库连接技术等。
2.3数据库通信技术
数据库通信技术有数据通信,游标通信,SQLCA事务对象,数据库访问接口ODBC能支持本地的SQL语言,应用程序中主语言传入目标数据库以及数据库SQL语言嵌入的只能是官方的SQL语言,数据库接口开放性、互联性,目标数据库专用的数据库访问接口,访问一个应用程序端都需要安装程序接口。
2.4动态SQL技术
动态SQL技术处理程序当中的人机交互和大量数据库存取操作,存取操作的SQL语言所需要的参数需要人机交互,程序执行过程的人机交互,在程序设计中需要SQL语言的动态处理程序要求,动态SQL分动态更新、动态查询等,动态更新是直接执行的,SQL主语言系统连接数据库系统,数据连接具有交互性。
2.5数据库事务控制技术
所谓事务,是由于用户定义的一个数据库操作序列,这些操作或者全部执行或者一个都不执行,它是一个不可分割的逻辑工作单元,这种事务由于是作为一个单元整体被执行的,有时也被称为原子事务。
例如,在常用的关系数据库应用中,一个事务可以是一条SQL语句,一组SQL语句或者整个程序,但要注意,实务和程序是不同的两个概念,一般来说,一个程序中可包含若干事务。
事件驱动程序设计技术:
事件就是对象可能会发生的事情,微软的视窗系统(Windows)就是一个事件驱动环境,在事件驱动环境中,程序的流程并不能够预先确定,而是特定的事件触发应用程序中对应的某段代码,运行完成这些代码后系统会进入等待状态,等待下一个事件触发相应的代码。
Powerbuilder的应用程序是事件驱动,事件是由windous系统通过消息(message)传递的,windows系统接收到所有的硬件和软件事件(如按键,鼠标拖动,系统定时器等事件),并将事件转换为消息发送给相应的对象(窗口控件等),消息中包含了其类型码,类型码代表事件的类型,在PowerBuilder中用户可以为事件编写脚本,从而控制程序的运行,对用户的动作,或系统事件做出反应,在PowerBuilder中每一类对象都有一些预定义的事件,比如按钮控件有单击(clicked)事件,编辑框有更新(modified)事件等,一般来说,这些预定义的事件能满足用户的需求,如有特殊需求,用户还可以定义自己的用户事件。
三系统分析
3.1数据需求
3.11图书馆管理系统:
实体:
学生,图书
联系:
学生借阅图书
数据字典:
对于数据流图中的每个元素,都可以额通过数据字典加以描述,以保证数据定义的严格性,针对上述系统的数据字典如下:
借阅者管理=[添加借阅者|修改借阅者|删除借阅者|检索借阅者]
图书管理=[添加图书|修改图书|删除图书|检索图书]
借阅信息管理=[添加借阅信息|修改借阅信息|删除借阅信息|检索借阅信息]
管理个人信息=[检索个人信息|修改个人信息]
基本信息维护请求=[对借阅者类别信息的维护|对图书类别信息的维护|对登陆用户的维护]
对借阅者类别信息的维护=[对借阅者类别信息的添加|对借阅者类别信息的修改|对借阅者类别信息的删除|对借阅者类别信息的检索]
对图书类别信息的维护=[对图书类别信息的添加|对图书类别信息的修改|对图书类别信息的删除|对图书类别信息的检索]
对登录用户的维护=[对用户信息的添加|对用户信息的修改|对用户的删除|对用户信息的检索]
注册用户=借阅卡信息
注册用户=借阅者
借阅卡号=3{数字}3(假设)
性别=[男|女]
身份证号=18{数字}18
联系电话=(区号)+7{数字}7
区号=4{数字}4
办证日期=年+月+日
已借书数目=[0|1|2|3|4|5|6|7|8|9|10]
是否挂失=[挂失|没挂失]
挂失=1
没挂失=0
图书信息=图书号+书名+作者+出版社+出版日期+单价+图书类别+存放位置+入库日期+是否借出
图书=图书信息
图书号=3{数字}3()假设
同一本书副本编号=[0|1|2|3|4|5|6|7|8|9]
出版日期=年+月+日
图书类别=[一类图书|二类图书|三类图书|四类图书|五类图书|六类图书]
入库日期=年+月+日
是否借出=[借出|未借出]
借出=1
未借出=0
借阅信息=借阅卡号+姓名++书名(1~6)
借出日期=年+月+日
实际归还日期=年+月+日
系统基本信息=[借阅者类别信息|图书类别信息|系统用户]
能借书的数量=[1|2|3|4|5|6]单位:
本
图书类别信息=图书类别+可借天数+图书超期每天罚款金额
图书类别=[一类图书|二类图书|三类图书|四类图书|五类图书|六类图书]
可借天数=[10|20|30|40|50|60|70]单位:
天
图书超期每天罚款金额=[0.1|0.2]单位:
元
系统用户=用户名+密码+是否管理员
用户名=姓名
密码=1{字母|数字}8
是否管理员=[是管理员|不是管理员]
是管理员=1
不是管理员=0
3.12图书馆管理系统的ER图
根据上一小节的数据字典,得到系统E-R图,如图3.121-3.125。
物理结构:
对应图书管理系统有六张表,分别是:
表3-121“借阅者表”,表3-122“图书表”,表3-123“借阅表”,表3-124“借阅者类别表”,表3-125“图书类别表”,表3-126“系统用户表”。
表3-121借阅者表
字段名称
数据类型
是否关键字
是否可以为空
借阅卡号
decimal
是
否
姓名
Varchar(20)
否
否
性别
Boolean
否
否
身份证号
Varchar(30)
否
否
单位
Varchar(30)
否
是
家庭住址
Varchar(30)
否
是
联系电话
Varchar(30)
否
是
借阅者类别
Varchar(30)
否
否
办证日期
datetime
否
否
已借书数目
int
否
是
是否挂失
boolean
否
是
表3-122图书表
字段名称
数据类型
是否关键字
是否可以为空
图书号
decimal
是
否
书名
Varchar(20)
否
否
作者
Varchar(20)
否
否
出版社
Varchar(20)
否
否
出版日期
datetime
否
否
单价
money
否
否
图书类别
否
否
存放位置
Varchar(30)
否
是
入库日期
datetime
否
是
是否借出
boolean
否
否
表3-123借阅表
字段名称
数据类型
是否关键字
是否可以为空
借阅卡号
decimal
是
否
图书号
decimal
是
否
姓名
Varchar(20)
否
是
书名
Varchar(20)
否
是
借出日期
datetime
否
否
实际归还日期
datetime
否
否
罚款金额
money
否
是
表3-124借阅者类别表
字段名称
数据类型
是否关键字
是否可以为空
借阅者类型
Varchar(30)
是
否
能借书的数量
int
否
否
表3-125图书类别表
字段名称
数据类型
是否关键字
是否可以为空
图书类别
Varchar(30)
是
否
可借天数
int
否
否
图书超期每天罚款金额
money
否
是
表3-126系统用户表
字段名称
数据类型
是否关键字
是否可以为空
用户名
Varchar(20)
是
否
密码
Varchar(20)
是
否
是否是管理员
boolean
否
是
3.2功能需求
以图书管理为例使用powerbuilder创建表,建立数据连接,及事件的驱动,控键按钮等建立起图书系统,包括管理员的登陆,图书信息的查询,增,删,改等功能。
以及系统的维护。
本系统实现功能有:
查询功能:
用户查询自身所借书的名称,所借书本数,个人信息的查询;
登陆系统:
用户个人登陆账号,密码界面;
用户设置登陆密码,修改密码;
查询信息:
方便快速定位;
功能需求:
图书管理系统完整功能需求如下:
(1)借阅者管理
每个通过审查的人可以办理一张借阅卡,拥有用户名、密码,成为注册用户。
此卡包含所有个人信息,以后所有图书借阅活动凭此卡进行,直至该卡被注销或删除。
因此,对借阅者的管理包括相关信息的添加、修改、删除、检索。
1)图书信息管理
新书入库:
每本新到图书需将详细信息添加入库,方可对外借阅。
图书检索:
馆藏图书丰富,须提供图书快速查询检索功能。
图书信息修改:
图书基本信息入库时已基本确定,但是一些辅助信息,如存放位置,是否接触等会有变化,须提供修改功能。
图书信息删除:
对于太过破旧被淘汰或者丢失的书籍,要从系统信息中删除。
2)图书借阅信息管理
系统核心功能之一。
图书管理系统最主要的功能是对图书的借出和归还。
主要涉及被借阅的图书和借阅者,即图书基本信息,借阅者部分信息,借出归还日期等。
具体来说,对于借书,首先获得借阅者的信息,看其是否有权利借书,其次检查相关书籍,看其是否被可以被外借;对于还书,同样也需要借阅者信息和图书信息才能还书,同时还要计算本次借阅是否超期,超期要计算出罚款金额,借阅者交了足额罚款才能还书成功。
此外,对于历史借还记录要提供查询功能;同时由于存储空间限制,不能永久保存历史记录,还需提供删除记录功能。
3)用户登录
该系统用户主要有系统管理员和普通注册用户(即持有借阅卡的借阅者)两种。
系统管理员拥有所有功能权限,普通注册用户只能管理个人信息和检索需要图书。
系统要对不同的用户给予不用权限,每个合法用户凭登录名和密码登陆此系统。
4)系统基本信息管理
对借阅者类别的设置:
对于借阅者设置不同类别,不同类别的借阅者设置不同的借阅图书数量上限。
对图书类别的设置:
不同类别图书的借阅期限不同,超期后的罚款金额也不同。
对系统用户的管理:
本系统暂定两类用户,系统管理员和普通注册用户,不同用户拥有不同的使用权限。
3.3运行环境需求
图书馆管理系统采用PowerBulider9.0来进行操作的,虽然PowerBuilder不断的在更新,功能不断的在增加,针对于不同的企业或个人都能找到适合自己的版本,但对于小型的图书馆管理系统的运行开发已经足够了,它是一种面向对象编程的快速开发工具,方便使用。
四系统设计与实现
4.1用户界面技术
本系统共设置了“服务工具”,“个人信息编辑”,“图书信息查询”,“系统维护”,“图书管理”,这五个菜单,在设计中在tushumenu中设置,并为每个菜单项的子选项设置“clicked”事件,使每个功能项能够连接数据库,并且实现其工能选项:
4.2数据查询与编辑功能设计
该系统设计了一个主控功能选项,用户只有登录之后才能访问和使用该系统,连接数据库后用户能够访问个人信息,按类查询图书,查询自己所借图书详细信息等。
学生主体信息,学生信息的增删改功能等
增加个人信息表:
(为了简化工作量,减少了部分个人信息)
删除个人信息表没有选中学生表时,弹出的对话窗口
删除个人信息表选中学生信息时,弹出的对话窗口
修改个人信息表没有选中学生信息时,弹出的对话窗口
修改个人信息表选中学生信息时,弹出的对话窗口
该功能主要是图书按类别查询(该系统一图书馆图书的出版社为类别筛选)
添加功能实现部分:
修改功能实现部分:
删除功能实现部分:
本章内容主要展示了我做的图书管理系统的功能实现,open事件代码,clicked事件代码。
也就是各个实现功能的代码,即该系统的详细内容。
移植工具代码,连接数据库:
getenvironment(ge_Environment)
this.microhelpdefault='研制人:
河海大学文天学院咨询电话:
12345678901'
inifile="tushu.ini"
open(w_main)
//DatasourcenameforODBC:
mydb
//DataBaseProfileName:
mydb
//DataBaseAccount:
dba-----sql
代码部分如下:
登陆系统:
open(w_login)
退出系统:
close(parent)
修改口令:
open(w_cpasswd)
学生档案编辑:
setpointer(HourGlass!
)
opensheet(w_tushu_2_browse,w_main,1,layered!
)
学生档案查询:
setpointer(HourGlass!
)
opensheet(w_tushu_2_query,w_main,1,layered!
)
图书信息编辑:
setpointer(HourGlass!
)
opensheet(w_tushu_4_browse,w_main,1,layered!
)
图书信息查询:
setpointer(HourGlass!
)
opensheet(w_tushu_4_query,w_main,1,layered!
)
设置用户账户:
opensheet(w_set,w_main,1,layered!
)
图书类别编辑:
setpointer(HourGlass!
)
opensheet(w_jj_browse,w_main,1,layered!
)
主窗口
Open事件:
(1)通过游标生成系别的下拉列表;
(2)为数据窗口设置事务对象。
系别名称下拉列菜单select的事件:
(1)获取下拉列表当前系列名称;
(2)对数据窗口按系别名称提取数据。
Open事件代码:
setdbparm_for_sqlca();
connectdb_by_sqlca();
stringmc
longi;
sle_logid.reset()
declarestart1cursorfor
selectuser_xm
fromdmuser
whereallow_log='y'andxm_select='y'
orderbyuser_xm;
openstart1;
fetchstart1into:
mc;
i=1
dowhilesqlca.sqlcode=0
sle_logid.InsertItem(mc,i)
i=i+1
fetchstart1into:
mc;
loop
closestart1;
数据窗口的click事件:
(1)获取当前行的行号;
(2)撤销原有的高亮度;
(3)为当前行号设置高亮度。
确认按钮事件:
stringpassword,allow_log,log_string
log_string=sle_logid.text
selectuser_xm,password,allow_log
into:
czyxm,:
password,:
allow_log
fromdmuser
whereuser_xm=:
log_string;
ifsqlca.sqlcode=100ortrim(sle_logpass.text)<>passwordthen
messagebox('警告','Error6您的帐户不正确,不能登录系统!
')
sle_logid.setfocus()
return
endif
ifnotallow_log='y'then
messagebox('警告','Error7您的帐户没有获准注册权限,不能登录系统!
')
sle_logid.setfocus()
return
endif
stringdb_edit,db_query,sys_wh
selectdb_edit,db_query,sys_wh
into:
db_edit,:
db_query,:
sys_wh
fromdmuserwhereuser_xm=:
czyxm;
ifsqlca.sqlcode<>0then
messagebox('警告','您的帐户不正确,请系统管理员检查您的帐户!
')
return
endif
ifisnull(db_edit)thendb_edit='n'
ifisnull(db_query)thendb_query='n'
ifisnull(sys_wh)thensys_wh='n'
open(w_main)
messagebox('','登陆成功')
close(parent)
放弃:
close(parent)
系统维护功能
增加用户
修改功能:
删除功能:
代码部分:
Open事件代码:
rollback;
ifnotpb_1.enabledthen
messagebox('提示','您在“编辑”状态下退出,会丢失刚才的编辑结果!
')
endif
主窗口代码:
ifnotrow>0then
return
endif
ifedit_bz=''then
this.selectrow(0,false)
this.selectrow(row,true)
this.SetRow(row)
return
endif
添加按钮click事件:
(1)打开编辑窗口,发送“添加”标志;
(2)等编辑窗口关闭以后,浏览数据窗口与数据库同步。
添加按钮控件:
intold_row,new_row
old_row=dw_1.getselectedrow(0)
ifnotold_row>0then
old_row=0
endif
dw_1.selectrow(0,false)
new_row=dw_1.insertrow(old_row)
dw_1.selectrow(new_row,true)
dw_1.setitem(new_row,'allow_log','y')
dw_1.modify("user_xm.tabsequence=10")
dw_1.modify("password.tabsequence=20")
dw_1.modify("allow_log.tabsequence=30")
dw_1.modify("xm_select.tabsequence=40")
dw_1.modify("db_edit.tabsequence=50")
dw_1.modify("db_query.tabsequence=60")
dw_1.modify("sys_wh.tabsequence=70")
pb_1.enabled=false
cb_1.enabled=false
cb_2.enabled=false
cb_3.enabled=false
cb_4.enabled=true
cb_5.enabled=true
edit_bz='append'
修改按钮click事件:
(1)要获取数据窗口当前行的行号;
(2)打开编辑窗口;
(3)把靶子记录行号、学号送到消息队列并且把“修改”标志传送到消息队列中,同步数据窗口与表数据。
修改按钮代码:
intn
n=dw_1.getselectedrow(0)
ifnotn>0then
messagebox('提示','请选择将要修改的用户记录!
')
return
endif
dw_1.modify("user_xm.tabsequence=10")
dw_1.modify("password.tabsequence=20")
dw_1.modify("allow_log.tabsequence=30")
dw_1.modify("xm_select.tabsequence=40")
dw_1.modify("db_edit.tabsequence=50")
dw_1.modify("db_query.tabsequence=60")
dw_1.modify("sys_wh.tabsequence=70")
pb_1.enabled=false
cb_1.enabled=false
cb_2.enabled=false
cb_3.enabled=false
cb_4.enabled=true
cb_5.enabled=true
edit_bz='modify'
删除按钮click事件:
(1)获取数据窗口靶记录;
(2)打开编辑窗口;
(3)编辑窗口返回以后浏览数据窗口,同步显示数据库。
删除按钮代码:
intn,rowsub,net,delopt=0,have_sub=0,yn1
stringuser_dm,gl_sys=''
n=dw_1.getselectedrow(0)
ifnotn>0then
messagebox('提示','请选择将要删除的用户记录!
')
return
endif
user_dm=dw_1.getitemstring(n