当前位置:文档之家› 学籍管理系统-数据库课程设计

学籍管理系统-数据库课程设计

课程设计报告科目:设计题目:学生学籍管理系统专业:计算机系软件工程0402班姓名:XXXXX 学号:XXXXXXX目录绪论 (2)数据库设计 (2)1.需求分析 (2)1.1数据需求 (2)1.2功能需求 (3)2.数据库设计 (3)2.1概念结构设计 (4)2.2逻辑结构设计 (5)2.3物理结构设计 (6)3.系统功能设计 (8)4.系统功能实现 (9)4.1程序的运行环境 (9)4.2系统的开发环境 (9)4.3数据库的创建和链接 (9)4.4运行界面及其对应的源代码 (10)5.实验总结 (23)6.参考文献 (23)绪论学生学籍管理是教育教学单位不可缺少的部分,它的内容对教学管理和学校的决策者都非常重要。

给学校教学管理提供了很大的方便性,提高了工作效率。

但是一直以来人们用传统人工的方式管理文件文档,这种管理方式效率低,保密性差,出错不易更改,同时也耗费了大量的人力财力,时间一长,将产生大量的文件数据,这对于查找,维护,更新都带来了很大的困难。

随着科学技术的不断发展,尤其是计算机软件水平的日益提高,使得以上问题得到了很好的解决。

使用计算机可以方便的对大量数据进行增加,删除,更新等操作。

它有着人工管理永远无法比拟的优点:检索迅速,查找方便,可靠性大,存储量大,保密性好,寿命长,成本低等。

例如:通过校园网,我们可以方便的进行学生信息查询,学生成绩的添加,以及最新的教务通知等。

当然,这些都离不开数据库技术和网络技术的支持。

数据库是数据管理的最新技术,是计算机计算机技术的重要分支,也是计算机领域发展最快的学科之一。

学生学籍管理系统就是数据库在网络上应用。

综上,开发这样的一套软件十分必要。

同时旧的人工管理机制必将被以计算机为基础的信息管理所取代,从而实现对数据的高效,长久,安全的管理。

数据库设计一.需求分析1.数据需求:(1)数据字典主要涉及到以下几个表,分别为:学生基本信息表,课程表,专业信息表,课程设置表,学生选课表,学生与专业之间的属于表以及管理人员的密码表。

以下是数据字典:专业信息表课程设置表学生与专业的属于表管理人员密码表(2)数据流图第一层第二层第三层第四层统计成绩第五层学生信息2.功能需求:(1)实现学生基本情况的录入,修改,删除等基本操作。

(2)对学生基本信息提供灵活的查询方式。

(3)完成一个班级的学期选课功能。

(4)实现学生成绩的录入,修改,删除等基本操作。

(5)能方便的对学生的个人学期成绩进行查询。

(6)具有成绩统计,排名等功能。

(7)具有留级,休学等特殊情况的处理功能。

(8)能输出常用的各种报表。

(9)具有数据备份和数据恢复功能。

二.数据库设计 1.概念结构设计 局部ER 图整体的ER 图2. 逻辑结构设计(1)ER图转换为关系模型由ER图可见:图中有三个实体:学生,课程,和专业;三个关系:学生选课关系,学生与专业之间的属于关系,专业的课程设置。

由于每个实体必须构造表,所以可以先得到三个实体的信息表,实体的码就是关系的码,实体的属性即关系模型的属性:学生基本信息表:S (sno, sname, ssex, sbirth, spasw)课程基本信息表:C (cno, cname, cperiord)专业基本信息表:P (pno, pname, pnum, psdept)对应的属性分别为:学号,姓名,性别,出生日期,登陆密码课程编号,课程名,学期专业编号,专业名,专业人数,所在院系对于多对多的关系来说,与该联系相连的实体的码以及本身的属性均转换为关系的属性,各实体之间的码组成关系的码或者关系的码的一部分。

以上ER图的三个联系为多对多,所以转换为关系模式为:课程设置表:pc ( pno, psenior, cno)与设置相连的实体有专业和课程,根据多对多的转换原则:专业的码pno,课程的码cno以及设置本身的属性共同构成该关系模式的码,所以该关系模式的码为全码。

学生选课表:SC (sno, psenior, cno, grade)与选课相连的实体有学生和课程,同上由学生的码sno,课程的码cno以及选课本身的码psenior构成该关系模式的码,即(sno,cno,psenior)。

此外,选课表还有一个非主属性grade。

学生与专业的属于表:SP(sno,pno)与属于关系相联的实体是学生和专业。

同上由学生的码sno,专业的码pno构成该关系模式的码,由于此关系没有其他的码也就没有非主属性。

(2)关系模式的优化:学生表s (sno,sname,ssex,sbirth,spasw)该关系模式的码为sno,由于只有一个码,所以不存在非主属性对码的部分函数依赖,可以达到2NCF。

另外,该关系模式的函数依赖为: sno -> sname, sno -> ssex, sno -> ssex,sno -> sbirth, sno -> spasw,其间不存在传递依赖,故学生表可达到3NCF.课程表C ( cno ,cname , cperiod)该关系模式的码为cno, cname,设主码为cno,因为该关系模式中的码都是单一的,即不存在有两个或者两个以上的属性组成的码,所以不存在非主属性对码的部分函数依赖,可以达到2NCF。

另外,该关系模式的函数依赖为:cno->cname, cno->cperiod, cname->cno ,cname -> cperiod. 因为cno -> cname,cname -> cperiod cno -> cperiod, 所以该关系模式中存在传递依赖,不能达到3NCF。

故优化该表为:C1(cno,period),C2(cname,cperiod).从而两表都达到了3NCF。

专业表P (pno,pname,pnum,pdept)该关系模式的码为pno,pname,其中设定pno为主码。

同课程表,该表不存在有两个或者两个以上属性组成的码,即不存在非主属性对码的部分函数依赖,故可达到2NCF。

另外,此关系模式的函数依赖为:pno->pname, pno-> pnum, pno -> pdept , pname -> pno, pname->pnum, pname -> pdept; 由于存在传递依赖:pno -> pnum., 所以未能达到3NCF。

优化分解为:P1 (pno,pnum,pdept), P2 (pname,pnum,pdept)明显,两表都达到了3NCF.课程设置表PC(pno,psenior,cno),该关系模式的码为:(pno,psenior,cno)为全码,所以可直接达到3NCF学生选课表SC(sno,psenior,cno,grade)该关系模式的码为:(sno,psenior,cno),因为不存在非主性grade对码的部分函数依赖,所以可达到2NCF,由于不存在函数依赖(表中的函数依赖只有(sno,psenior,cno)-> grade)故也达到了3NCF属于表SP(sno,pno)该关系模式的码(sno,pno)也是全码,所以也达到了3NCF用户表U(uname,upasw)该表的码为uname,明显upasw对码uname是完全函数依赖的,从而达到2NCF。

另外因为只有两个属性,所以不存在传递函数依赖,该表达到了3NCF3.物理结构设计(1)基本表学生表s课程表c1课程表c2专业表p1专业表p2管理人员密码表u(2)视图,索引a.索引:本数据库中的表除了主键本身生成的主索引外,没有定义其他的索引。

在查询时即引用主索引即可。

表s 的主索引列为:sno 表c1的主索引列为:cno 表c2的主索引列为:cname 表p1的主索引列为:pno 表p2的主索引列为:pname表sc 的主索引列为:(pno,psenior,cno) 表sp 的主索引列为:(sno,pno) 表u 的主索引列为:unameb .视图:虽然关系数据模型分析的结果表示该数据库需要定义不同的用户视图,但考虑到数据库与前台开发程序的连接比较复杂,所以该数据库中没有单独定义用户视图,不同的用户视图被有选择性的的select 语句的结果集取. 三.系统功能设计四.系统实现3.数据库的创建和链接本系统的前台开发工具为Microsoft visual basic 6.0 ,除了一些常用的控件Commandbutton,Combobox,Textbox和Label外,这里还使用了控件ADO和DataGrid。

ADO 用来链接数据库与前台开发程序,指定链接的数据源和要访问的数据,并通过绑定要使用的数据来显示所获得的数据。

DataGrid控件的作用是以表格的形式显示结果中的全部数据,但允许在表格中增加,删除和修改纪录。

具体的链接过程如下:ADO(步骤)(1)选择“工程”菜单中的部件命令,打开部件对话框,在控件选项中选择Microsoft ADO Data Control 6.0(OLEDB)复选框,单击确定,工具栏中会出现ADO数据控件的图标,其微帮助名称为:Adodc。

(2)在当前窗体上添加一个ADO控件。

(3)打开ADO的属性页,设置使用的ODBC数据资源的名称,(如果没有则新建一个)即我所使用的数据库wangjiaDSN;设置身份验证,包括用户名称和密码;设置纪录源,命令类型选择adCmdTable.(因为我所用到的记录源都是表,所以设置为该属性。

adCmdTable.表示的是数据源的属性是一个表名,表示其结果级是对该表执行无条件查询后得到的结果),表名或存储过程名则选择自己所要用到的表。

到此,便链接成功。

DataGrid(步骤)(1)同ADO控件一样,选择选择“工程”菜单中的部件命令,打开部件对话框,在控件选项中选择Microsoft DataGrid Control 6.0(OLEDB)复选框,单击确定,工具栏中会出现DataGrid数据控件的图标。

(2)在当前窗体上添加一个DataGrid控件。

(3)打开DataGrid的属性页,设置标题名,列,列标题与其对应的数据段。

颜色,字体等可根据需要设定。

将DataGrid的Recordsource设置为该窗体对应的Adodc;另外可检索字段和删除字段,这样可以显示自己想要的字段,而不是将adodc所对应的内容全部显示出来。

到此,链接成功。

4.窗体及其所对应的源代码欢迎界面登陆界面源代码Option ExplicitDim stuflag As Boolean '标记用户是否为学生Public LoginSucceeded As BooleanPrivate Sub cmdCancel_Click()'设置全局变量为false'不提示失败的登录LoginSucceeded = FalseMe.HideEnd SubPrivate Sub cmdOK_Click()'检查正确的密码Dim num1 As IntegerDim num2 As IntegerIf Len(txtUserName.Text) > 0 And Len(txtPassword) > 0 And stuflag = False Then '管理人员Adodc1.Item(0).CommandType = adCmdTextAdodc1.Item(0).RecordSource = "select * from wjuser where uname='" & Trim(txtUserName.Text) & "'And upasw='" & Trim(txtPassword.Text) & "'"Adodc1.Item(0).Refreshnum1 = Adodc1.Item(0).Recordset.RecordCountElse '学生Adodc1.Item(1).CommandType = adCmdTextAdodc1.Item(1).RecordSource = "select sname spasw from wjstudent where sname= '" & Trim(txtUserName.Text) & "'And spasw='" & Trim(txtPassword.Text) & "'"Adodc1.Item(1).Refreshnum2 = Adodc1.Item(1).Recordset.RecordCountEnd IfIf num1 <= 0 And num2 <= 0 ThenMsgBox "无效的密码,请重试!", , "登录"txtPassword.SetFocusSendKeys "{Home}+{End}"ElseLoginSucceeded = TrueMe.HideMDIForm1.ShowEnd IfEnd SubPrivate Sub Option1_Click(Index As Integer)If Index = 0 ThenIf stuflag = False Thenstuflag = TrueEnd IfElseIf stuflag = True Thenstuflag = FalseEnd IfEnd IfEnd Sub主界面添加用户界面源代码Private Sub Command1_Click() '添加用户Adodc1.Recordset.AddNewEnd SubPrivate Sub Command2_Click() '更新Adodc1.Recordset.Fields("uname") = Trim(Text1.Text) Adodc1.Recordset.Fields("upasw") = Trim(Text2.Text) Adodc1.Recordset.UpdateMsgBox "添加成功!", , "提示"End Sub用户密码修改界面源代码Private Sub Command1_Click()Command2.Enabled = False '使取消按钮不可用If Len(Text4.Text) <> 0 Then '查看输入用户是否存在mandType = adCmdTextAdodc1.RecordSource = "select * from wjuser where uname='" & Trim(Text1.Text) & "'"Adodc1.RefreshIf Adodc1.Recordset.RecordCount <= 0 ThenMsgBox "没有该用户!,请重新输入", , "提示"ElseIf Len(Text1.Text) <> 0 Then '查看旧密码是否正确mandType = adCmdTextAdodc1.RecordSource = "select * from wjuser where upasw='" & Trim(Text4.Text) & "'"Adodc1.RefreshIf Adodc1.Recordset.RecordCount <= 0 ThenMsgBox "密码不正确,请重新输入!", , "提示"ElseIf Len(Text2.Text) <> 0 Then '确认密码并修改If Len(Text3.Text) <> 0 ThenIf Text2.Text <> Text3.Text ThenMsgBox "您的输入不一致,请重新确认!", , "提示"ElseAdodc1.Recordset.Fields("upasw") = Trim(Text3.Text)Adodc1.Recordset.UpdateMsgBox "修改成功", , "提示"End IfEnd IfEnd IfEnd IfEnd IfEnd IfEnd IfEnd SubPrivate Sub Command2_Click() '取消Command1.Enabled = False '使修改按钮不可用Adodc1.Recordset.CancelUpdateEnd SubPrivate Sub Command3_Click()Unload MeEnd Sub学生密码修改界面源代码Private Sub Command1_Click() '修改Command2.Enabled = False '使取消按钮不可用If Len(Text4.Text) <> 0 Then '查看输入学号是否存在mandType = adCmdTextAdodc1.RecordSource = "select * from wjstudent where sno='" & Trim(Text4.Text) & "'"Adodc1.RefreshIf Adodc1.Recordset.RecordCount <= 0 ThenMsgBox "没有该学号!,请重新输入", , "提示"ElseIf Len(Text1.Text) <> 0 Then '查看旧密码是否正确mandType = adCmdTextAdodc1.RecordSource = "select * from wjstudent where spasw='" &Trim(Text1.Text) & "'"Adodc1.RefreshIf Adodc1.Recordset.RecordCount <= 0 ThenMsgBox "密码不正确,请重新输入!", , "提示"ElseIf Len(Text2.Text) <> 0 Then '确认密码并修改If Len(Text3.Text) <> 0 ThenIf Text2.Text <> Text3.Text ThenMsgBox "您的输入不一致,请重新确认!", , "提示"ElseAdodc1.Recordset.Fields("spasw") = Trim(Text3.Text)Adodc1.Recordset.UpdateMsgBox "修改成功", , "提示"End IfEnd IfEnd IfEnd IfEnd IfEnd IfEnd IfEnd SubPrivate Sub Command2_Click() '取消Adodc1.Recordset.CancelUpdateCommand1.Enabled = False '使修改按钮不可用End SubPrivate Sub Command3_Click() '退出Unload MeEnd Sub个人信息维护界面源代码Private Sub Command1_Click() '第一条Adodc1.Recordset.MoveFirstEnd SubPrivate Sub Command2_Click() '上一条Adodc1.Recordset.MovePreviousIf Adodc1.Recordset.BOF = True Then '如果已经移到了第一行之前,则指针定位在第一行Adodc1.Recordset.MoveFirstEnd IfEnd SubPrivate Sub Command3_Click() '下一条Adodc1.Recordset.MoveNextIf Adodc1.Recordset.EOF = True Then '如果已经移到了最后一行之后,则指针定位在最后一行Adodc1.Recordset.MoveLastEnd IfEnd SubPrivate Sub Command4_Click() '末一条Adodc1.Recordset.MoveLastEnd SubPrivate Sub Command5_Click() '添加Adodc1.Recordset.AddNewCommand5.Enabled = FalseCommand6.Enabled = FalseCommand7.Enabled = TrueCommand8.Enabled = TrueEnd SubPrivate Sub Command6_Click() '删除Dim res As Integerres = MsgBox("要删除此记录吗?", vbExclamation + vbYesNo + vbDefaultButton2) '提示用户If res = vbYes ThenAdodc1.Recordset.DeleteAdodc1.Recordset.MoveNextIf Adodc1.Recordset.EOF = True ThenAdodc1.Recordset.MoveLastEnd IfEnd IfEnd SubPrivate Sub Command7_Click() '更新Adodc1.Recordset.Fields("sno") = Trim(Text1.Text)Adodc1.Recordset.Fields("sname") = Trim(Text2.Text)Adodc1.Recordset.Fields("ssex") = Trim(Text3.Text)Adodc1.Recordset.Fields("sbirth") = Trim(Text4.Text)Adodc1.Recordset.UpdateCommand5.Enabled = True '使添加和删除按钮可用Command6.Enabled = TrueCommand8.Enabled = False '使取消按钮不可用End SubPrivate Sub Command8_Click()Adodc1.Recordset.CancelUpdateCommand5.Enabled = True '使添加和删除按钮可用Command6.Enabled = TrueCommand8.Enabled = False '使取消按钮不可用End SubPrivate Sub Command9_Click() '退出Unload MeEnd SubPrivate Sub Form_Load() '载入界面Command8.Enabled = False '使取消按钮不可用End Sub成绩维护界面源代码Private Sub Command1_Click() '添加Adodc1.Recordset.AddNewCommand1.Enabled = False '使添加,修改,删除按钮不可用Command3.Enabled = FalseCommand6.Enabled = True '使添加退出可用Command4.Enabled = TrueEnd SubPrivate Sub Command2_Click()Adodc1.Recordset.MoveFirstEnd SubPrivate Sub Command3_Click() '删除Dim res As Integerres = MsgBox("要删除该纪录吗?", vbExclamation + vbYesNo + vbDefaultButton2) '提示用户If res = vbYes ThenAdodc1.Recordset.DeleteAdodc1.Recordset.MoveNextIf Adodc1.Recordset.EOF = True ThenAdodc1.Recordset.MoveLastEnd IfEnd IfEnd SubPrivate Sub Command4_Click() '退出Unload MeEnd SubPrivate Sub Command5_Click() '更新Adodc1.Recordset.Fields("sno") = Trim(Text1.Text) Adodc1.Recordset.Fields("cno") = Trim(Text2.Text) Adodc1.Recordset.Fields("grade") = Trim(Text3.Text) Adodc1.Recordset.UpdateCommand1.Enabled = True '使添加和删除按钮可用Command3.Enabled = TrueCommand6.Enabled = False '使取消按钮不可用End SubPrivate Sub Command6_Click() '取消Adodc1.Recordset.CancelUpdateCommand1.Enabled = TrueCommand3.Enabled = TrueEnd SubPrivate Sub Command7_Click()Adodc1.Recordset.MovePreviousIf Adodc1.Recordset.BOF = True ThenAdodc1.Recordset.MoveFirstEnd IfEnd SubPrivate Sub Command8_Click()Adodc1.Recordset.MoveNextIf Adodc1.Recordset.EOF = True ThenAdodc1.Recordset.MoveLastEnd IfEnd SubPrivate Sub Command9_Click()Adodc1.Recordset.MoveLastEnd Sub成绩统计源代码:Private Sub Command1_Click()If Len(Text1.Text) <> 0 ThenmandType = adCmdTextAdodc1.RecordSource = "select * from wjsc where sno='" & Trim(Text1.Text) & "'"Adodc1.RefreshIf Adodc1.Recordset.RecordCount <= 0 ThenMsgBox "该学号不存在!请重新输入", , "提示"Else '求平均分和最高分Adodc1.RecordSource = "select avg(grade) as [avggrade],Max(grade) as [high] from wjsc where sno='" & Trim(Text1.Text) & "'and psenior='" & Trim(Combo1.Text) & "'"Adodc1.RefreshLabel4.Caption = Adodc1.Recordset.Fields("avggrade")Label6.Caption = Adodc1.Recordset.Fields("high")Label4.Alignment = 2 '使文字居中Label6.Alignment = 2Adodc1.RecordSource = "select * from wjsc where sno='" & Trim(Text1.Text) & "'and psenior='" & Trim(Combo1.Text) & "' and grade <= 59 "Adodc1.RefreshIf Adodc1.Recordset.RecordCount <= 0 ThenMsgBox "该同学没有不及格的课程", , "提示"End IfEnd IfEnd IfEnd SubPrivate Sub Command2_Click()Unload MeEnd Sub信息查询源代码Dim nameflag As Boolean '标记是否按姓名查询Private Sub Command1_Click() '个人信息查询Dim searchSQL As StringmandType = adCmdTextIf nameflag = False ThensearchSQL = "select * from wjstudent where sno ='" & Trim(Text1.Text) & "'" '按学号查询ElsesearchSQL = "select *from wjstudent where sname ='" & Trim(Text1.Text) & "'" '按姓名查询End IfAdodc1.RecordSource = searchSQLAdodc1.RefreshIf Adodc1.Recordset.RecordCount <= 0 ThenMsgBox "不存在此纪录!请重新输入", , "警告"End IfEnd SubPrivate Sub Command2_Click() '退出查询信息窗体Unload MeEnd SubPrivate Sub Option1_Click(Index As Integer) '选择查询标准nameflag = FalseIf Index = 0 ThenIf nameflag = True Thennameflag = FalseEnd IfEnd IfIf Index = 1 ThenIf nameflag = False Thennameflag = TrueEnd IfEnd IfEnd Sub成绩查询源代码Private Sub Command1_Click()Dim str As StringmandType = adCmdTextAdodc1.RecordSource = "select * from wjsc where sno ='" & Trim(Text1.Text) & "'and psenior='" & Trim(Combo1.Text) & "'" '按学号查询Adodc1.RefreshIf Adodc1.Recordset.RecordCount <= 0 ThenMsgBox "不存在此纪录!请重新输入", , "警告"End IfEnd SubPrivate Sub Command2_Click()Unload MeEnd Sub关于界面六.设计总结通过这次的实验,我对数据库在生活中的广泛应用有了更深的体会,同时也加深了对SQL2000的认识,了解了相关的VB知识,尤其对数据库与开发程序的链接有了进一步的认识。

相关主题