数据库系统课程设计报告
题目 高校成绩管理数据库系统的设计与实现
提交日期 2021年7月
目录
1、需求分析
1.1 数据需求描述
1.2 系统功能需求
1.3 其他性能需求
2、概念结构设计
2.1 局部E-R图
2.2 全局E-R图
2.3 优化E-R图
3、逻辑结构设计
3.1 关系模式设计
3.2 数据类型定义
3.3 关系模式的优化
4、物理结构设计
4.1 聚簇设计
4.2 索引设计
4.3 分区设计
5、数据库实施
5.1 基本表建立
5.2 视图的建立
5.3 索引的建立
5.4 触发器建立
5.5 建存储过程
6、应用系统开发与试运行
6.1 开发平台和开发环境介绍。
6.2 前台界面与后台数据库连接说明,代码实现。
6.3 系统各功能设计和运行界面截图。
7、实验总结
7.1 遇到的问题和解决的办法
7.2 系统设计的不足
7.3 进一步改进思路和体会
高校成绩管理数据库系统的设计与实现
1、需求分析
高校成绩管理数据库系统是一个用于记录了高校学生成绩的系统,它的出现使得查询、更新、插入简单化,高效化,成本也随之大大减少。使用计算机对成绩信息的管理,具有手工管理所无法比拟的优点:信息存储及时,检索迅速、查找方便、可靠性高、存储量大、保密性好、寿命长、成本低等。这些优点能够极大地提高学生成绩管理的效率,也是高校成绩正规化管理的重要途径。根据实际工作需要,提出了以下数据和业务处理需求:
用户处理需求:
1、学校设置了各专业,在专业下开设班级,每个班级包含若干学生,学生信息至少需要包含学号、姓名、性别、年龄、生源所在地、已修学分总数等数据项;另外,需要有地区信息,用于统计某一地区的学生数;
2、课程信息表至少需包含课程编号、课程名称、任课教师、开课学期、学时、考试或考查、学分等数据项,课程根据班级开设。
3、教师信息至少需要包含教师编号、姓名、性别、年龄、职称、联系电话等数据项;
4、学生成绩至少需要学号,学期,课程名称,成绩,任课老师等数据项;
5、需要实现以下业务处理和查询功能
学生成绩按每学年成绩统计
学生成绩名次排定
每门课程平均成绩统计
学生所学课程及学分统计
对每个学生输入成绩的时候,自动生成学生的已修学分总数
学生成绩查询
教师任课查询
班级课程开设查询
补充说明:
-
- 假设学籍管理制度是采用学年制,且暂不考虑选修课情况。
- 同一专业可能有多个班,所以同一门课可能需要多个教师上课,一个教师在一学期可能上多门课程。
- 考试和考查课均采用百分制记分。
硬件环境:
处理器 Intel(R) Core(TM) i5-8265U CPU @ 1.60GHz 1.80 GHz
机带 RAM 8.00 GB (7.82 GB 可用)
系统类型 64 位操作系统, 基于 x64 的处理器
软件环境:
电脑系统:Windows 10
SQL版本:Microsoft SQL Server 2014
VS版本: Microsoft Visual Studio 2013
1.1 数据需求描述
该系统的顶层数据流图如图1所示,系统有三个身份:教师,管理员和学生。根据用户需求,设计数据流图。
图1 顶层数据流图
下图2为详细的数据流图,根据用户需求设计。
图2 详细数据流图
数据字典应具有下述特点:
1.通过名字能方便地查询数据的定义
2.没有数据冗余
3.容易更新和更改
4.定义的书写方式加单方便,而且严格
卡片形式书写数据字典是一种传统的方式,更新和修改方便,能够单独处理每个数据项的信息。
本实验的数据卡片如下:
图3 数据卡片设计
1.2 系统功能需求
系统分为管理员功能需求.教师功能需求和学生功能需求
1.2.1.管理员功能需求
(1).添加教师信息
(2).查询教师信息
(3).修改教师信息
(4).删除教师信息
(5).添加学生信息
(6).查询学生信息
(7).修改学生信息
(8).删除学生信息
(9).统计生源地信息
(10).修改密码
(11).注册新用户
(12).查询成绩信息
(13).添加课程信息
(14).查询课程信息
(15).修改课程信息
(16).删除课程信息
(17).查询专业信息
(18).查询班级信息
1.2.2.教师功能需求
(1).查看个人基本信息
(2).查看每门课程平均成绩统计
(3).查询教师课表
(4).查看个人任课情况
(5).查看学生成绩和排名情况
(6).修改密码
(7).查询授课学生信息
(8).录入学生成绩, 自动生成该学生已修总学分
1.2.3.学生功能需求
(1).查看个人信息
(2).查看个人的课表
(3).查询个人考试成绩
(4).查看不同班级的开课情况
(5).查看不同教师的任课情况
(6).查看已修各科学分和总学分
(7).修改密码
整个系统的功能图如图4。
图4系统功能图
1.3 其他性能需求
(1)用户输入出错时,违背了数据库的完整性约束或用户定义的约束时,有错误提示,且不予通过。
(2)安全性高,对应查询和修改权限受到严谨的限制。
(3)可以由多个用户同时登录修改查询等。
(4)存储数据量尽可能大。
2、概念结构设计
2.1 局部E-R图
学生实体对应的E-R图如图,可知属性有学号,姓名,性别,年龄,生源地,已修学分。
图5 学生E-R图
课程实体的E-R图如图6,可知属性有课程编号,课程名称,教师编号,开课学期,课程学时,考核方式,课程学分
图 6课程E-R图
教师实体的E-R图如图7,可知属性有教师编号,教师姓名,教师性别,教师年龄,教师职称,教师联系电话。
图7 教师E-R图
班级专业实体的E-R图如图8,可知班级实体属性有课程编号,班级名称。专业实体属性有专业编号和专业名称。
图8班级,专业实体E-R图
2.2 全局E-R图
下图合并成全局的E-R图。
实体间关系的分析:
教师和班级任教的关系为n:m,一个班级可以多个教师任教,一个教师也可以任教多个班级。
教师和课程的关系为n:m,一个教师可以任教多门课程,一门课程可以由多个教师任教。
专业和班级的关系为1:n,一个专业可以有多个班级,一个班级只能对应一个专业。
班级和课程的关系为n:m,一个班级可以开设多门课程,一个课程也可以在多个班级开设。
学生和班级的关系为1:n,一个学生只属于一个班级,二一个班级有多个学生。
学生和课程的关系为n:m,一个学生可以选多个课程,一个课程也可以被多个学生选择。
整体合并的E-R图如图9所示:
图 9整体E-R图
2.3 优化E-R图
以上的全局E-R已经最优,不需要再进行优化。
图10 优化后的E-R图
3、逻辑结构设计
3.1 关系模式设计
将E-R图转换为关系模式,定义实体型、属性及其联系,根据优化后的E-R设计关系模式,关系模式如下:
教师Xun_Teachers18( xn_Tno18教师编号 ,xn_Tname18教师姓名, xn_Tsex18教师性别, xn_Tage18教师年龄, xn_Tpos18 教师职称, xn_Ttell18联系电话)
专业Xun_Major18( xn_Mno18专业编号, xn_Mname18专业名称)
班级Xun_Class18( xn_CLno18 班级编号, xn_CLname18 班级名称, xn_Mno18专业编号)
学生Xun_Students18( xn_Sno18 学号, xn_Sname18姓名, xn_Ssex18 性别, xn_Sage18年龄, xn_Sregion18地区, xn_Scredit18已修学分, xn_CLno18班级编号)
课程Xun_Course18( xn_Cno18 课程编号, xn_Cname18课程名称, xn_Chour18课程学时, xn_Tname18 教师姓名, xn_Csemester18课程学期, xn_Cinspect18考核方式,xn_Ccredit18学分)
班级开设课程 Xun_CourseClass18( xn_Cno18课程编号, xn_CLno18班级编号)
教师授课班级Xun_TeachingClass18( xn_Tno18教师编号, xn_CLno18班级编号)
教师授课课程 Xun_TeachingCourse18( xn_Tno18教师编号, xn_Cno18课程编号)
成绩报告 Xun_Reports18( xn_Sno18学号,xn_Cno18课程编号,xn_Csemesters18学期,xn_Score18成绩, xn_Tno18教师编号)
学生账户密码表Xun_studentMima18(xn_Sno18, xn_Smima18 )
教师账户密码表Xun_teacherMima18(xn_Tno18, xn_Tmima18)
管理员账户密码表Xun_admMima18(xn_Ano18, xn_Amima18)
3.2 数据类型定义
表1教师Xun_Teachers18表
数据项名 |
数据类型 |
长度 |
完整性约束 |
xn_Tno18教师编号 |
char |
10 |
主键 |
xn_Tname18教师姓名 |
char |
10 |
|
xn_Tsex18 教师性别 |
char |
5 |
|
xn_Tage18 教师年龄 |
int |
|
|
xn_Tpos18职称 |
char |
10 |
|
xn_Ttell18联系电话 |
char |
20 |
表2专业Xun_Major18表
数据项名 |
数据类型 |
长度 |
完整性约束 |
xn_Mno18专业编号 |
char |
10 |
主键 |
xn_Mname18专业名称 |
char |
10 |
|
表3班级Xun_Class18表
数据项名 |
数据类型 |
长度 |
完整性约束 |
xn_CLno18班级编号 |
char |
10 |
主键 |
xn_CLname18班级名称 |
char |
10 |
|
xn_Mno18专业编号 |
char |
10 |
外键(Xun_Major18) |
表4学生表Xun_Students18表
数据项名 |
数据类型 |
长度 |
完整性约束 |
xn_Sno18学号 |
char |
12 |
主键 |
xn_Sname18姓名 |
char |
10 |
|
xn_Ssex18性别 |
char |
5 |
|
xn_Sage18年龄 |
int |
|
|
xn_Sregion18生源所在地 |
char |
20 |
|
xn_Scredit18已修学分 |
float |
|
|
xn_CLno18班级编号 |
char |
10 |
外键(Xun_Class18) |
表5课程Xun_Course18表
数据项名 |
数据类型 |
长度 |
完整性约束 |
xn_Cno18课程编号 |
char |
10 |
主键 |
xn_Cname18课程名称 |
char |
10 |
|
xn_Tname18教师姓名 |
char |
10 |
|
xn_Csemester18课程学期 |
char |
20 |
|
xn_Chour18课程学时 |
int |
|
>0 |
xn_Cinspect18考核方式 |
char |
5 |
|
xn_Ccredit18学分 |
float |
|
>0 |
表6开设 Xun_CourseClass18表
数据项名 |
数据类型 |
长度 |
完整性约束 |
|
xn_CLno18班级编号 |
char |
10 |
主键 |
外键(Xun_Class18) |
xn_Cno18课程编号 |
char |
10 |
外键(Xun_Course18) |
表7上课 Xun_TeachingClass18表
数据项名 |
数据类型 |
长度 |
完整性约束 |
|
xn_Tno18教师编号 |
char |
10 |
主键 |
外键(Xun_Teachers18) |
xn_CLno18班级编号 |
char |
10 |
外键(Xun_Class18) |
表8授课 Xun_TeachingCourse18表
数据项名 |
数据类型 |
长度 |
完整性约束 |
|
xn_Tno18教师编号 |
char |
10 |
主键 |
外键(Xun_Teachers18,) |
xn_Cno18课程编号 |
char |
10 |
外键(Xun_Course18) |
表9成绩报告表Xun_Reports18表
数据项名 |
数据类型 |
长度 |
完整性约束 |
|
xn_Sno18学号 |
char |
12 |
主键 |
外键(Xun_Students18) |
xn_Cno18课程编号 |
char |
10 |
外键(Xun_Course18) |
|
xn_Csemesters18学期 |
char |
10 |
|
|
xn_Score18成绩 |
int |
|
|
|
xn_Tno18教师编号 |
char |
10 |
|
(10)
表10学生账户密码表Xun_studentMima18
数据项名 |
数据类型 |
长度 |
完整性约束 |
xn_Sno18账号 |
char |
10 |
主键 |
xn_Smima18密码 |
char |
5 |
|
(11)
表11教师账户密码表Xun_teacherMima18
数据项名 |
数据类型 |
长度 |
完整性约束 |
xn_Tno18 账号 |
char |
10 |
主键 |
xn_Tmima18密码 |
char |
5 |
|
(12)
表12管理员账户密码表Xun_admMima18
数据项名 |
数据类型 |
长度 |
完整性约束 |
xn_Ano18 账号 |
char |
10 |
主键 |
xn_Amima18密码 |
char |
5 |
|
3.3 关系模式的优化
1.规范化处理:
所有关系模式均已做规范化处理,仅为函数依赖,已化为3NF和BCNF的标准。以上的关系模式已接近最优,满足该数据库的需求,不违背数据库的性能,又不存在过多的冗余信息。
2.模式的评价与修正:
已经满足用户的功能需求,连接运算已尽可能地减少,新的关系模式也适当的增加。查询效率高,有一定的冗余信息利用用户的查询。
最终的数据库模式已确定。
4、物理结构设计
4.1 聚簇设计
聚簇设计的主要目的是为了提高查询效率,聚簇设计的主要规则如下:
①.当对一个关系的某些属性列的访问是该关系的主要应用,而对其他属性的访问很少或是次要应用时,可以考虑对该关系在这些属性列上建立聚簇。
②.如果一个关系在某些属性列上的值重复率很高,则可以考虑对该关系在这些组属性列上建立聚簇。
③.如果一个关系一旦装入数据,某些属性列的值很少修改,也很少增加或删除元组,则可以考虑对该关系在这些组属性列上建立聚簇。
本实验中建立聚簇的表和对应属性如下表13.
表13 聚簇设计
聚簇名 |
表格 |
属性/列 |
xn_Tea_Tno18 |
Xun_Teachers18 |
xn_Tno18 |
xn_Cour_Cno18 |
Xun_Course18 |
xn_Cno18 |
xn_Mno_CLno18 |
Xun_Class18 |
xn_CLno18,xn_Mno18 |
xn_CLno_Sno18 |
Xun_Students18 |
xn_Sno18,xn_CLno18 |
建立者四个聚簇的主要是因为这几张对应的表都是实体表,且聚簇中的属性都是对应的主键或是外键,被访问的概率很高,所有需要建立聚簇。其他表或者这些表上的其他属性被访问的概率就相对较低,不太需要建立聚簇。
4.2 索引设计
对关系选择有效的索引对提高数据库访问效率有很大的帮助,数据库中建立索引的一般规则如下:
①在主键属性列和外键属性列上通常都可以分别建立索引,有助于唯一性检查和完整性检查,还可以加快连接查询的速度。
②以查询为主的关系可建立尽可能多的索引。
③对于等值连接,但是满足条件的元组较少的查询可以考虑建立索引。
④如果查询可以从索引直接得到结果而不必访问关系,则对此种查询可以建立索引。
本实验建立的索引对应的表和列如下表14所示:
表14 索引设计
索引名 |
表格 |
属性/列 |
xn_Tea_Tno18 |
Xun_Teachers18 |
xn_Tno18 |
xn_Cour_Cno18 |
Xun_Course18 |
xn_Cno18 |
xn_Mno_CLno18 |
Xun_Class18 |
xn_CLno18,xn_Mno18 |
xn_CLno_Sno18 |
Xun_Students18 |
xn_Sno18,xn_CLno18 |
xn_Cno_Sno18 |
Xun_Reports18 |
xn_Sno18,xn_Cno18 |
xn_Majo_Mno18 |
Xun_Major18 |
xn_Mno18 |
4.3 分区设计
若数据库中的数据量增大,往往需要用到多个磁盘驱动器或磁盘阵列。目的是为了提高系统性能。磁盘分区设计的一般原则:
①减少访问冲突,提高I/O并发性。多个事物并发访问同一磁盘时,会产生磁盘访问冲突而导致效率低下,如果事务访问数据均能分布于不同磁盘上,则I/O可并发执行,从而提高数据库访问速度。
②分散热点数据,均衡I/O负担。在数据库中数据访问的频率是不均匀的,那些经常被访问的数据成为热点数据,此类数据宜分散存在于不同的磁盘上,以均衡各个磁盘的负荷,充分发挥多磁盘的并行操作的优势。
③保证关键数据快速访问,缓解系统瓶颈。在数据库中有些数据如数据字典等的访问频率很高,为保证对它的访问不直接影响整个系统的效率,可以将其存放在某一固定磁盘上,以保证其快速访问。
因为该高校成绩管理系统由于数据量较小,所以不进行分区设计。
5、数据库实施
5.1 基本表建立
(1)Xun_Major18表
图11 Xun_Major18表的建立
(2)
图12 Xun_Teachers18表
(3)Xun_Class18表
图13创建Xun_Class18表
(4)Xun_Course18表
图14 创建基本表Xun_Course18
(5)Xun_Students18表
图15 创建基本表Xun_Students18
(6)TeachingCourse18表
图16 创建基本表TeachingCourse18
(7)Xun_TeachingClass18表的建立
图17 创建基本表Xun_TeachingClass18
(8)Xun_CourseClass18表的建立
图18 创建基本表Xun_CourseClass18
(9)Xun_Reports表的建立
图19 创建基本表Xun_Reports
(10)学生,教师,管理员账号表的建立。分别为:Xun_studentMima18,Xun_teacherMima18,Xun_admMima18。
图19 创建基本表Xun_studentMima18,Xun_teacherMima18,Xun_admMima18
5.2 视图的建立
(1)Xun_StudentsScore视图的建立,该视图由基本表 Xun_Reports18, Xun_Class18,Xun_Students18,Xun_Course18,Xun_Teachers18等值连接而成,用于反映学生所修课程的成绩。建立过程如下图20.
图20 创建视图Xun_StudentsScore
(2)Xun_EachCourseAvgS18视图的建立,由基本表Xun_Reports18,
Xun_Course18等值连接而成,反映各门课程的平均分。
图21 创建视图Xun_EachCourseAvgS18
(3)Xun_StudenCredit视图的建立,由基本表Xun_Students18,Xun_Reports18,
Xun_Course18导出,反映学生各科学分。
图22 创建视图Xun_StudenCredit
(4)Xun_TeacherCourse视图的建立,由基本表Xun_Teachers18,
Xun_TeachingCourse18,Xun_Course18等值连接导出,用于反映教师和其教授课程的关系。
图23 创建视图Xun_TeacherCourse
(5)Xun_ClassExcel视图的建立,由基本表Xun_Class18,Xun_CourseClass18,
Xun_Course18等值连接导出,用于反映对应班级的课表信息。
图24 创建视图Xun_ClassExcel
(6)Xun_StudentRegion18视图的建立,从基本表Xun_Students18表中导出,用于反映生源地对应学生人数的关系。
图25 创建视图Xun_StudentRegion18
(7)Xun_TeachingStu18视图的建立,从基本表Xun_Reports18,Xun_Class18,
Xun_Students18,Xun_Course18,Xun_Teachers18 中等值连接导出,用于反映教师和教授学生的关系。
图26创建视图Xun_TeachingStu18
(8)Xun_TeachingClassN18视图的建立,由基本表Xun_Class18,
Xun_TeachingClass18,Xun_Teachers18等值连接后导出,反映教师和对应教授班级的关系。
图27 创建视图Xun_TeachingClassN18
5.3 索引的建立
(1)xn_Cno_Sno18索引的建立
图28 创建索引xn_Cno_Sno18
(2)xn_CLno_Sno18索引的建立
图29创建索引xn_CLno_Sno18
(3)xn_Majo_Mno18索引的建立
图30 创建索引xn_Majo_Mno18
(4)xn_Mno_CLno18 索引的建立
图31 创建索引xn_Mno_CLno18
(5)xn_Cour_Cno18 索引的建立
图32 创建索引xn_Cour_Cno18
(6)xn_Tea_Tno18索引的建立
图33 创建索引xn_Tea_Tno18
5.4 触发器建立
本实验一共建立了6个触发器,介绍如下:
①Xun_Reports18表增加学生选课记录且成绩大于60则更新学生信息表上Xun_Students18该学生总学分。触发器 为Xun_TotalCredit。
②Xun_Teachers18表删除教师信息时,删除教师授课表Xun_TeachingCourse18,教师教授班级表Xun_TeachingClass18,教师账户密码表Xun_teacherMima18对应的教师信息。触发器为Xun_DeleteTeachers18。
③Xun_Teachers18表更新教师信息时,同步更新教师授课表Xun_TeachingCourse18,教师教授班级表Xun_TeachingClass18中的教师信息。触发器为Xun_UpdateTeachers。
④Xun_Students18表删除学生信息时,删除学生选课表Xun_Reports18和学生账户密码表中的该学生信息。触发器为Xun_delteStu18。
⑤Xun_Students18表添加学生信息时,同时在学生账户密码表Xun_studentMima18表中增加该学生的账户信息,默认登录密码为12345,若有需要也可登录后自行修改。触发器为Xun_AddStu18。
⑥Xun_Teachers18添加教师信息时,同时在教师账户密码表Xun_teacherMima18表中增加该教师的账户信息,默认登录密码为12345,若有需要也可登录后自行修改。触发器为Xun_AddTea18。
下面为几个触发器的建立截图
(1)Xun_TotalCredit的建立
图34 创建触发器Xun_TotalCredit
(2)Xun_UpdateTeachers的建立
图35 创建触发器Xun_UpdateTeachers
(3)Xun_DeleteTeachers18的建立
图36 创建触发器Xun_DeleteTeachers18
(4)Xun_delteStu18的建立
图37 创建触发器Xun_delteStu18
(5)Xun_AddStu18的建立
图38 创建触发器Xun_AddStu18
(6)Xun_AddTea18的建立
图39 创建触发器Xun_AddTea18
5.5 建存储过程
一共建立了两个存储过程。
(1)学生表Xun_Students18插入信息的存储过程Xun_insertStudents18.
图40 创建存储过程Xun_insertStudents18
(2)输入成绩,Xun_Students18表自动生成其总学分的存储过程
Xun_ScreditAu18。
图41 创建存储过程Xun_ScreditAu18
6、应用系统开发与试运行
6.1 开发平台和开发环境介绍
开发平台:Microsoft Visual Studio 2013
开发环境:微软在Builder 2013开发者大会上发布了Visual Studio 2013预览版,并且发布其程序组件库.NET 4.5.1的预览版,该软件已于北京时间2013年11月13日23:00时正式发布。Visual Studio 2013 预览版以 Visual Studio 2012 和后续的Microsoft Visual Studio 更新中的进展为基础构建而成,为开发团队提供需要的解决方案,使其接纳这种转变并开发和交付利用下一波Windows 平台创新 (Windows 8.1) 的新式应用程序,同时在所有 Microsoft 平台上支持多种设备和服务。
6.2 前台界面与后台数据库连接说明,代码实现。
本实验对应数据库系统的服务器名称为LAPTOP-1J0M5AIG\SQL2014,数据库名称为XunMIS18,身份验证使用Windows验证登录,如下图所示。
图42 SQL服务器身份验证登录
Visual Studio 2013连接数据库的代码为:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Data;
using System.Data.SqlClient;
using System.Windows.Forms;
namespace xnStudent
{
class sqlConnet
{
public SqlConnection conn = null;
public sqlConnet()
{
if (conn == null)
{
conn = new SqlConnection("Data Source = LAPTOP-1J0M5AIG\SQL2014; database = XunMIS18 ; " +
"Integrated Security = True");
if (conn.State == ConnectionState.Closed) conn.Open();
}
}
public void closeConnect()
{
if (conn.State == ConnectionState.Closed) conn.Close();
}
public DataSet Getds(string sql)
{
if (conn.State == ConnectionState.Closed) conn.Open();
DataSet ds = new DataSet();
SqlDataAdapter da = new SqlDataAdapter(sql, conn);
da.Fill(ds);
conn.Close();
return ds;
}
public int OperateData(string sql)
{
if (conn.State == ConnectionState.Closed) conn.Open();
SqlCommand sqlcom = new SqlCommand();
sqlcom.CommandText = sql;
sqlcom.CommandType = CommandType.Text;
sqlcom.Connection = conn;
int x = sqlcom.ExecuteNonQuery();
conn.Close();
return x;
}
public DataSet BindDataGridView(DataGridView dgv, string sql)
{
if (conn.State == ConnectionState.Closed) conn.Open();
SqlDataAdapter da = new SqlDataAdapter(sql, conn);
DataSet ds = new DataSet();
da.Fill(ds);
dgv.DataSource = ds.Tables[0];
return ds;
}
}
}
6.3 系统各功能设计和运行界面截图。
高校成绩管理登录界面如下图所示,按照需求分析,高校成绩管理系统有三个身份:管理员,教师和学生。
根据他们的功能的需求设计界面功能。这里需要输入正确的账号和密码,才能登录成功,进入对应身份的界面,否则显示登录失败,需要重新输入。
图43系统登录界面
1.管理员界面:
管理员可以修改自己的密码,
图44 管理员登录界面设计
下图45为管理员修改自己的密码的界面,需要输入正确原密码,才能修改密码,否则不予修改。
图45 管理员修改密码界面
下图46为管理员信息管理界面,可以对学生,教师和课程信息进行增删改。
图46 管理员信息修改界面
下图47为管理员修改学生信息的界面。修改时表格中第一列数据(学号属性)不可修改,其他的属性均可修改,直接点击单元格修改再保存即可。删除时,选中需要删除的行,点击删除,按确定即可删除成功,同时选课信表,学生账户密码表中也删除该学生的选课记录。插入新数据时,在左方输入插入新的学生的信息,性别只可选男女,班级需要从存在的班级中选,点击插入即增加成功,学生账户密码表中自动生成该学生的账户,默认密码12345。
图47 管理员修改学生信息界面
下图48为管理员修改教师信息的界面。修改时表格中第一列数据(教师编号属性)不可修改,其他的属性均可修改,直接点击单元格修改再保存即可。删除时,选中需要删除的行,点击删除,按确定即可删除成功,同时教师账户密码表也同时删除该教师的账户信息。插入新数据时,在左方输入插入新的教师的信息,点击插入即增加成功,教师账户密码表中自动生成该教师的账户,默认密码12345。
图48 管理员修改教师信息界面
下图49为管理员修改课程信息的界面。修改时表格中第一列数据(班级编号属性)不可修改,其他信息均可修改。删除和插入操作类似上面的。
图49 管理员修改课程信息界面
教务管理有两个模块,密码重置和注册新用户。
图50 管理员教务管理界面
下图51为管理员重置密码的界面,可以重置学生和教师的账户密码,输入正确的编号和原密码才可以修改,否咋报错,系统会自动匹配学生和教师的账户信息。
图51 管理员密码重置界面
管理员在点击注册学生新用户时,跳转到修改学生信息界面插入新的学生信息,在注册教师新用户时,跳转到修改教师界面插入新的教师信息。
图52 管理员注册新用户界面
管理员的信息查询界面如下,具体可查询学生,教师,班级,专业和课程的信息。
图53管理员查询学生信息界面
下图54为管理员查询学生基本信息的界面,可以查看学生所有的基本信息,但查询时均不可以修改:
图54 管理员查询学生基本信息
下图55为管理员查询学生成绩的界面,可以查询所有同学的全部科目的成绩,也可以查询指定学生的成绩信息。
图55 管理员查询学生成绩
下图56为管理员查询学生生源地信息的界面,可以统计所有生源地学生的人数,也可以查看指定生源地的学生数,也可以查询指定学生的成绩信息。
图56 管理员生源统计
下图57为管理员查询教师基本信息的界面,可以查看教师所有的基本信息,也可以通过教师编号筛选记录:
图57 管理员查询教师基本信息
下图58为管理员查询班级基本信息的界面,可以查看班级所有的基本信息,也可以通过班级编号筛选记录:
图58管理员查询班级基本信息
下图59为管理员查询专业基本信息的界面,可以查看专业所有的基本信息,也可以通过专业编号筛选记录:
图59管理员查询专业基本信息
下图60为管理员查询课程基本信息的界面,可以查看课程所有的基本信息,也可以通过课程编号筛选记录:
图60管理员查询课程基本信息
2。教师界面
教师登录成功时,界面如下图61所示,主要分为信息查询和学生成绩录入:
图61 教师登录成界面
教师可以修改自己账户的密码,教师‘文件’快捷键有以下;两个功能,如下图62.
图62 教师界面‘文件’
修改密码时,需要输入该教师账户正确的原密码,否则不予修改。
图63 教师修改密码界面
下图为展示教师信息查询的所有功能。
图64 教师信息查询界面
教师有权查询该教师教授的学生基本信息,下图65为教师查询授课学生信息的界面,可以通过输入学生的学号来筛选学生信息。
图65教师查询任教学生基本信息
下图66,67为教师个人授课信息查询界面,可以查询该教师的上课班级和授课课程。
图66 教师查询任教班级
图67 教师查询任教课程
下图68为教师课程查询界面,可以插叙所有教师教授课程,也可以通过教师编号筛选教师授课信息。
图68 教师查询所有教师课表
下图69为教师查询个人基本信息的界面,可以查看个人的基本信息。
图69 教师查询个人基本信息
下图70为教师查询课程平均分的界面,可以查询所有课程的平均分,也可以通过输入课程名称筛选,
图70教师查询所以课程平均分
图71 教师查询指定课程平均分
下图72为教师查询成绩界面,可以查看所有选课学生的成绩信息,按照课程和开设学期查看对应排名信息。
图72 教师查询任教学生成绩
下图73为教师查询学生成绩排名信息的界面,按课程开设学期查询排名信息,排名降序排。
图73 教师查询学生成绩排名
下图74为教师录入学生成绩的界面,可以按照课程编号和上课学期筛选选课信息,筛选之后,直接在单元格上修改成绩信息,按保存后修改,进行成绩的录入。且只能修改该教师授课学生的成绩,系统会先自动筛选该教师授课信息。
图74 教师录入学生成绩
3.学生界面
下图75为学生登录界面,根据功能需求可知,学生的主要需求是查询信息:
图75 学生登录成功界面
学生课修改自己的账户的密码,需要正确输入原密码之后才可修改:
图76 学生修改密码界面
若原密码输入错误,则不允许修改密码,如下图77所示。
图77 密码错误,不予修改提示
下图78为学生主要客源查询的信息,为班级课程查询,教授授课查询,个人成绩查询,个人已修学分查询,个人课表查询。
图78 学生信息查询界面
下图79为学查询班级课表的界面,客源查询所有班级的课表,也可以通过班级编号筛选。
图79 学生查询班级课程界面
下图80为学查询教师授课信息的界面,客源查询所有教师的任课情况,也可以通过教师编号筛选授课信息。
图80 学生查询教师课程界面
下图81为学生查询个人成绩信息的界面,客源查看该学生所有的成绩信息,也可以通过课程开设学期进行筛选。
图81 学生查询个人成绩信息界面
下图82为学生查询已修学分的界面,可以查看该学生各科的学分,也可以查看总已修学分。
图82学生查询学分界面
下图83为学生个人课表查询界面,查询学生所有的课程信息:
图83 学生查询个人课表界面
7、实验总结
7.1 遇到的问题和解决的办法
问题1:如何记录登陆用户的账号信息,保证在进行数据修改时没有权利的用户无法修改与自己无关的信息?
解决办法:在各界面的构造函数中,传入该用户的账号信息,例如:
private void 信息录入ToolStripMenuItem_Click(object sender, EventArgs e)
{
学生成绩录入aaa新版 fmain = new 学生成绩录入aaa新版(Tno);
fmain.Show();
}
通过传入该教师的教师编号,控制该教师只能录入选了他教的课程的学生成绩,而不能提交其他教师教授的选课学生的成绩。
问题2:原先的Xun_Reoprts表中存储的教师信息时教师姓名,但是依照数据库的来书,应该存储的属性为教师编号,教师编号才是教师属性中唯一的主键,但是存储教师教师姓名可以减少数据的连接,加快查询速度。存在一定矛盾。
解决方法:在Xun_Reports表存储教师编号信息,将教师编号与教师姓名等值连接后生成一个视图,方便查询,数据库也不会出错。
问题3:触发器和存储过程的建立,只知道可以起提示作用,还可以引起系统内部自动进行调整,但具体不知道怎么建立。
解决方案:查询书本和网络资料,可知触发器的概念如下:
触发器(trigger)是个特殊的存储过程,它的执行不是由程序调用,也不是手工启动,而是由事件来触发,比如当对一个表进行操作( insert,delete,update)时就会激活它执行。触发器经常用于加强数据的完整性约束和业务规则等。 触发器可以从 DBA_TRIGGERS ,USER_TRIGGERS 数据字典中查到。
分析该数据库系统的用户需求,可知需要在录入成绩的时候自动加学分,删除用户时需要删除所有的用户信息,否则数据库会出错,还有增加用户信息时需要注册用户新账号和密码,使得该用户可以正常登录系统,通过这些分析,成功建立了触发器,用于维护数据库。
存储过程的概念如下:
存储过程(Stored Procedure)是一组为了完成特定功能的SQL语句集,是利用SQL Server 所提供的Transact-SQL 语言所编写的程序。经编译后存储在数据库中。存储过程是数据库中的一个重要对象,用户通过指定存储过程的名字并给出参数(如果该存储过程带有参数)来执行它。存储过程是由流控制和SQL 语句书写的过程,这个过程经编译和优化后存储在数据库服务器中,存储过程可由应用程序通过一个调用来执行,而且允许用户声明变量。
根据其概念,本实验中设计了两个存储过程。
问题4:数据插入的错误,因为数据库初步设计时候结果不够完善,导致数据插入不进去。
解决方案:主要错在数据的类型、大小以及各个约束关系上,导致一些插入无法进行。而删除、重建基本表,会发现完整性约束导致基本表不能删除,所以我利用基本表的修改ALTER来进行改动。
问题5:不熟悉C#语言
解决方案:从来没有接触过C#语言,在编写的时候有点困难,参考书本上的d代码写了许多无用的代码,后来一步步分析,调试才慢慢理解界面设计的原理,C#语言类似JAVA和C++的结合,写起来上手很快,界面设计比JAVA便捷很多。
问题6:许多表存储的都是编号信息,但是考虑界面的需求,我们需要显示姓名和实名的信息,所以导致很难设计表格。
解决方案:通过等值连接建立足够多的视图来供用户查询,重复考虑数据库内部存储和界面显示的一致性。
问题7:嵌入式开发中SQL语句问题
解决方案:平时在数据库中编写SQL语句对于规范性的要求都比较熟悉,也比较好写,不会存在换行问题,但是写在C#语句时,要注意换行的问题。SQL语句必须一行写完,一些引号问题也要主要,不然会捕捉到错误,查询一直是失败的。
一旦查询失败,系统也只会跳出提示框,尤其是SQL语句中的错误特别难发现,需要台式很久,才能找到错误的关键。通过增加断点的方式逐步查看语句一步一步运行的问题,查看变量属性等来解决问题所在。
问题8:下拉框选择问题
解决方案:参考书上的代码,为了考虑人性化需求,下拉框内显示的都是实体的具体名称,但是在系统内部选择的是它的编号,所以在提取下拉框的内容时需要使用SelectedValue来提取它的内容。但是对于是预设好的下拉框,应该使用SelectedItem来提取文本内容,设计预设值也是考虑了用户的需求问题。
7.2 系统设计的不足
1.触发器还不够多
本实验中一共建立了6个触发器,在维护系统的完整性上起到了一定的作用,基本的触发器都已经建立。但在编写报告时发现还是少了一些触发器,比如删除课程信息表中的课程信息时应该也删除选课表上的课程信息。这点设计的不足。
2.设计学生信息时应该存储学生的生日信息
在听老师分析数据库的时候,老师强调了应该存储一开始在设计时应该在存年龄信息的时候应该存储生日日期,因为年龄会随着世界变化,但是生日信息不会,所以应该存生日信息,数据库系统才能稳定。但是在模式分析的时候没有考虑到这个问题,所以在这一点上设计的不足。
3.界面设计的还不是特别简便清晰:
因为在分析数据结构的时候没有充分考虑用户需求,导致教师界面功能设计的有一点杂乱,教师界面一些功能是后期修改时才加上去的,有些功能可以有冗余,不知道怎么删除比较好。
4.并发操作:
在这次的构建系统中,没有思考到并发操作这一问题。高校学生管理系统是一个多用户会同时在线的系统,如何保证在并发操作时,实现数据的安全性、正确性是十分重要的。并发操作不可缺少。
7.3 进一步改进思路和体会
改进思路:
1.增强系统的安全性,对于数据库的实现功能也可以增加些,还有控制权限应该要做得更好,做到对用户隐私的保护。
2.使用户可以同时登陆时数据系统的并发性要好,书本上对这一方面的知识有做详细的介绍,可以根据书本和网络的知识设计。
3.本实验没有设计分区,因为分区设计适合数据量达到额数据库,因为插入数据时不方便插很多,为了方便测试所以数据量比较少。但是如果要考虑到实际的需求,还是要设计分区。
4.虽然做不到现在正方教务系统那么完善,但是也应该再增加一些信息查询,比如正方会自动检测课表冲突问题,可根据模块筛选可选课程,根据上课教室安排各个班的课表和老师的课表,所以我的数据库仍然要做许多的优化,更接近高校成绩管理系统。
数据库建立源代码(若有C# 代码需求可私信发邮箱号哈 ):
create table Xun_Teachers18(
xn_Tno18 char(10) PRIMARY KEY NOT NULL,
xn_Tname18 char(10) NOT NULL,
xn_Tsex18 char(5),
xn_Tage18 int,
xn_Ttell18 char(20),
xn_Tpos18 char(10)
)
create table Xun_Course18(
xn_Cno18 char(10) PRIMARY KEY NOT NULL,
xn_Cname18 char(10) NOT NULL,
xn_Csemester18 char (20),
xn_Chour18 int check (xn_Chour18>0) ,
xn_Cinspect18 char(5),
xn_Ccredit18 float check (xn_Ccredit18>0),
xn_Tname18 char(10)
)
create table Xun_Major18(
xn_Mno18 char(10) PRIMARY KEY NOT NULL,
xn_Mname18 char(10) NOT NULL
)
create table Xun_Class18(
xn_CLno18 char(10) PRIMARY KEY NOT NULL,
xn_CLname18 char(10) NOT NULL,
xn_Mno18 char(10)
CONSTRAINT cm FOREIGN KEY(xn_Mno18 )
REFERENCES Xun_Major18
)
CREATE TABLE Xun_Students18
(
xn_Sno18 char(12) PRIMARY KEY NOT NULL,
xn_Sname18 char(10) NOT NULL,
xn_Ssex18 char(5),
xn_Sage18 int,
xn_Sregion18 char(20),
xn_Scredit18 float ,
xn_CLno18 char(10),
CONSTRAINT scl FOREIGN KEY(xn_CLno18)
REFERENCES Xun_Class18
)
create table Xun_TeachingCourse18(
xn_Tno18 char(10) NOT NULL,
xn_Cno18 char(10) NOT NULL,
PRIMARY KEY(xn_Tno18,xn_Cno18),
CONSTRAINT tc_1 FOREIGN KEY(xn_Tno18)
REFERENCES Xun_Teachers18,
CONSTRAINT tc_2 FOREIGN KEY(xn_Cno18)
REFERENCES Xun_Course18
)
create table Xun_TeachingClass18(
xn_Tno18 char(10) NOT NULL,
xn_CLno18 char(10) NOT NULL,
PRIMARY KEY(xn_Tno18,xn_CLno18),
CONSTRAINT tcl_1 FOREIGN KEY(xn_Tno18)
REFERENCES Xun_Teachers18,
CONSTRAINT tcl_2 FOREIGN KEY(xn_CLno18)
REFERENCES Xun_Class18
)
create table Xun_CourseClass18(
xn_CLno18 char(10) NOT NULL,
xn_Cno18 char(10) NOT NULL,
PRIMARY KEY( xn_Cno18 ,xn_CLno18),
CONSTRAINT ccl_1 FOREIGN KEY(xn_CLno18)
REFERENCES Xun_Class18,
CONSTRAINT ccl_2 FOREIGN KEY(xn_Cno18)
REFERENCES Xun_Course18
)
create table Xun_Reports18(
xn_Sno18 char(12) not null,
xn_Cno18 char(10) not null,
xn_Tname18 char(10) not null,
xn_Csemesters18 char(10),
xn_Score18 int,
PRIMARY KEY( xn_Cno18 ,xn_Sno18),
CONSTRAINT r1 FOREIGN KEY(xn_Cno18)
REFERENCES Xun_Course18,
CONSTRAINT r2 FOREIGN KEY(xn_Sno18)
REFERENCES Xun_Students18
)
用户密码表:
create table Xun_studentMima18
(
xn_Sno18 char(10) PRIMARY KEY NOT NULL,
xn_Smima18 char(5) NOT NULL,
)
create table Xun_teacherMima18
(
xn_Tno18 char(10) PRIMARY KEY NOT NULL,
xn_Tmima18 char(5) NOT NULL,
)
create table Xun_admMima18
(
xn_Ano18 char(10) PRIMARY KEY NOT NULL,
xn_Amima18 char(5) NOT NULL,
)
专业表数据:
insert into Xun_Major18
values('M01','计智')
insert into Xun_Major18
values('M02','计科')
insert into Xun_Major18
values('M03','网工')
insert into Xun_Major18
values('M04','软工')
教师表数据:
insert into Xun_Teachers18
values('T01','程珍','女','30','12353452453','讲师')
insert into Xun_Teachers18
values('T02','潘翔','男','35','13553452453','讲师')
insert into Xun_Teachers18
values('T03','陈建丽','女','35','17353452453','教授')
insert into Xun_Teachers18
values('T04','黄亮','男','30','15453452453','讲师')
insert into Xun_Teachers18
values('T05','王涌','男','40','17853452453','教授')
insert into Xun_Teachers18
values('T06','赵冬冬','男','30','12753452453','讲师')
insert into Xun_Teachers18
values('T07','胡海根','男','35','15473452453','讲师')
insert into Xun_Teachers18
values('T08','周文','女','30','19353452453','讲师')
班级表:
insert into Xun_Class18
values('CL01','计智1901','M01')
insert into Xun_Class18
values('CL02','计智1902','M01')
insert into Xun_Class18
values('CL03','计科1901','M02')
insert into Xun_Class18
values('CL04','计科1902','M02')
insert into Xun_Class18
values('CL05','网工1901','M03')
insert into Xun_Class18
values('CL06','网工1902','M03')
insert into Xun_Class18
values('CL07','软工1901','M04')
insert into Xun_Class18
values('CL08','软工1902','M04')
课程表:
insert into Xun_Course18
values('C01','复变函数','大二上','48','考试','3','程珍')
insert into Xun_Course18
values('C02','复变函数','大二上','48','考试','3','潘翔')
insert into Xun_Course18
values('C03','离散数学','大一下','48','考试','3','陈建丽')
insert into Xun_Course18
values('C04','离散数学','大一下','48','考试','3','黄亮')
insert into Xun_Course18
values('C05','机器学习','大二下','48','考核','3','王涌')
insert into Xun_Course18
values('C06','机器学习','大二下','48','考核','3','赵冬冬')
insert into Xun_Course18
values('C07','计组','大二下','32','考试','2','胡海根')
insert into Xun_Course18
values('C08','计组','大二下','32','考试','2','周文')
insert into Xun_Course18
values('C09','算法设计','大二下','48','考试','3','黄亮')
学生:
insert into Xun_Students18
values('S01','乐乐','女','20','浙江省','56','CL01')
insert into Xun_Students18
values('S02','琪琪','女','20','浙江省','46','CL01')
insert into Xun_Students18
values('S03','小贝','男','20','浙江省','50','CL02')
insert into Xun_Students18
values('S04','玲玲','女','20','江苏省','30','CL02')
insert into Xun_Students18
values('S05','可可','女','19','江苏省','46','CL03')
insert into Xun_Students18
values('S06','小宇','男','20','浙江省','36','CL03')
insert into Xun_Students18
values('S07','小洁','女','20','浙江省','50','CL04')
insert into Xun_Students18
values('S08','小星','女','20','湖南省','53','CL04')
insert into Xun_Students18
values('S09','张亚','女','20','河南省','60','CL05')
insert into Xun_Students18
values('S10','张三','男','19','浙江省','30','CL05')
insert into Xun_Students18
values('S11','张宁','女','20','浙江省','42','CL06')
insert into Xun_Students18
values('S12','张莹','女','20','湖南省','32','CL06')
insert into Xun_Students18
values('S13','王昊栋','男','20','浙江省','22','CL07')
insert into Xun_Students18
values('S14','陈沁如','女','20','浙江省','52','CL07')
insert into Xun_Students18
values('S15','徐妮','女','20','浙江省','54','CL08')
insert into Xun_Students18
values('S16','徐敏','女','20','浙江省','46','CL08')
teaching_course表:
insert into Xun_TeachingCourse18
values('T01','C01')
insert into Xun_TeachingCourse18
values('T02','C02')
insert into Xun_TeachingCourse18
values('T03','C03')
insert into Xun_TeachingCourse18
values('T04','C04')
insert into Xun_TeachingCourse18
values('T05','C05')
insert into Xun_TeachingCourse18
values('T06','C06')
insert into Xun_TeachingCourse18
values('T07','C07')
insert into Xun_TeachingCourse18
values('T08','C08')
insert into Xun_TeachingCourse18
values('T04','C09')
Teaching class表:
insert into Xun_TeachingClass18
values('T01','CL01')
insert into Xun_TeachingClass18
values('T02','CL02')
insert into Xun_TeachingClass18
values('T03','CL03')
insert into Xun_TeachingClass18
values('T04','CL04')
insert into Xun_TeachingClass18
values('T05','CL05')
insert into Xun_TeachingClass18
values('T06','CL06')
insert into Xun_TeachingClass18
values('T07','CL07')
insert into Xun_TeachingClass18
values('T08','CL08')
course_class表:
insert into Xun_CourseClass18
values('CL01','C01')
insert into Xun_CourseClass18
values('CL02','C02')
insert into Xun_CourseClass18
values('CL03','C03')
insert into Xun_CourseClass18
values('CL04','C04')
insert into Xun_CourseClass18
values('CL05','C05')
insert into Xun_CourseClass18
values('CL06','C06')
insert into Xun_CourseClass18
values('CL07','C07')
insert into Xun_CourseClass18
values('CL08','C08')
insert into Xun_CourseClass18
values('CL04','C09')
reports表:
insert into Xun_Reports18
values('S01','C01','T01','大二上','80')
insert into Xun_Reports18
values('S02','C01','T01','大二上','90')
insert into Xun_Reports18
values('S01','C01','T01','大二上','80')
insert into Xun_Reports18
values('S01','C01','T01','大二上','80')
insert into Xun_Reports18
values('S01','C01','T01','大二上','80')
insert into Xun_Reports18
values('S01','C01','T01','大二上','80')
insert into Xun_Reports18
values('S01','C01','T01','大二上','80')
insert into Xun_Reports18
values('S01','C01','T01','大二上','80')
report:
insert into Xun_Reports18
values('S01','C01','T01','大二上','80')
insert into Xun_Reports18
values('S02','C01','T01','大二上','90')
insert into Xun_Reports18
values('S03','C02','T02','大二上','70')
insert into Xun_Reports18
values('S04','C02','T02','大二上','95')
insert into Xun_Reports18
values('S05','C03','T03','大一下','70')
insert into Xun_Reports18
values('S06','C03','T03','大一下','87')
insert into Xun_Reports18
values('S07','C04','T04','大一下','65')
insert into Xun_Reports18
values('S07','C09','T04','大二下','98')
insert into Xun_Reports18
values('S08','C04','T04','大一下','74')
insert into Xun_Reports18
values('S08','C09','T04','大二下','67')
insert into Xun_Reports18
values('S09','C05','T05','大二下','88')
insert into Xun_Reports18
values('S10','C05','T05','大二下','83')
insert into Xun_Reports18
values('S11','C06','T06','大二下','80')
insert into Xun_Reports18
values('S12','C06','T06','大二下','94')
insert into Xun_Reports18
values('S13','C07','T07','大二下','87')
insert into Xun_Reports18
values('S14','C07','T07','大二下','77')
insert into Xun_Reports18
values('S15','C08','T08','大二下','91')
insert into Xun_Reports18
values('S16','C08','T08','大二下','90')
1.视图学生成绩:
create view Xun_StudentsScore
as
select Xun_Reports18.xn_Sno18,
xn_Sname18,xn_Cname18,
Xun_Teachers18.xn_Tname18,
Xun_Reports18.xn_Csemesters18,
Xun_Reports18.xn_Score18,
xn_CLname18
from Xun_Reports18,Xun_Class18,Xun_Students18,Xun_Course18,Xun_Teachers18
where Xun_Reports18.xn_Sno18=Xun_Students18.xn_Sno18
and Xun_Reports18.xn_Cno18=Xun_Course18.xn_Cno18
and Xun_Class18.xn_CLno18=Xun_Students18.xn_CLno18
and Xun_Reports18.xn_Tname18=xn_Tno18
2.视图每门课平均成绩:
create view Xun_EachCourseAvgS
as
select AVG(Xun_Reports18.xn_Score18) avg_Score,xn_Cname18
from Xun_Reports18,Xun_Course18
where Xun_Course18.xn_Cno18=Xun_Reports18.xn_Cno18
group by Xun_Course18.xn_Cname18
3.学生各门课学分视图:
create view Xun_StudenCredit
as
select Xun_Students18.xn_Sno18,xn_Sname18,xn_Cname18,xn_Ccredit18
from Xun_Students18,Xun_Reports18,Xun_Course18
where Xun_Students18.xn_Sno18=Xun_Reports18.xn_Sno18
and Xun_Reports18.xn_Cno18=Xun_Course18.xn_Cno18
4.教师课表视图:
create view Xun_TeacherCourse
as
select Xun_Teachers18.xn_Tno18,Xun_Teachers18.xn_Tname18,Xun_Course18.xn_Cno18,xn_Cname18,
xn_Chour18,xn_Ccredit18,xn_Csemester18
from Xun_Teachers18,Xun_TeachingCourse18,Xun_Course18
where Xun_Teachers18.xn_Tno18=Xun_TeachingCourse18.xn_Tno18
and Xun_TeachingCourse18.xn_Cno18=Xun_Course18.xn_Cno18
5.班级表视图:
create view Xun_ClassExcel
as
select Xun_Class18.xn_CLno18,xn_CLname18,
Xun_Course18.xn_Cno18,xn_Cname18,
xn_Ccredit18,xn_Chour18,xn_Csemester18
from Xun_Class18,Xun_CourseClass18,Xun_Course18
where Xun_Class18.xn_CLno18=Xun_CourseClass18.xn_CLno18
and Xun_Course18.xn_Cno18=Xun_CourseClass18.xn_Cno18
6.地区学生视图:
create view Xun_StudentRegion
as
select xn_Sregion18,count(xn_Sno18) 地区学生总数
from Xun_Students18
group by xn_Sregion18
7.视图老师教学生:
create view Xun_TeachingStu18
as
select Xun_StudentsScore.xn_Sno18,xn_Sname18,xn_Tno18, Xun_StudentsScore.xn_Tname18,xn_Cname18,xn_Csemesters18,xn_CLname18,xn_Score18
from Xun_StudentsScore ,Xun_Teachers18
where Xun_StudentsScore.xn_Tname18=Xun_Teachers18.xn_Tname18
8.视图老师教班级
create view Xun_TeachingClassN18
as
select Xun_Teachers18.xn_Tno18,xn_Tname18, Xun_Class18.xn_CLno18,xn_CLname18,xn_Mno18
from Xun_Class18,Xun_TeachingClass18,Xun_Teachers18
where Xun_TeachingClass18.xn_Tno18=Xun_Teachers18.xn_Tno18
and Xun_TeachingClass18.xn_CLno18=Xun_Class18.xn_CLno18
索引建立:
create unique index xn_Tea_Tno18 on Xun_Teachers18(xn_Tno18)
create unique index xn_Cour_Cno18 on Xun_Course18(xn_Cno18)
create unique index xn_Mno_CLno18 on Xun_Class18(xn_CLno18,xn_Mno18)
create unique index xn_Majo_Mno18 on Xun_Major18(xn_Mno18)
create unique index xn_CLno_Sno18 on Xun_Students18(xn_Sno18,xn_CLno18)
create unique index xn_Cno_Sno18 on Xun_Reports18(xn_Sno18,xn_Cno18)
触发器:
1.更新总学分:
create trigger Xun_TotalCredit on Xun_Reports18
for insert
as
update Xun_Students18
set xn_Scredit18=(
select sum(xn_Ccredit18)
from Xun_Course18
where xn_Cno18 in(
select xn_Cno18 from Xun_Reports18
where xn_Score18>=60
and Xun_Reports18.xn_Sno18 in(
select xn_Sno18 from inserted
) ) )
where Xun_Students18.xn_Sno18 in(
select xn_Sno18
from inserted)
2.删除教师信息:
create trigger Xun_DeleteTeachers18
on Xun_Teachers18
for delete
as
delete xn_Tno18
where Xun_TeachingCourse18.xn_Tno18=(select xn_Tno18 from deleted)
and Xun_TeachingClass18.xn_Tno18=(select xn_Tno18 from deleted )
and Xun_teacherMima18.xn_Tno18=(select xn_Tno18 from deleted )
3.更新教师信息:
create trigger Xun_UpdateTeachers
on Xun_Teachers18
for update
as
if update(xn_Tno18)
begin
update Xun_TeachingCourse18
set xn_Tno18=i.xn_Tno18
from deleted d,inserted i ,Xun_TeachingCourse18 t
where t.xn_Tno18=d.xn_Tno18
end
begin
update Xun_TeachingClass18
set xn_Tno18=i.xn_Tno18
from deleted d,inserted i,Xun_TeachingClass18 c
where c.xn_Tno18=d.xn_Tno18
end
4.删除学生的触发器:
create trigger Xun_delteStu18
on Xun_Students18
for delete
as
begin
delete from Xun_Reports18
where Xun_Reports18.xn_Sno18 in (select xn_Sno18 from deleted)
delete from Xun_studentMima18
where Xun_studentMima18.xn_Sno18 in(select xn_Sno18 from deleted)
end
5.添加新学生注册账号密码的触发器
create trigger Xun_AddStu18
on Xun_Students18
for insert
as
declare @sno char (10)
begin
select @sno= xn_Sno18 from inserted
insert into Xun_studentMima18
values (@sno,'12345')
end
6.添加新老师注册账号密码的触发器
create trigger Xun_AddTea18
on Xun_Teachers18
for insert
as
declare @tno char(10)
begin
select @tno=xn_Tno18 from inserted
insert into Xun_teacherMima18
values(@tno,'12345')
end
存储过程1:
create procedure Xun_insertStudents18
@sno char(20),
@sname char (12),
@ssex char(5),
@sage int,
@sregion char (10),
@scredit float,
@sclass char(10)
as
insert Xun_Students18(xn_Sno18,xn_Sname18,xn_Ssex18,xn_Sage18,xn_Sregion18,xn_Scredit18,xn_CLno18)
values(@sno,@sname ,@ssex,@sage,@sregion,@scredit,@sclass)
select *
from Xun_Students18
go
存储过程2:
create procedure Xun_ScreditAu18
@sno char(12),
@cno char(10),
@cname char(18),
@tname char(10),
@cmester char(10),
@score int,
@credit float
as
begin
insert into Xun_learning18
values(@sno,@cno,@score)
update Xun_Students18
set Xun_Students18.xn_Scredit18+=@credit
where Xun_Students18.xn_Sno18=@sno
end
窗体中用到的对应表和视图:
管理员查询生源地:
Xun_StudentRegion18:Xun_Students18
管理员查成绩:
Xun_StudentsScore: Xun_Reports18,
Xun_Class18,
Xun_Students18,
Xun_Course18,
Xun_Teachers18
管理员修改自己的密码;
Xun_teacherMima18
重置其他的密码:
Xun_studentMima18
Xun_teacherMima18
其他基本信息都从基本信息中导出
学生查成绩:
Xun_StudentsScore: Xun_Reports18,
Xun_Class18,
Xun_Students18,
Xun_Course18,
Xun_Teachers18
学生查学分:
Xun_StudenCredit:Xun_Students18,
Xun_Reports18,
Xun_Course18
学生查课表:
Xun_Reports18
学生查班级课程:
Xun_ClassExcel :Xun_Class18
Xun_CourseClass18,
Xun_Course18
学生查教师课表:
Xun_TeacherCourse:Xun_Teachers18,
Xun_TeachingCourse18,
Xun_Course18
教师查学生:
Xun_TeachingStu18:Xun_Reports18,
Xun_Class18,
Xun_Students18,
Xun_Course18,
Xun_Teachers18
只能查看自己教的学生
教师个人授课信息查询:
上课班级:Xun_TeachingClassN18:
Xun_Class18,
Xun_TeachingClass18,
Xun_Teachers18
教授课程:Xun_TeacherCourse:
Xun_Teachers18,
Xun_TeachingCourse18,
Xun_Course18
教师查询所有教师课程:
Xun_TeacherCourse: Xun_Teachers18,
Xun_TeachingCourse18,
Xun_Course18
个人基本信息:
Xun_Teachers18
教师查课程平均分:
Xun_EachCourseAvgS18:
Xun_Reports18,
Xun_Course18
所有课程,可以选择
教师查学生排名:
按课程查排名:Xun_Reports18
按学期查排名:Xun_Reports18
插入,修改学生成绩:Xun_Reports18
排名查询:
SELECT
a.xn_Sno18,a.xn_Cno18, a.xn_Score18 AS Score,
COUNT( DISTINCT b.xn_Score18) AS Rank
FROM Xun_Reports18 a,Xun_Reports18 b
WHERE b.xn_Score18 >= a.xn_Score18
and a.xn_Csemesters18='选定学期'
and b.xn_Csemesters18='选定学期'
GROUP BY
a.xn_Sno18,a.xn_Score18,a.xn_Cno18
ORDER BY
a.xn_Score18 DESC