第七章 数据库系统开发实例.doc_第1页
第七章 数据库系统开发实例.doc_第2页
第七章 数据库系统开发实例.doc_第3页
第七章 数据库系统开发实例.doc_第4页
第七章 数据库系统开发实例.doc_第5页
已阅读5页,还剩26页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

第七章 数据库应用系统开发示例本章通过两个示例,介绍数据库应用系统的设计与开发过程。既是对前面几章所介绍内容的总结与应用,也为读者将来开发一个实际的数据库应用系统提供一些帮助。本章主要介绍以下两个示例: 教学管理系统 图书借阅管理系统第一节 教学管理系统 教学管理系统是学校现代化管理的重要组成部分,是推动学校教学管理走向科学化、规范化的必要条件。教学管理工作量大、复杂,搞好教学管理工作是维持教学活动的正常运转,确保教学质量的重要保障。利用教学管理这一数据库应用系统,可以让教学管理人员科学地、规范地管理与教学有关的数据,不仅节约大量的人力与时间,提高工作效率,而且还可以减少差错和漏洞。因此,开发教学管理系统是非常必要的。一、需求分析教学管理工作涉及到教学的各个环节,为简单起见,这里只涉及对教师授课与学生选课的部分管理工作。具体包括以下主要内容: 教师基本信息的编辑(包括教师基本信息的增加、修改、删除与查询)。 学生基本信息的编辑(包括学生基本信息的增加、修改、删除与查询)。 课程基本信息的编辑(包括课程基本信息的增加、修改、删除与查询)。 学生选课信息的编辑(包括选课信息的增加、修改、删除与查询)。 教师任课信息的编辑(包括任课信息的增加、修改、删除与查询)。 学生成绩的输入与修改。 选课、任课信息的统计。 需求分析的最终结果可用数据流程图、数据字典等表示出来(这些内容可在学完信息系统分析与设计课程后加以完善,这里从略)。二、数据库概念结构设计数据库的概念结构设计有多种方法,这里采用E-R模型进行概念结构设计。由需求分析可以得出,该教学管理系统所涉及到的实体有以下三个: 教师:用于描述一个教师的基本情况,其属性包括:教师号、姓名、性别、年龄、职称、电话,其中教师号为码。 学生:用于描述一个学生的基本情况,其属性包括:学号、姓名、性别、年龄、班级,其中学号为码。 课程:用于描述一门课程的基本情况,其属性包括:课程号、课程名、课程类别(必修或选修)、课时、学分,其中课程号为码。根据语义(即该问题的实际情况)分析知:一个教师可以讲授多门课程,一门课程也可以有多名教师讲授;一个学生可以选修多门课程,一门课程也可以有多名学生选修。根据以上分析,可设计出该教学管理系统所对应的E-R图,如图7-1所示。教师学生学号姓名性别年龄课程课程号课程名学分选课成绩任课教师号姓名性别职称nm班级课程类别课时学号年龄电话mn图7-1教学管理系统E-R图三、数据库逻辑结构设计1关系模式的设计进行数据库的逻辑结构设计,首先要将概念结构设计中所得到的E-R图转换成等价的关系模式。根据第三章介绍的将E-R图转换成等价的关系模式的方法,图7-1所示的E-R图可以转换成以下5个关系模式: 教师(教师号,姓名,性别,年龄,职称,电话)。 学生(学号,姓名,性别,年龄,班级)。 课程(课程号,课程名,课程类别,课时,学分)。 选课(学号,课程号,成绩),其中学号为引用学生关系的外键,课程号为引用课程关系的外键。 任课(教师号,课程号),其中教师号为引用教师关系的外键,课程号为引用课程关系的外键。2关系模式的优化设计好基本的关系模式以后,接下来要对它们进行优化。根据第三章介绍的关系规范化理论,上述各关系模式中,由于每个非主属性都不传递依赖于主键,因此,他们均满足第三范式。四、数据库的建立本例使用VB提供的可视化数据管理器来建立Access数据库。表7-17-5给出了上述5个关系模式所对应的5个表的基本结构,具体的数据库(数据库名为student)及其表(表名分别为:教师,学生,课程,选课,任课)的建立,请读者根据第五章介绍的方法自行完成。需要说明的是,由于Access为小型数据库,因此它并不具备数据库安全控制中所要求的所有功能(如参照完整性)。表7-1 教师表结构 表7-2 学生表结构字段名数据类型长度约束字段名数据类型长度约束教师号Text(字符串)6主键学号Text(字符串)6主键姓名Text(字符串)10姓名Text(字符串)10性别Text(字符串)2默认值男性别Text(字符串)2默认值男年龄Byte(字节型)118 and 100年龄Byte(字节型)115 and 100职称Text(字符串)10班级Text(字符串)10电话Text(字符串)12表7-3 课程表结构 表7-4 选课表结构字段名数据类型长度约束字段名数据类型长度约束课程号Text(字符串)2主键学号Text(字符串)6主键课程名Text(字符串)20课程号Text(字符串)2主键课程类型Text(字符串)4默认值必修成绩Byte(字节型)1=1 and 0学分Byte(字节型)1表7-5 任课表结构字段名数据类型长度约束教师号Text(字符串)6主键课程号Text(字符串)2主键五、数据库系统应用程序设计在第五章已经介绍过,当建立了数据库之后,接下来就要进行应用程序的设计,它是用户和数据库之间的接口或界面,用户通过应用程序对数据库进行操作。1系统功能设计应用程序的设计以系统功能为依据,因此,在进行应用程序设计之前,先进行数据库系统的功能设计。数据库系统的功能设计与传统的程序设计类似,在软件工程中所介绍的程序设计方法均可用于数据库系统的功能设计。由于我们这里所介绍的教务管理系统的功能相对来说比较简单,因此我们仅给出该系统的功能结构图(如图7-2所示)。教务管理系统基本信息的编辑信息查询数据统计输入数据修改数据删除数据查询教师的基本信息查询学生的基本信息查询课程的基本信息查询任课的基本信息查询选课的基本信息统计任课人数统计选课人数统计选课学分查询学生的成绩信息图7-2 教务管理系统功能结构图2应用程序设计本示例利用VB标准的数据(Data)控件来操作数据库。(1)设计用户界面。本示例共设计9个窗体,其中MainFrm为主窗体,在该窗体上包含一个标签控件及功能菜单(如图7-3所示)。功能菜单的结构如图7-4所示。各菜单项的名称见程序代码。图7-3 教学管理系统主窗体数据编辑教师信息学生信息课程信息选课信息任课信息成绩输改数据查询查询教师信息查询学生信息查询课程信息查询选课信息查询任课信息查询学生成绩按教师号查询按教师姓名查询按职称查询按学号查询按姓名查询按班级查询按课号查询按课名查询按学号查询按姓名查询按班级查询按课号查询按课名查询按教师号查询按教师名查询按课号查询按课名查询按学号查询按姓名查询按课号查询按课名查询按班级查询数据统计统计任课教师人数统计某门课选课人数统计某位学生总选课学分退出系统图7-4 功能菜单的结构TFrm为教师信息编辑窗体(其ControlBox属性设置为False,此时窗体的最小化、最大化、关闭按钮都消失)。它包含2个Data控件(Visible属性均设置为False,以下所有Data控件的Visible属性均设置为False,不再重复说明)、1个DBGrid控件(DataSource属性设置为Data1,AllowUpdate设置为False)、1个Frame控件、7个Label控件、4个Text控件、2个ComboBox控件(对应性别的ComboBox控件CmbSex的List属性设置为男和女,对应职称的ComboBox控件CmbTitle的List属性设置为教授、副教授、讲师和助教)以及6个Command控件(其中“确定”与“取消”按钮的Visible属性设置为False)。各控件的Name属性设置见程序代码,窗体、标签、框架、命令按钮的Caption属性的设置见窗体界面,4个Text控件和2个ComboBox控件的Enabled属性均设置为False。图7-5给出了教师信息编辑窗体运行时的界面。在图7-5中,当单击“增加”或“修改”按钮时,进入数据输入与修改状态,此时4个Text控件和2个ComboBox控件的Enabled属性均设置为True,“增加”、“修改”、“删除”、与“关闭窗口”按钮的Visible属性均设置为False,“确定”与“取消”按钮的Visible属性均设置为True,当单击“确定”或“取消”按钮来接受或取消输入(或修改)的数据时,窗体又恢复到图7-5所示的界面。图7-5 教师信息编辑窗体SFrm、CFrm、SCFrm、TCFrm分别为学生、课程、选课、任课信息编辑窗体。它们的界面设计与TFrm窗体基本一致,限于篇幅,这里从略。留给读者作为练习。图7-6 成绩输改窗体GradeFrm为成绩输入与修改的窗体(如图7-6所示)。它包含3个Data控件、1个DBGrid控件(DataSource属性设置为Data1,从属性页对话框的Layout选项卡中选中学号一列的Locked复选框,使该列不可修改)、3个Label控件(其中用来显示所选学生姓名的标签Label3的BorderStyle的属性值为1)、1个ComboBox控件以及1个Command控件。QueryFrm为查询结果显示窗体(如图7-7所示)。它包含1个Data控件、1个DBGrid控件(DataSource属性设置为Data1,AllowUpdate设置为False)、1个Label控件以及1个Command控件。图7-7 数据查询窗体StatFrm为统计结果显示窗体(如图7-8所示)。它包含1个Data控件、1个DBGrid控件(DataSource属性设置为Data1,AllowUpdate设置为False)、1个Label控件以及1个Command控件。(2)程序代码模块文件Module1.bas的程序代码:Public item As Integer 定义公共变量item,表示菜单项编号主窗体MainFrm.frm的程序代码:Private Sub TD_Click() 单击教师信息菜单后,调用教师信息编辑窗体 TFrm.Show 1End SubPrivate Sub SD_Click() 单击学生信息菜单后,调用学生信息编辑窗体 SFrm.Show 1End Sub图7-8显示统计结果的窗体Private Sub CD_Click() 单击课程信息菜单后,调用课程信息编辑窗体 CFrm.Show 1End SubPrivate Sub SCD_Click() 单击选课信息菜单后,调用选课信息编辑窗体 SCFrm.Show 1End SubPrivate Sub TCD_Click() 单击任课信息菜单后,调用任课信息编辑窗体 TCFrm.Show 1End SubPrivate Sub GD_Click() 单击成绩输改菜单后,调用成绩输改窗体 GradeFrm.Show 1 End SubPrivate Sub Tno_T_Click() 单击按教师号查询菜单后,调用数据查询窗体 item = 211 : QueryFrm.Show 1End Sub单击其它各查询菜单后,除全局变量item的赋值不同外,均调用数据查询窗体,故其它各查询菜单的Click事件过程均略。Private Sub Stat_TN_Click() 单击统计任课教师人数菜单后,调用数据统计窗体 item = 31 : StatFrm.Show 1End SubPrivate Sub Stat_SN_Click() 单击统计某门课选课人数菜单后,调用数据统计窗体 item = 32 : StatFrm.Show 1 End SubPrivate Sub Stat_G_Click() 单击统计某位学生总选课学分菜单后,调用数据统计窗体 item = 33 : StatFrm.Show 1End SubPrivate Sub Quit_Click() 单击退出系统菜单后,程序结束 EndEnd Sub教师信息编辑窗体TFrm.frm的程序代码:Dim r_loc As Long, ma As String 定义窗体级变量,其中r_loc存放当前记录号,ma存放字符“a”或“m”,分别表示“增加”记录或“修改”记录Sub PrtRec() 通用过程,通过控件显示记录 TxtNo.Text = Data1.Recordset.Fields(教师号) : TxtName.Text = Data1.Recordset.Fields(姓名) TxtAge.Text = Data1.Recordset.Fields(年龄) : TxtTel.Text = Data1.Recordset.Fields(电话) CmbSex.Text = Data1.Recordset.Fields(性别) : CmbTitle.Text = Data1.Recordset.Fields(职称)End SubSub fed() 通用过程,单击“确定”或“取消”按钮后调用该过程 DBGrid1.Enabled = True : Cmd_Ok.Visible = False : Cmd_Cel.Visible = False Cmd_Add.Visible = True : Cmd_Close.Visible = True If r_loc = 0 Then 表中有记录 Data1.Recordset.MoveFirst : Data1.Recordset.Move r_loc 移动记录指针 PrtRec 调用通用过程,在各文本框中显示当前记录 Cmd_Del.Visible = True : Cmd_Modi.Visible = True Else 表中无记录,如输入第一条记录 TxtNo.Text = : TxtName.Text = : TxtAge.Text = : TxtTel.Text = CmbSex.Text = 男 : CmbTitle.Text = Cmd_Del.Visible = False : Cmd_Modi.Visible = False End If 置各控件为不可修改状态TxtNo.Enabled = False : TxtName.Enabled = False : TxtAge.Enabled = False TxtTel.Enabled = False : CmbSex.Enabled = False : CmbTitle.Enabled = FalseEnd SubSub ted() 通用过程,单击“增加”或“修改”按钮后除DBGrid外,其它各控件置为可修改状态 DBGrid1.Enabled = False : Cmd_Ok.Visible = True : Cmd_Cel.Visible = True TxtNo.Enabled = True : TxtName.Enabled = True : TxtAge.Enabled = True TxtTel.Enabled = True : CmbSex.Enabled = True : CmbTitle.Enabled = TrueEnd SubPrivate Sub Form_Load() 装入窗体 Data1.DatabaseName = App.Path & student.mdb : Data1.RecordsetType = 1 记录类型为Dynaset Data1.RecordSource = 教师 记录源为教师表 Data2.DatabaseName = App.Path & student.mdb : Data2.RecordsetType = 1 Data2.RecordSource = 任课 Data1.Refresh r_loc = Data1.Recordset.AbsolutePosition 第一条记录号(从0开始),若表中无记录,则其值为-1 fed 调用通用过程,若表中有记录,则在各文本框中显示第一条记录End SubPrivate Sub Cmd_Add_Click() 添加 ma = a : r_loc = Data1.Recordset.AbsolutePosition 当前记录号 ted 调用通用过程 TxtNo.Text = : TxtName.Text = : TxtAge.Text = : TxtTel.Text = CmbSex.Text = 男 : CmbTitle.Text = 增加、修改、删除、关闭窗口按钮不显示,显示确定与取消按钮Cmd_Ok.Visible = True : Cmd_Cel.Visible = True : Cmd_Add.Visible = FalseCmd_Del.Visible = False : Cmd_Modi.Visible = False : Cmd_Close.Visible = FalseEnd SubPrivate Sub Cmd_Cel_Click() 取消 r_loc = Data1.Recordset.AbsolutePosition 当前记录号 fed 调用通用过程,使各编辑控件为可修改状态End SubPrivate Sub Cmd_Ok_Click() 确定 Dim tno As String, lexp As String, age As Byte tno = Trim(TxtNo.Text) : age = Val(TxtAge.Text) If r_loc = 0 Then 表中有记录 lexp = 教师号= & & tno & Data1.Recordset.FindFirst lexp 查找教师号If Not Data1.Recordset.NoMatch Then 判断表中是否已存在相同教师号 If ma = a Or ma = m And r_loc Data1.Recordset.AbsolutePosition Then x1 = MsgBox(该教师号已存在!, vbOKOnly + vbExclamation, 警告) TxtNo.SetFocus : Exit Sub End If End If End If If tno = Then x = MsgBox(教师号不允许为空!, vbOKOnly + vbExclamation, 警告) TxtNo.SetFocus : Exit Sub End If If age 100 Then x = MsgBox(年龄必须在18与100岁之间!, vbOKOnly + vbExclamation, 警告) TxtAge.SetFocus : Exit Sub End If If ma = a Then 增加记录 Data1.Recordset.AddNew Else 修改记录 Data1.Recordset.MoveFirst : Data1.Recordset.Move r_loc : Data1.Recordset.Edit End If Data1.Recordset.Fields(教师号) = tno : Data1.Recordset.Fields(姓名) = TxtName.Text Data1.Recordset.Fields(年龄) = age : Data1.Recordset.Fields(电话) = TxtTel.Text Data1.Recordset.Fields(性别) = CmbSex.Text : Data1.Recordset.Fields(职称) = CmbTitle.Text DBGrid1.Enabled = True : Data1.Recordset.Update : Data1.Refresh If ma = a Then 增加记录 Data1.Recordset.MoveLast : r_loc = Data1.Recordset.AbsolutePosition End If fedEnd SubPrivate Sub Cmd_Del_Click() 删除 Dim yn As Integer, tno As String, lexp As String tno = Trim(TxtNo.Text) : Data3.Refresh If Data3.Recordset.AbsolutePosition = 0 Then lexp = 教师号= & & tno & Data3.Recordset.FindFirst lexp If Not Data3.Recordset.NoMatch Then x = MsgBox(该教师已有任课记录,请先删除任课记录!, vbOKOnly + vbExclamation, 警告) Exit Sub End If End If yn = MsgBox(真的要删除此记录吗?, vbYesNo + vbExclamation, 确认) If yn = vbYes Then Data1.Recordset.Delete : Data1.Recordset.MoveNext r_loc = Data1.Recordset.AbsolutePosition If Data1.Recordset.EOF() And Data1.Recordset.RecordCount 0 Then Data1.Recordset.MoveLast : r_loc = Data1.Recordset.AbsolutePosition End If End If fedEnd SubPrivate Sub Cmd_Modi_Click() 修改 ma = m : r_loc = Data1.Recordset.AbsolutePosition ted Cmd_Ok.Visible = True : Cmd_Cel.Visible = True : Cmd_Add.Visible = False Cmd_Del.Visible = False : Cmd_Modi.Visible = False : Cmd_Close.Visible = FalseEnd SubPrivate Sub Cmd_Close_Click() 关闭窗口 Unload MeEnd SubPrivate Sub DBGrid1_RowColChange(LastRow As Variant, ByVal LastCol As Integer) 行列变化 If r_loc = 0 Then 如果表中存在记录 PrtRec 调用通用过程,显示网格中当前行的记录 End IfEnd Sub学生、课程、选课、任课信息编辑窗体的各程序代码与教师信息编辑窗体的程序代码类试,留给读者作为练习。成绩输改窗体GradeFrm.frm的程序代码:Private Sub Form_Load() 装入窗体 Data2.DatabaseName = App.Path & student.mdb : Data2.RecordsetType = 1 Data2.RecordSource = 学生 : Data2.Refresh Data3.DatabaseName = App.Path & student.mdb : Data3.RecordsetType = 1 Data3.RecordSource = 课程 : Data3.Refresh If Data3.Recordset.AbsolutePosition = 0 Then Data3.Recordset.MoveFirst Do While Not Data3.Recordset.EOF 将所有课程名添加到下拉式列表框中 Combo1.AddItem Data3.Recordset.Fields(课程名) Data3.Recordset.MoveNext Loop Data3.Recordset.MoveFirst End IfEnd SubPrivate Sub Combo1_Click() 单击下拉式列表框中某一项,查找出所有选该课的学生学号、姓名 Dim Cno As String, IndexNo As Integer IndexNo = Combo1.ListIndex 取下拉式列表框中选中项的序号 If IndexNo = 0 Then Data3.Recordset.MoveFirst : Data3.Recordset.Move IndexNo 移动记录指针 Cno = Data3.Recordset.Fields(课程号) lexp = select 学号,成绩 from 选课 where 课程号= & & Cno & Data1.DatabaseName = App.Path & student.mdb : Data1.RecordsetType = 1 Data1.RecordSource = lexp 记录源为select语句查找的结果 Data1.Refresh : DBGrid1.Refresh End IfEnd SubPrivate Sub DBGrid1_RowColChange(LastRow As Variant, ByVal LastCol As Integer) 行列变化 Dim Sno As String If Data1.Recordset.AbsolutePosition = 0 Then Sno = Data1.Recordset.Fields(学号) Data2.Recordset.FindFirst 学号= & & Sno & Label3.Caption = Data2.Recordset.Fields(姓名) End IfEnd SubPrivate Sub Cmd_Close_Click() 关闭窗口 Unload MeEnd Sub数据查询窗体QueryFrm.frm的程序代码:Private Sub Form_Load() 装入窗体 Dim InTxt As String, lexp As String InTxt = Select Case item Case 211 按教师号查找教师信息 InTxt = InputBox(请输入欲查找的教师号, 输入) lexp = select * from 教师 where 教师号= & & InTxt & Label1.Caption = 教师号为 + InTxt + 的基本信息 Case 212和213 分别为按教师名和职称查找教师信息; Case 221、222、223分别为按学号、姓名、班级查找学生信息;Case231和232 分别为按课程号和课程名查找课程信息,除字段名、表名不同外,其余与Case 211相同,留给读者完成。 Case 241 按学号多表连接查询学生选课信息 InTxt = InputBox(请输入欲查找的学号, 输入) lexp = select 学生.学号,姓名,课程名,课程类型,课时 from 学生,选课,课程 where lexp=lexp+学生.学号=选课.学号 and 课程.课程号=选课.课程号 and 学生.学号=& & InTxt& Label1.Caption = 学号为 + InTxt + 的选课信息 Case 242、243、244、245分别为按学生姓名、课程号、课程名、班级查询学生选课信息,与Case 241中的语句基本相同,留给读者完成。 Case 251 按教师号多表连接查询教师任课信息 InTxt = InputBox(请输入欲查找的教师号, 输入) lexp = select 姓名,任课.课程号,课程名,课程类型,课时 from 教师,任课,课程 where lexp=lexp+教师.教师号=任课.教师号 and 任课.课程号=课程.课程号 and 教师.教师号= & & InTxt & Label1.Caption = 教师号为 + InTxt + 的任课信息 Case 252、253、254分别为按教师姓名、课程号、课程名查询教师任课信息,与Case 251中的语句基本相同,留给读者完成。 Case 261 按学号多表连接查询学生成绩 InTxt = InputBox(请输入欲查找的学号, 输入) lexp = select 姓名,选课.课程号,课程名,成绩 from 学生,选课,课程 where lexp=lexp+学生.学号=选课.学号 and 课程.课程号=选课.课程号 and 学生.学号=& InTxt & Label1.Caption = 学号为 + InTxt + 的同学所选各门课的成绩单 Case 262、263、264、265分别为按学生姓名、课程号、课程名、班级查询学生成绩,与Case 261中的语句基本相同,留给读者完成。 End Select Data1.DatabaseName = App.Path & student.mdb : Data1.RecordsetType = 1 Data1.RecordSource = lexp : Data1.Refresh : DBGrid1.RefreshEnd SubPrivate Sub Cmd_Close_Click() 关闭窗口 Unload MeEnd Sub数据统计窗体StatFrm.frm的程序代码:Private Sub Form_Load() 装入窗体 Dim InTxt As String, lexp As String Select Case item Case 31 统计任课教师人数 lexp=select count (教师号) as 任课人数 from 教师 where 教师号 in (select 教师号 from 任课) Label1.Caption = 任课教师统计 Case 32 统计某们课程的选课人数 InTxt = InputBox(请输入欲统计的课程号, 输入) lexp = select count (选课.学号) as 选课人数 from 选课,课程 where 选课.课程号=课程.课程号 and 选课.课程号= & & InTxt & Label1.Caption = 选 + InTxt + 号课的人数统计 Case 33 统计某位同学选课的总学分数 InTxt = InputBox(请输入欲统计的学号, 输入) lexp = select sum(学分) as 总学分数 from 选课,课程,学生 where 选课.课程号=课程.课程号 and 选课.学号=学生.学号 and 选课.学号= & & InTxt & Label1.Caption = 学号为 + InTxt + 同学所选课程的学分统计 End Select Data1.DatabaseName = App.Path & student.mdb : Data1.RecordsetType = 1 Data1.RecordSource = lexp : Data1.Refresh : DBGrid1.RefreshEnd SubPrivate Sub Cmd_Close_Click() 关闭窗口 Unload MeEnd Sub3运行应用程序程序运行后的界面见图7-37-8所示。首先要输入教师、学生与课程的基本信息,然后才能输入教师任课与学生选课信息,最后输入学生成绩。删除数据的顺序相反。比如要删除某位学生的基本信息,必须先删除该学生的所有选课信息。如果先删除学生的基本信息,那么在选课表中如果该学生有选课信息,则选课表中的学号在学生表中找不到相对应的数据,导致出现两个表中的数据不一致现象。这种现象在大型数据库中(如SQL数据库)可以通过数据库提供的安全控制功能加以解决。第二节 图书借阅管理系统 图书馆作为一种信息资源的集散地,需要管理大量的图书资料和用户数据,如果用手工处理这些数据,不但工作量大,出错率高,出错后不易修改,而且会造成图书借阅管理工作的混乱。基于这些问题,有必要建立一个图书管理系统,使图书管理工作规范化,系统化,程序化,避免图书管理的随意性,提高信息处理的速度和准确性,能够及时、准确、有效的查询和修改图书以及图书借阅情况,也是数据库领域理论与实践发展的重要演练基础,有利对数据库领域理论与实践的领会与理解一、需求分析图书管理工作包含很多内容,为简单起见,这里只涉及对图书借阅部分的管理工作,而且以学校图书馆的图书借阅管理工作为例。具体包括以下主要内容: 图书信息的编辑(包括图书信息的增加、修改、删除与查询)。 读者信息的编辑(包括读者信息的增加、修改、删除与查询)。 借书信息的输入。 还书信息的输入。 图书借阅情况的查询。 权限管理(例如管理员具有所有权限,而读者仅具有查看本人借阅信息的权限)。二、数据库概念结构设计由需求分析可以得出,该图书借阅管理系统涉及到以下两个实体: 图书:用于描述一本图书的基本情况,其属性包括:书号、书名、作者、出版社、出版日期、所属类别、单价、状态(在馆/借出),其中书号为码。 读者:用于描述一个读者的基本情况,其属性包括:借书证号、姓名、单位、可借图书、已借图书,其中借书证号为码。根据语义分析知:一个读者可以借阅多本书,一本书可以有多个人借阅。借阅信息包括:借书日期、还书日期。根据以上分析,可设计出该图书借阅管理系统所对应的E-R图,如图7-9所示。图书n书号书名单价出版社作者可借图书班级所属类别读者借阅借书时间还书时间m借书证号姓名出版日期已借图书状态密码图7-9 图书借阅管理系统E-R图三、数据库逻辑结构设计1关系模式的设计根据第三章介绍的将E-R图转换成等价的关系模式的方法,图7-9所示的E-R图可以转换成以下3个关系模式: 图书(书号,书名,作者,出版社,出版日期,所属类别,单价,状态)。 读者(借书证号,姓名,班级,可借图书,已借图书,密码)。 借阅(借书证号,书号,借书时间,还书时间),其中借书证号为引用读者关系的外键,书号为引用图书关系的外键。2关系模式的优化根据第三章介绍的关系规范化理论,上述各关系模式中,由于每个非主属性都不传递依赖于主键,因此,他们均满足第三范式。四、数据库的建立本例使用SQL Server 2000建立SQL Server数据库。根据第四章介绍的方法,利用企业管理器首先建立本示例的数据库(名为db_library),然后根据表7-67-8给出的表结构建立该数据库所属的3个基本表(对应上述3个关系模式)。表7-6 Book表结构 表7-7 Reader表结构 列名说明数据类型约束列名说明数据类型约束Bno书号char,长度20主键Rno借书证号char,长度10主键Bname书名varchar,长度40Rname读者姓名char,长度10Bauthor作者char,长度10Rclass班级char,长度10Bpub出版社varchar,长度30ABQ可借图书smallint默认值 6Bdate出版日期varchar,长度10LBQ已借图书smallint默认值 0Bprice价格decimal,长度5.2Password密码char,长度8默认值 6666Bclass类别char,长度10Bstate状态char,长度4默认值“在馆”表7-8 LBook表结构列名说明数据类型约束列名说明数据类型约束Rno借书证号char,长度10主键LTime借书时间char,长度30Bno书号char,长度20主键RTime还书时间char,长度30默认值“未还”建立完上述3个表的表结构之后,在Reader表中输入一条记录( sa, 管理员,图书馆,0,0,system),以便系统首次运行时顺利登录。五、数据库系统应用程序设计1系统功能设计根据系统需求分析,本系统分成两大部分,一部分是面向读者的图书信息服务子系统,包括借还书服务和图书相关信息的查询。另一部分是面向管理员的图书管理和维护子系统,包括对图书信息的维护(登记、修改、删除)管理和对读者信息的管理。系统功能结构图如图7-10所示。图书借阅管理系统图书管理和维护子系统图书信息服务子系统图书删除用户信息管理新书入库修改图书图书信息查询借书服务还书服务图7-10 图书借阅管理系统功能结构图2应用程序设计本示例通过VB提供的ActiveX数据对象(ADO)控件与ODBC关联来操作数据库。因此,首先要利用第五章介绍的建立ODBC数据源的方法,建立本示例所需要的ODBC数据源(数据源名为Bodbc,所连接的数据库为db_library),然后设计应用程序。(1)设计用户界面。本示例共设计6个窗体。LoginFrm为登录窗口(如图7-11所示)。在该窗体上包含3个标签、两个单选钮、2个图7-11 登录窗口文本框(其中用来输入密码的文本框的Password属性设置为“*”)、2个命令按钮以及1个ADO控件(Visible属性设置为False,以下所有ADO控件的Visible属性均设置为False,不再重复说明)。MainFrm为主窗体,它包含一个标签、两个图像框及8个命令按钮控件(图7-12为管理员登录后的主窗体)。图7-12主窗体BookFrm为图书基本信息编辑窗体(如图7-13所示)。它包含2个ADO(其中Adodc1的ConnectionString属性设置为DSN=Bodbc,RecordSource属性设置为Book)、1个DataGrid(DataSource属性设置为Adodc1,AllowUpdate设置为False)、1个框架、10个标签、8个文本框、1个组合框(List属性设置为各班级名称)、6个命令按钮(它们的属性设置及其使用方法与示例1中的教师信息编辑窗体中的命令按钮控件完全相同)以及3个微调(UpDown)控件。其中UpDown控件用来增减数字的大小,它是一个Act

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论