数据库课程设计指导书级.docx
《数据库课程设计指导书级.docx》由会员分享,可在线阅读,更多相关《数据库课程设计指导书级.docx(41页珍藏版)》请在冰豆网上搜索。
数据库课程设计指导书级
计算机科学与技术专业
数据库课程设计指导书
张胜男主编
二○一○年十月
第1章数据库应用系统开发概述
数据库应用系统是在计算机软硬件系统和某一数据库管理系统(如Access、SQLServer等)的支持下,针对具体的实际应用而开发设计的信息管理系统。
如学生成绩管理系统、高校教学管理系统、图书借阅系统、旅店服务管理系统等都是数据库应用系统的具体实例。
在我们的实际生活中,数据库应用系统无处不在,大到互联网支持下的全国或全球管理信息系统,小到某个单位、部门或个人的某项工作的计算机管理。
我们在计算机上的主要工作之一都会直接或间接地同数据库有关,即访问本地或远程数据库中的数据。
设计开发一个数据库应用系统不是一件容易的事,特别对于大型的系统更是如此,通常需要许多人组成的一个开发团队经过较长时间的努力才能完成。
开发团队中一般需要有熟悉数据库设计理论和某一种或几种数据库管理系统(如Access、SQLServer等)的专家,熟悉某一种或几种数据库应用系统开发工具(如PB、VB、VC、DELPHI等)的专家和熟悉具体业务的专家。
当然,对于小型的数据库应用系统开发,可能这些专家角色都由一个人来扮演,他需要了解和掌握各个方面的情况,尽量把系统开发做好,满足使用者的需求。
数据库课程设计一般要求同学们能针对某一个相对简单的应用,设计好数据库,并利用某一种开发工具实现使用者所需要的功能。
我们在这一章中就是介绍数据库设计的基本过程。
一个实际的数据库应用系统开发过程大致经过五个阶段:
需求分析、概念设计、逻辑设计、物理设计和机器实现。
1.1需求分析阶段
需求分析阶段定义了所设计的系统必须具有的能力,一个系统设计的成功与否往往取决于它是否符合一系列的用户需求.因此需要先探讨用户需求的确切含义,把它们写下来、组织起来,然后才考虑去设计和实现这些需求,所以说需求分析是设计过程中的最重要的基础性工作。
因此,准确、完整和规范化的需求分析是数据库应用系统开发成功的关键。
需求分析过程大致要经过如下四个阶段:
需求获取、需求提炼、撰写需求说明书和用户对需求的确认。
所谓需求获取就是围绕题目进行调查研究,与将要使用该系统的用户进行充分沟通,了解系统设计的目的、意义,要达到的预期目标,现有系统的状况,业务处理流程,用户希望的主要功能及特殊要求,并收集所有的数据资料。
在需求获取基本完成的基础上,我们要对调研所收集到的所有需求信息进行归类、整理、筛选、抽象(抽取本质特性,去掉非本质内容)、提炼、分析和仔细审查,以确保准确地明白其含义并找出其中的错误、遗漏或其它不足的地方。
在分析的过程中,我们还应该注意与用户的沟通,以便澄清某些易混淆的问题,并明确哪些需求更为重要,其目的是确保与用户尽早地达成共识,并对设计系统有较清晰的认识。
用户需求(功能)说明书,又称之为“远景文档”、“愿景文档”或“Vision”。
我们对于上一步骤得到的需求分析结果,经整理后,都必须用一种统一的方式将它们编写成用户需求(功能)说明书。
用户需求(功能)说明书阐述你所设计的系统必须提供的功能和性能以及它所要考虑的限制条件,它不仅是系统测试和用户文档的基础,也是后续设计和编码、测试的基础。
为确保系统设计者对用户需求的理解正确,设计者完成了用户需求说明书之后,要请有关用户对需求规格说明书及相关模型进行仔细的检查,确认这些需求的正确性和还未包括的内容,并进行有关的修正。
对于简单的系统设计,在需求分析阶段,设计者应该与使用者进行多次交流,了解系统的相关流程和详细要求,然后整理撰写需求说明书,最后请使用者确认。
1.2概念设计阶段
概念设计阶段的主要任务和目标是根据需求分析的结果找出所有的数据实体及其相互联系,画出对应的E-R图。
对于较复杂的系统,先按功能或使用者的权限画出局部E-R图,然后把各个局部E-R团综合起来形成统一的整体E-R图。
概念设计要贯彻概念单一化原则,即一个实体只用来反映一个事实,一个实体中的所有属性都是与本实体直接相关的。
尽量消除非主属性对主码的部分依赖和传递依赖,为规范数据库设计做好准备工作。
1.3逻辑设计阶段
逻辑设计阶段的主要任务和目标是根据概念设计的结果设计出数据库的逻辑结构模式。
对于RDBMS而言,主要是确定数据库由哪些基本表组成,每个基本表由哪些属性列组成。
然后考虑每个属性列的数据类型和宽度等,还需要通过主码和外码确定表与表之间的关系。
在将E-R图转换为逻辑设计的结果时,原来的实体转换成对应的基本表或视图。
原来的l对1或1对多联系通常不需要专门转换为对应的基本表,因为这能够通过表中使用主码和外码约束来实现,原来的多对多联系通常需要转换为对应的基本表,该表中的主码是两端实体的主码的联合体。
1.4物理设计和实现阶段
物理设计阶段的任务和目标是根据数据库的逻辑设计结果设计出相应的内模式。
对于关系数据库系统来说.它能够自动把用户设计好的数据库全局模式转换为相应的内模式,至多需要用户考虑是否建立索引,使用什么方式的索引等简单问题,所以数据库的物理设计相对比较简单。
机器实现阶段的主要任务和目标就是在实际的计算机系统中建立数据库应用系统。
它包括建立数据库模式(即逻辑结构模式和存储结构模式),通过装入数据建立真实的数据库,按照需求分析中规定的对数据的各种处理需求,结合特定的DBMS和开发环境编写出相应的应用程序和开发出相应的操作界面。
总之,要在计算机上得到一个满足设计要求的、功能完善和操作方便的数据库应用系统。
在这一阶段,当装入少量实验数据和真实数据之后,就可以编写和调试程序,检查数据库模式的正确性、完整性和有效性,若发现问题则可修改数据库模式结构。
以上有关数据库应用系统开发过程的介绍比较抽象,在第二章的内容中我们将通过一些设计实例让同学们逐渐理解其意义。
第2章数据库应用系统开发实例
2.1系统需求及功能说明
在大学里,许多院系都有自己的图书资料室。
藏书量并不是非常大,借阅者多为本院系的师生。
往往许多借阅工作都由手工登记。
这不仅不利于管理,更给资料的查询带来极大的不使。
本案例讲解了基于PowerBuilder如何创建一个图书借阅管理系统。
在这个系统中要实现以下主要功能:
●图书出借
●图书归还
●图书整理
●打印报表
●用户管理
2.2数据库设计
对于比较复杂的系统,其数据库由比较多的表所组成,每个表可能会涉及到比较多的数据项,而各个表之间又可能存在较复杂的关系。
我们所设计的“图书借阅管理系统”是比较简单的演示系统,其数据库book中只有两个表,一个是“用户表”users,另一个是“图书及借阅信息表”maindata。
两个表之间通过学号进行关联。
数据表maindata的数据结构如下表2.1。
表2.1maindata表结构
字段名
数据类型
大小
允许为空
关键字
Number
Bookname
Type
Price
Pubname
Pubdate
Char
Varchar
Char
Numeric
Varchar
Date
10
24
1
16
40
N
N
N
Y
Y
Y
Y
续表2.1
字段名
数据类型
大小
允许为空
关键字
Borrowname
Borrowdate
Returndate
Memo
Flag
Varchar
Date
Date
Varchar
Integer
10
40
Y
Y
Y
Y
Y
对数据表maindata,我们建立索引main,索引列为number和type。
数据表users的结构如下表2.2。
表2.2users表结构
字段名
数据类型
大小
允许为空
关键字
默认值
Id
Username
Password
Integer
Varchar
Varchar
10
10
N
N
Y
Y
Autoincrement
2.3登录窗口设计
2.3.1界面设计
在进入系统之前,我们需要验证使用者的权限。
如果没有经过安全检查,则不能进入主控界面。
下面是登录窗口的创建过程。
(1)在Powerbuilder的工具画板上,点击New按钮,选择创建一个窗口对象,将其存为w_login。
(2)在窗体中添加两个静态文本控件,分别用作用户名和密码输入项的标签。
(3)在窗体中添加两个单行编辑控件,用以输入用户名和密码。
(4)添加一个命令按钮,将其Text属性设置为“登录”,用以登录系统。
最终效果如图2.1所示。
注意:
①为了屏蔽用户输入的真实密码,需要将用于密码输入的单行编辑框的password属性设置为TRUE。
②为防止特权用户窃取用户密码,实际应用中需要将数据库中用户密码进行加密,读取时解密。
图2.1登录窗体的布局图
2.3.2代码编写
当按下“登录”按钮时,要从数据表中查询所输入的用户名和密码是否都符合档案记录。
如果符合条件的记录数大于0,说明符合要求,于是打开主控窗体。
在该按钮的clicked事件脚本窗口中添加如下代码:
stringpwd,username
intrc,net
//将用户的输入内容赋值给相关变量
username=sle_1.text
pwd=sle_2.text
//将用户名和密码作为查询语句中的限制条件
selectcount(id)
into:
rc
fromusers
whereusername=:
usernameandpassword=:
pwc
usingsqlca;
ifrc>0then
m_main.enabled=ture
ifusername=”adn”then
//只有用户adm才有权管理整个用户表
m_main.m_文件.m_管理用户.enabled=ture
else
m_main.m_文件.m_管理用户.enabled=false//屏蔽该子菜单项
endif
loginOK=”ok”
w_main.visible=ture
else
net=messagebox(“提示:
”,”用户名或者密码与档案不符,请重新输入!
按Cancel取消。
&”,Exclamation!
OKCancel!
2)
endif
ifnet=1then
return1
else
close(parent)
endif
注意:
验证用户密码输入时,一般应给用户三次机会。
如果连续三次录入错误,系统自动终止。
为此需要定义一个实例变量(instancedvariable,此种类型变量相当于一个窗体及变量)作为计数器,控制登录验证次数。
2.4主界面和菜单设计
2.4.1主界面设计
因为许多功能都要在各自的窗体中实现,在主窗体中不需要实现什么功能。
所以,主窗体的制作非常简单,只放置了一个静态文本控件。
(1)新建一个空白窗体,设置其Title属性为“图书借阅管理系统”,保存为w_main。
注意,系统主窗体类型一般为MDI类型。
(2)设置该窗体的MenuName属性为m_main。
(3)添加一个静态文本控件st_1。
该窗体的open事件如下:
//没有通过登录检查,或尚没有进入登录界面
IfLoginOK<>”ok”then
//打开登录界面
open(w_login)
this.visible=false
endif
2.4.2菜单设计
按照图2.2所示创建一个菜单,使得能够点击菜单项进入相关的功能模块。
创建步骤如下:
(1)新建一个菜单对象,保存为m_main。
(2)在m_main项上,按右键,选择InserSubmenuItem项。
新建两个子菜单项目:
文件和图书管理。
(3)在子菜单文件上,按右键,选择InserSubmenuItem项。
添加4个子菜单:
打印设置,打印报表,管理用户,退出。
(4)在子菜单“图书管理”上,按右键,选择InserSubmenuItem项。
添加3个子菜单:
图书出借,图书归还,图书整理。
图2.2菜单m_main的设计
各个菜单项的clicked事件代码如下:
(1)文件
●打印设置:
PrintSetup()
●打印报表:
open(w_report)
●管理用户:
open(w_users)
●退出:
close(w_main)
(2)图书管理
●图书出借:
open(w_borrow)
●图书归还:
open(w_return)
●图书整理:
open(w_bookhandle)
2.5图书管理模块
2.5.1图书出借模块
2.5.1.1窗体设计
图书出借窗口创建步骤如下:
(1)新建窗口对象,保存为w_borrow。
(2)添加静态文本2个,text属性分别为“根据书名检索”和“输入借阅者的姓名。
(3)添加两个单行编辑控件,用以输入书名和借阅者姓名。
(4)添加3个命令按钮控件,text属性分别为“搜索”,“浏览全部”,“借阅图书”。
(5)添加一个数据窗口控件,其dataobject属性设置为d_borrow。
窗口界面如图2.3所示。
图2.3图书出借窗口
2.5.1.2数据窗口设计
在窗口中,数据窗口控件dw_1的dataobject设置为d_borrow。
在设计窗口w_borrow中,最好先创建数据窗口对象d_borrow。
为了给同学一个明确的框架,对数据窗口的叙述放在窗口w_borrow的后面。
对其余的数据窗口的安排亦如此,理由也相同。
如何创建一个数据窗口,可以参考相应教科书。
2.5.1.3代码编写
输入书名,按“搜索”按钮搜索符合该书名条件的记录。
通过对数据记录集进行过滤可得到相关结果。
给“搜索”按钮添加如下clicked事件代码:
stringfilterstr
stringbookname
integerrc
bookname=sle_1.text
filterstr=”bookname=’”+bookname+”’”
dw_1.SetTransobject(SQLCA)
//设置过滤条件
dw_1.SetFilter(filterstr)
//根据条件过滤记录集
dw_1.Filter()
dw_1.Retrieve()
//获得数据窗口dw_1的记录行数
rc=dw_1.gerow()
ifrc<=0then
messagebox(”提示:
”,”没有该书记录!
”)
return1
else
dw_1.title=”书名=”+bookname+”的记录如下:
”
endif
有时候,借阅者并不知道书的准确名字,这样需要提供一个搜索所有资料的按钮。
可以逐条查问,通过翻查找到借阅者想借的资料。
因为藏书量不大,不会非常费力。
这里要注意清除用户以前设置的filter属性。
否则,将得不到所要的记录集。
按钮“查询全部”的clicked事件代码如下:
dw_1.SetTransObject(SQLCA)
//清除以前的过滤条件
dw_1.SetFilter(“”)
dw_1.Filter()
//取记录
dw_1.Retieve()
当选中了要借乐的图书后,输入借阅者的名字,执行出借操作。
没有姓名不能出借,因为无法记录图书去向,避免可能造成的陨失。
如果无意选择了并不在库的图书,要提示用户该书不能再行借阅。
是否在库只要看归还日期是否为空。
如果为空,则表明已经借出,尚未归还,否则,该书在库,当一本书借出时,要将该书的记录的某些字段值进行相应修改,将归还日期置为空,出借日期记为当前日期,借阅人记为输入的姓名。
按钮“借阅图书”的clicked事件代码如下:
integeri
intflag
dateborrowdate
stringborrowname
stringselname
stringerr
//出借日期记为系统日期
borrowdate=today()
borrowname=sle_2.text
//姓名检错
ifborrowname=””then
massagebox(”警告:
”,”没有借阅人姓名,不能借出!
”)
return
endif
//逐条判断是否被用户选中
fori=1todw_1.getrow()
flag=dw_1.GetItemNumber(1,”flag”)
ifIsNull(dw_1.GetItemDate(i,”returndate”))then
//如果没有归还日期,说明已借出
err=err+””+dw_1.GetItemString(i,”number”)+”~n”
else
//如果有归还日期,说明在库中
//如果选中,更改该条记录的借阅人,借阅日期,归还日期等字段值
Ifflag=1then
selname=dw_1.GetItemString(i,”mumber”)
UPDATEmaindata
SETborrowdate=:
borrowdate,
borrowname=:
borrowname,
returndate=null
WHEREnumber=:
selname
USINGSQLCA;
endif
endif
next
iferr<>”“then
messagebox(“Error”,”下列图书不能借:
~n”+err)
endif
dw_1.retrieve()
2.5.2图书归还子模块
2.5.2.1窗口设计
设置完成后的窗口效果如图2.4所示。
创建图书归还窗口的步骡如下:
(1)新建一个窗口对象,保存为w_return。
(2)添加一个静态文本控件,其text属性设为“姓名”。
(3)添加一个单行编辑控件,用以输入姓名。
(4)添加两个命令按钮控件,其text分别设置为“查询所借图书”和“归还图书”。
(5)添加—个数据窗口控件,其dataobject属性设置为d_return。
选中titlebar,设置tilte为“选中你要归还的图书”。
2.5.2.2数据窗口设计
在窗口中,数据窗口控件dw_1的dataobject设置为d_return。
图2.4图书归还窗口布局
2.5.2.3代码编写
在该模块中,可以实现输入人名查询该人所借图书。
只有borrowname(借阅人姓名)等于所输入姓名并且returndate〔归还日期)为空的记录,才满足条件。
这点也通过设置过滤条件来实现。
stringfilterStr
stringname
integerrc
name=sle_name.text
filterStr=”borrowname=’”+name+”’andIsNull(returndate)”
dw_1.setTransobject(SQLCA)
//设置过滤条件
dw_1.setFilter(filterStr)
//过滤记录集
dw_1.Filter()
dw_1.Retrieve()
//获取记录集的条数
rc=dw_1.getrow()
ifrc<=0then
messagebox(“提示:
“,”没有姓名=”+name+”的借书记录!
”)
retuen1
else
dw_1.title=”此人借书记录如下(共”+string(rc)+”)”
endif
当数据窗口中显示所借书的全部记录后,可以选择欲归还的图书。
归还操作执行时,要将符合条件的记录的某些字段的值进行相关修改:
归还日期设置为当日,借阅人设为空。
“归还图书”按钮的clicked事件可实现这一功能。
代码如下所示:
inti
intflag
datereturndate
stringBookNo
//归还日期记为系统日期
returndate=today()
//逐条判断是否被选中
fori=1todw_1.getrow()
flag=dw_1.GetItemNumber(i,”flag”)
//如果选中,将该记录的归还日期更改
ifflag=1then
BookNo=dw_1.GetItemString(i,”number”)
UPDATEmaindata
SETreturndate=:
returndate,
Borrowname=null
WHEREnumber=:
BookNo
USINGSQLCA;
endif
next
messagebox(”提示:
”,“归还图书操作成功!
”)
dw_1.retrieve()
2.5.3图书整理子模块
2.5.3.1窗口设计
平时我们要对图书数据进行一些必要的整理,例如添加记录、删除记录、修改记录。
该系统提供了一个图书整理模块,如图2.5所示。
创建图书整理窗口的过程如下:
(1)新建一个窗口对象,保存为w_bookhandle。
(2)依次添加8个命令按钮。
其text分别设置为:
“保存”,“放弃”,“增加”,“删除”,“上一条记录”,“下一条记录”,“允许修改”,“退出”。
(3)添加一个数据窗口控件,其dataobject设为d_bookhandle。
图2.5图书整理窗口布局
2.5.3.2数据窗口设计
在窗口w_bookhandle中,数据窗口控件dw_1的dataobject属性设为d_bookhandle。
在生成数据窗口时,选择freeform格式。
根据显示需要,要调整某些控件的位置、大小等。
2.5.3.3代码编写
在打开窗口时,先要显示出所有记录,并且使数据窗口dw_1不可编辑。
下面是窗口w_bookhandle的open事件代码:
dw_1.SetTransObject(SQLCA)
dw_1.Retrieve()
dw_1.Enabled=False
按钮“添加”的clicked事件代码如下:
Integerli_Row
//使某些按钮(如添加、删除、更改等)不可用
cb_add.Enabled=false
cb_delete.Enabled=false
cb_change.Enabled=false
cb_next.Enabled=false
cb_prior.Enabled=false
cb_save.Enabled=Ture
cb_giveup.Enabled=Ture
//数据窗口控件dw_1获得焦点
dw_1.Setfocus()
//插入一条空行记录,以待修改
li_Row=dw_1.insertRow(0)
//滚动到指定行
dw_1.ScrollToRow(li_Row)
按钮“删除”的clicked事件代码如下:
InregerNet
//删除之前,要提醒用户
Net=MessageBox(“警告:
”,”你确信要删除这条记录吗?
”,&
Question!
YesNo!
2)
IfNet=1then
//删除当前行
dw_1.DeleteRow(0)
endif
按钮“上一条记录”的clicked事件代码如下:
//移动到上一条记录
dw_1.ScrollPriorRow()
按钮“下一条记录”的clicked事件代码如下:
//移动到下一条
dw_1.ScrollNextRow()
按钮“允许修改”实现“锁定”功能。
当浏览数据时,不允许发生添加、删除、更改等操作。
同样,当添加记录、删除记录