高校成绩管理数据库系统
2015-08-15 11:00
148 查看
高校成绩管理数据库系统
浙江工业大学·计算机学院
高校成绩管理数据库系统的设计与实现
1、需求分析
计算机已经深入到日常工作和生活的方方面面,成为我们学习和工作的得力助手,比如文字处理、信息管理、辅助设计、图形图像处理、教育培训以及游戏娱乐等。随着越来越多的应用软件出现,人们对它的要求也越来越高;虽然现在世界上的各种软件层出不穷,但它们依然不能满足用户的各种特殊需要,所以人们仍是不得不开发适合特殊需求的软件。高校成绩管理系统记录了一个大学生成绩的系统,它的出现使得查询、更新、插入简单化,高效化,成本也随之大大减少。使用计算机对成绩信息的管理,具有手工管理所
无法比拟的优点:信息存储及时,检索迅速、查找方便、可靠性高、存储量大、保密性好、寿命长、成本低等。这些优点能够极大地提高学 生成绩管理的效率,也是高校成绩正规化管理的重要途径。
本软件控件均以中文形式表示,对普通程序使用者的查询提供简单方便的快捷操作,不需要技术含量。
以SQL SERVER数据库管理系统为平台,通过设计数据库概念模型、逻辑模型以及利用标准SQL语言的数据库实现,掌握关系数据库系统的设计与实现方法,增强数据库设计和数据库应用系统开发能力。
操作人员与维护人员应懂的SQL语言。
运行环境:
硬件环境:LENOVO-G470
软件环境:1.Windows 8企业版
2.Microsoft SQL Server 2012 Ultimate
3.NETBEANS 7.3
1.1 数据需求描述
![](http://images.cnitblog.com/blog/464052/201402/221639083284215.png)
1.2 系统功能需求
.管理员
(1).添加教师名单;
(2).查询教师名单;
(3).修改教师信息;
(4).删除教师名单;
(5).添加学生名单;
(6).查询学生名单;
(7).修改学生信息;
(8).删除学生名单;
(9).统计生源地信息;
(10).修改密码;
.教师
(1).查看个人信息;
(2).查看每门课程平均成绩统计;
(3).输入学生成绩, 自动生成该学生已修总学分;
(4).查看任课信息;
(5).查看学生成绩名次;
(6).修改密码;
.学生
(1).查看个人信息;
(2).查看自己的课表;
(3).查看不同班级的开课情况;
(4).查询考试成绩;
(5).修改密码;
1.3 其他性能需求
(1).用户输入出错时,有错误提示。
(2).给管理员,教师,学生不同的权限,提高数据安全性;
(3).创建触发器,存储过程,防止数据不一致;
![](http://images.cnitblog.com/blog/464052/201402/221639096804431.png)
2、概念结构设计
![](http://images.cnitblog.com/blog/464052/201402/221639110243174.png)
3、逻辑结构设计
.教师jn(教师编号jn、教师姓名jn、教师性别jn、教师年龄jn、职称jn、联系电话jn)
.上课jn(教师编号jn,班级编号jn)[班级编号jn]
.授课jn(教师编号jn,课程编号jn)
.课程jn(课程编号jn、课程名称jn、教师姓名jn、学期jn、学时jn、考试或考查jn、学分jn)
.学习jn(学号jn,课程编号jn,学期jn,课程名称jn,成绩jn,教师姓名jn)[课程编号jn]
.学生jn(学号jn、学生姓名jn、学生性别jn、学生年龄jn、生源所在地jn、已修学分总数jn,班级编号jn)
.开设jn(课程编号jn,班级编号jn)[课程编号jn,班级编号jn]
.班级jn(班级编号jn,班级名称jn,专业编号jn)
.专业jn(专业编号jn,专业名称jn)
.学生账号jn(学生编号jn,学生密码jn)[学生编号jn]
.教师账号jn(教师编号jn, 教师密码jn)[ 教师编号jn]
.管理员账号jn(管理员编号jn, 管理员密码jn)[ 管理员编号jn]
3.2 数据类型定义
(1).教师jn
(2).上课jn
(3).授课jn
(4).课程jn
(5).学习jn
(6).学生jn
(7).开设jn
(8)班级jn
(9).专业jn
(10).学生账号jn
(11).教师账号jn
(12).管理员账号jn
3.3 关系模式的优化
对关系模式进行规范化处理,对关系模式进行评价与修正。
4、物理结构设计
4.1 聚簇设计
该高校成绩管理系统数据库可建立聚簇:
.教师jn(教师编号jn);
![](http://images.cnitblog.com/blog/464052/201402/221639147862320.jpg)
.课程jn(课程编号jn);
![](http://images.cnitblog.com/blog/464052/201402/221639150315863.jpg)
.学生jn(学生学号jn,班级编号jn);
![](http://images.cnitblog.com/blog/464052/201402/221639154531692.jpg)
.jn(班级编号jn);
![](http://images.cnitblog.com/blog/464052/201402/221639157974263.jpg)
这几个聚簇设计是因为这几张表都是实体表,,且聚簇中的属性都是主键或是外键,被访问的概率很高,而其他表或者这些表上的其他属性被访问的概率就相对较低。
4.2 索引设计
索引就是表中数据和相应存储位置的列表,使用索引可以大大减少数据的查询时间。
对于一个确定的关系,通常在下列情况下可以考虑建立索引。
.在主键属性列和外键属性列上通常都可以分别建立索引,不仅有助于唯一性检查和完整性检查,而且可以加快连接查询的速度。
.以查询为主的关系可建立尽可能多的索引。
.对等值连接,但满足条件的元组较少的查询可以考虑建立索引。
.如果查询可以从索引直接得到结果而不必访问关系,则对此种查询可以建立索引。
该高校成绩管理系统数据库可建立以下索引:
.教师jn(教师编号jn);
.课程jn(课程编号jn);
.学生jn(学生学号jn,班级编号jn);
.班级jn(班级编号jn);
.学习jn(学号jn,课程编号jn);
4.3 分区设计
涉及到数据库文件和日志文件的分区问题。
磁盘分区设计的一般原则:
.减少访问冲突,提高I/O并发性。多个事物并发访问同一磁盘时,会产生磁盘访问冲突而导致效率低下,如果事务访问数据均能分布于不同磁盘上,则I/O可并发执行,从而提高数据库访问速度。
.分散热点数据,均衡I/O负担。在数据库中数据访问的频率是不均匀的,那些经常被访问的数据成为热点数据,此类数据宜分散存在于不同的磁盘上,以均衡各个磁盘的负荷,充分发挥多磁盘的并行操作的优势。
.保证关键数据快速访问,缓解系统瓶颈。在数据库中有些数据如数据字典等的访问频率很高,为保证对它的访问不直接影响整个系统的效率,可以将其存放在某一固定磁盘上,以保证其快速访问。
该成绩管理系统由于程序较小,所以不进行分区设计。
5、数据库实施
建立数据库D01jiangnan
![](http://images.cnitblog.com/blog/464052/201402/221639162588807.jpg)
5.1 基本表建立
(1)教师jn
SQL语句为:
CREATE TABLE 教师jn
(
教师编号jn CHAR(20) PRIMARY KEY,
教师姓名jn CHAR(10),
教师性别jn CHAR(2),
教师年龄hn INT,
职称jn CHAR(20),
联系电话jn CHAR(10),
);
SQL执行结果截图:
![](http://images.cnitblog.com/blog/464052/201402/221639167525421.jpg)
(2)专业jn
SQL语句为:
CREATE TABLE 专业jn
(
专业编号jn CHAR(20) PRIMARY KEY,
专业名称jn CHAR(20),
);
SQL执行结果截图:
![](http://images.cnitblog.com/blog/464052/201402/221639170742222.jpg)
(3)班级jn
SQL语句为:
CREATE TABLE 班级jn
(
班级编号jn CHAR(20) PRIMARY KEY,
班级名称jn CHAR(20),
专业编号jn CHAR(20)
constraint Major_Class foreign key(专业编号jn) references 专业jn
);
SQL执行结果截图:
![](http://images.cnitblog.com/blog/464052/201402/221639174274792.jpg)
(4)课程jn
SQL语句为:
CREATE TABLE 课程jn
(
课程编号jn CHAR(20) PRIMARY KEY,
课程名jn CHAR(20),
教师姓名jn CHAR(10),
学时jn INT,
考试或考查jn CHAR(4),
学分jn CHAR(4)
)
SQL执行结果截图:
![](http://images.cnitblog.com/blog/464052/201402/221639177935607.jpg)
(5)学生jn
SQL语句为:
CREATE TABLE 学生jn
(
学生学号jn CHAR(20) PRIMARY KEY,
学生姓名jn CHAR(10),
学生性别jn CHAR(2),
学生年龄jn int,
生源所在地jn char(20),
已修学分总数jn int,
班级编号jn CHAR(20)
constraint Class_Student foreign key(班级编号jn) references 班级jn
)
SQL执行结果截图:
![](http://images.cnitblog.com/blog/464052/201402/221639182372908.jpg)
(6)上课jn
SQL语句为:
CREATE TABLE 上课jn
(
教师编号jn CHAR(20) ,
班级编号jn CHAR(20) ,
PRIMARY KEY(教师编号jn,班级编号jn),
CONSTRAINT Class_Teach1 FOREIGN KEY(教师编号jn)
REFERENCES 教师jn,
CONSTRAINT Class_Teach2 FOREIGN KEY(班级编号jn)
REFERENCES 班级jn,
)
SQL执行结果截图:
![](http://images.cnitblog.com/blog/464052/201402/221639187234224.png)
(7)授课jn
SQL语句为:
CREATE TABLE 授课jn
(
教师编号jn CHAR(20) PRIMARY KEY,
课程编号jn CHAR(20),
CONSTRAINT Course_Instruct FOREIGN KEY(课程编号jn) REFERENCES 课程jn
CONSTRAINT Course_Instruct2 FOREIGN KEY(教师编号jn) REFERENCES 教师jn
)
SQL执行结果截图:
![](http://images.cnitblog.com/blog/464052/201402/221639192646324.jpg)
(8)学习jn
SQL语句为:
CREATE TABLE 学习jn
(
学生学号jn CHAR(20) ,
课程编号jn CHAR(20),
学期jn char(10),
课程名称jn char(20),
成绩jn int,
教师姓名jn char(20),
primary key(学生学号jn,课程编号jn),
CONSTRAINT Course_Study FOREIGN KEY(课程编号jn)
REFERENCES 课程jn
)
SQL执行结果截图:
![](http://images.cnitblog.com/blog/464052/201402/221639197346166.jpg)
(9)开设jn
SQL语句为:
CREATE TABLE 开设jn
(
课程编号jn CHAR(20) ,
班级编号jn char(20),
primary key(课程编号jn,班级编号jn),
CONSTRAINT Class_Setup FOREIGN KEY(班级编号jn) REFERENCES 班级jn
)
SQL执行结果截图:
![](http://images.cnitblog.com/blog/464052/201402/221639200046480.jpg)
5.2 数据输入
.班级
![](http://images.cnitblog.com/blog/464052/201402/221639203015037.jpg)
.教师
![](http://images.cnitblog.com/blog/464052/201402/221639207438109.jpg)
.开设
![](http://images.cnitblog.com/blog/464052/201402/221639211972182.jpg)
.课程
![](http://images.cnitblog.com/blog/464052/201402/221639215039738.jpg)
.上课
![](http://images.cnitblog.com/blog/464052/201402/221639217444282.jpg)
.授课
![](http://images.cnitblog.com/blog/464052/201402/221639220382839.jpg)
.学生
![](http://images.cnitblog.com/blog/464052/201402/221639224263653.jpg)
.专业
![](http://images.cnitblog.com/blog/464052/201402/221639229171740.jpg)
.学习
![](http://images.cnitblog.com/blog/464052/201402/221639233538040.jpg)
.管理员帐号
![](http://images.cnitblog.com/blog/464052/201402/221639239186911.jpg)
.教师账号
![](http://images.cnitblog.com/blog/464052/201402/221639243195969.jpg)
.学生账号
![](http://images.cnitblog.com/blog/464052/201402/221639246941014.jpg)
5.3视图的建立
(1)学生成绩统计
create view 学生成绩统计jn
as
select 学习jn.学生学号jn,学生姓名jn,学习jn.课程名称jn,
班级名称jn,学习jn.教师姓名jn,学分jn,课程jn.学期jn,成绩jn
from 学生jn, 课程jn, 班级jn,学习jn
where 学生jn.学生学号jn
= 学习jn.学生学号jn
AND 学习jn.课程编号jn
= 课程jn.课程编号jn
AND 班级jn.班级编号jn
= 学生jn.班级编号jn
![](http://images.cnitblog.com/blog/464052/201402/221639252216343.jpg)
![](http://images.cnitblog.com/blog/464052/201402/221639270148158.jpg)
(2)每门课程平均成绩统计
create view 每门课程平均成绩jn
as
select avg(成绩jn) 平均成绩jn,课程编号jn
from 学习jn
group by 课程编号jn
![](http://images.cnitblog.com/blog/464052/201402/221639275156244.jpg)
![](http://images.cnitblog.com/blog/464052/201402/221639279149600.jpg)
(3)学生所学课程及学分统计
create view 学生所学课程及学分统计jn
as
select 学生学号jn, 课程名称jn, 学分jn
from 学生成绩统计jn
![](http://images.cnitblog.com/blog/464052/201402/221639282389629.jpg)
![](http://images.cnitblog.com/blog/464052/201402/221639285212417.jpg)
(4)教师任课查询
create view 教师任课查询jn
as
select 教师jn.教师编号jn, 课程jn.教师姓名jn,
课程jn.课程编号jn, 课程名jn, 学时jn, 学分jn
from 教师jn, 课程jn,授课jn
where 授课jn.课程编号jn=课程jn.课程编号jn
and 授课jn.教师编号jn=教师jn.教师编号jn
![](http://images.cnitblog.com/blog/464052/201402/221639288226744.jpg)
![](http://images.cnitblog.com/blog/464052/201402/221639291305301.jpg)
(5)班级课程开设查询
create view 班级课程开设查询jn
as
select 班级jn.班级编号jn, 班级jn.班级名称jn,
课程jn.课程编号jn, 课程名jn, 学时jn,学分jn
from 班级jn, 课程jn,开设jn
where 班级jn.班级编号jn
= 开设jn.班级编号jn
AND 开设jn.课程编号jn
= 课程jn.课程编号jn
![](http://images.cnitblog.com/blog/464052/201402/221639294425331.jpg)
![](http://images.cnitblog.com/blog/464052/201402/221639297085645.jpg)
(6)地区学生数统计
create view 地区学生数统计jn
as
select 生源所在地jn,count(学生学号jn) 地区学生总数jn
from 学生jn
group by 生源所在地jn
![](http://images.cnitblog.com/blog/464052/201402/221639300689688.jpg)
![](http://images.cnitblog.com/blog/464052/201402/221639306496803.jpg)
5.4 索引的建立
下面根据4.2来建立索引:
教师编号jn:
create unique index UI_教师编号jn
on 教师jn(教师编号jn)
![](http://images.cnitblog.com/blog/464052/201402/221639310595861.jpg)
![](http://images.cnitblog.com/blog/464052/201402/221639316127961.jpg)
专业编号jn:
create unique index UI_专业编号jn
on 专业jn(专业编号jn)
![](http://images.cnitblog.com/blog/464052/201402/221639319066518.jpg)
![](http://images.cnitblog.com/blog/464052/201402/221639321464291.jpg)
班级编号jn,专业编号jn:
create unique index UI_班级及专业jn
on 班级jn(班级编号jn,专业编号jn)
![](http://images.cnitblog.com/blog/464052/201402/221639324993633.jpg)
![](http://images.cnitblog.com/blog/464052/201402/221639328637676.jpg)
课程编号jn:
create unique index UI_课程编号jn
on 课程jn(课程编号jn)
![](http://images.cnitblog.com/blog/464052/201402/221639332636734.jpg)
![](http://images.cnitblog.com/blog/464052/201402/221639335722062.jpg)
学生学号jn,班级编号jn:
create unique index UI_学号及班级号jn
on 学生jn(学生学号jn,班级编号jn)
![](http://images.cnitblog.com/blog/464052/201402/221639368707135.jpg)
![](http://images.cnitblog.com/blog/464052/201402/221639371281679.jpg)
学生学号jn,课程编号jn:
create unique index UI_学号及课课程号jn
on 学习jn(学生学号jn,课程编号jn)
![](http://images.cnitblog.com/blog/464052/201402/221639374229235.jpg)
![](http://images.cnitblog.com/blog/464052/201402/221639377123495.jpg)
5.5 触发器建立
(1)当删除"教师jn"中的'教师编号jn'记录时,需要相应地删除"授课jn"和"上课jn"里的"教师编号jn",所以在"教师jn"上建立触发器
sql语句:
create trigger TR_DELETE_教师编号jn
ON 教师jn
instead of delete
as
delete from 授课jn
from deleted
where 授课jn.教师编号jn
= deleted.教师编号jn
delete from 上课jn
from deleted
where 上课jn.教师编号jn
= deleted.教师编号jn
delete from 教师jn
from deleted
where 教师jn.教师编号jn=deleted.教师编号jn
sql执行结果:
![](http://images.cnitblog.com/blog/464052/201402/221639379475565.jpg)
![](http://images.cnitblog.com/blog/464052/201402/221639382337351.jpg)
(2)当更新"教师jn"中的"教师编号jn"记录时,需要相应地更新"授课jn"和"上课jn"里的"教师编号jn",所以在"教师jn"上建立触发器
sql语句为:
create trigger TR_UD_教师编号jn
ON 教师jn
for update
as
if update (教师编号jn)
begin
update 授课jn
set 教师编号jn
= Ins.教师编号jn
from deleted De,inserted Ins ,授课jn
K
where k.教师编号jn=De.教师编号jn
end
begin
update 上课jn
set 教师编号jn
= Ins.教师编号jn
from deleted De,inserted Ins ,上课jn
K
where K.教师编号jn=De.教师编号jn
end
sql语句执行结果:
![](http://images.cnitblog.com/blog/464052/201402/221639385462680.jpg)
![](http://images.cnitblog.com/blog/464052/201402/221639388214466.jpg)
5.6存储过程建立
建立一个输入成绩,自动生成其总学分的存储过程
sql语句如下:
create procedure PRO_输入成绩自动生成学分jn
@学生学号jn
char(20),
@课程编号jn
char(20),
@课程名jn
char(20),
@学期jn
char(20),
@成绩jn
int,
@教师姓名jn
char(20)
as
begin
update 学生jn
set 学生jn.已修学分总数jn
=学生jn.已修学分总数jn
+(select 学分jn
from 课程jn
where @课程编号jn=课程编号jn
)
where 学生jn.学生学号jn=@学生学号jn
end
Sql执行结果如下:
![](http://images.cnitblog.com/blog/464052/201402/221639391394496.jpg)
![](http://images.cnitblog.com/blog/464052/201402/221639394131581.jpg)
6.系统简介
1.登陆界面
![](http://images.cnitblog.com/blog/464052/201402/221639398063868.jpg)
图6.1 用户进入系统首先看到这个界面
2.登入异常
![](http://images.cnitblog.com/blog/464052/201402/221639402949480.jpg)
图6.2没有选择用户类型
![](http://images.cnitblog.com/blog/464052/201402/221639407665025.jpg)
图6.3没有填写用户名或密码
![](http://images.cnitblog.com/blog/464052/201402/221639411325840.jpg)
图6.4 数据库中不存在相应账号
3.进入学生界面
![](http://images.cnitblog.com/blog/464052/201402/221639413807910.jpg)
图6.5 首先跳出一个欢迎界面
![](http://images.cnitblog.com/blog/464052/201402/221639419508254.jpg)
图6.6 出现一个学生信息管理界面
4.学生管理-个人信息
![](http://images.cnitblog.com/blog/464052/201402/221639422921826.jpg)
图6.7 按'学生信息管理界面'上的'个人信息',出现该界面
5.学生管理-课程查询
![](http://images.cnitblog.com/blog/464052/201402/221639428028911.jpg)
图6.8 按'学生信息管理界面'上的'课程查询',出现该界面
6.学生管理-班级开课
![](http://images.cnitblog.com/blog/464052/201402/221639431729725.jpg)
图6.9 按'学生信息管理界面'上的'班级开课',出现该界面,通过选择班级编号能查询不同班开设的课程
7.学生管理-成绩查询
![](http://images.cnitblog.com/blog/464052/201402/221639435491541.jpg)
图6.10按'学生信息管理界面'上的'成绩查询',出现该界面,通过选择学年能查询不同学期课程成绩
8. 学生管理-修改密码
![](http://images.cnitblog.com/blog/464052/201402/221639439222355.jpg)
图6.11按'学生信息管理界面'上的'修改密码',出现该界面.
![](http://images.cnitblog.com/blog/464052/201402/221639445379941.jpg)
图6.12 修改密码成功
![](http://images.cnitblog.com/blog/464052/201402/221639449475770.jpg)
图6.13 修改密码失败,密码不一致
![](http://images.cnitblog.com/blog/464052/201402/221639452564328.jpg)
图6.14 修改密码失败,旧密码错误
9. 学生管理-注销
![](http://images.cnitblog.com/blog/464052/201402/221639457275643.jpg)
图6.15返回登陆界面
10.教师登陆
![](http://images.cnitblog.com/blog/464052/201402/221639464469028.jpg)
图6.16 登陆成功,出现欢迎界面
![](http://images.cnitblog.com/blog/464052/201402/221639468794857.jpg)
图6.17教师信息管理界面
11.教师管理-个人信息
![](http://images.cnitblog.com/blog/464052/201402/221639473247929.jpg)
图6.18 教师个人信息
12教师管理-任课查询
![](http://images.cnitblog.com/blog/464052/201402/221639477251217.jpg)
图6.19 通过选择不同的学年能显示教师任课信息
13.教师管理-查询自己教授不同课程的平均成绩
![](http://images.cnitblog.com/blog/464052/201402/221639480218773.jpg)
图6.20 查询自己教授不同课程的平均成绩,教师不能查询别的教师的课程平均成绩
14.教师管理-成绩排名
![](http://images.cnitblog.com/blog/464052/201402/221639483879588.jpg)
图6.21 查询自己教授不同课程的学生排名,教师不能查询别的教师的课程
15教师管理-输入学生成绩
![](http://images.cnitblog.com/blog/464052/201402/221639487508930.jpg)
图6.22 教师只能添加自己教授的课程的学生成绩
16教师管理-修改密码,注销(与学生管理相同)
17.管理员登陆
![](http://images.cnitblog.com/blog/464052/201402/221639490154946.jpg)
图6.23 出现欢迎界面
![](http://images.cnitblog.com/blog/464052/201402/221639493319273.jpg)
图6.24 出现管理员维护界面
18.管理员维护-管理教师信息
![](http://images.cnitblog.com/blog/464052/201402/221639496981089.jpg)
图6.25 支持查询所有教师,添加教师,修改教师信息,删除教师等功能.
19. 管理员维护-管理学生信息
![](http://images.cnitblog.com/blog/464052/201402/221639500246889.jpg)
图6.26 支持查询所有学生,添加学生,修改学生信息,删除学生等功能.
20. 管理员维护-生源地统计
![](http://images.cnitblog.com/blog/464052/201402/221639506425476.jpg)
图6.26 查询学生源地信息
7. 实验总结
7.1 遇到的问题和解决的办法
(1)ER图,基本表设计问题.
开始的时候什么都不懂,上课学过的东西虽然朦朦胧胧有些听懂了,不知道如何使用。开始建E-R图的时候,先建好了教师,学生,班级的属性集,但是如何将他们结合起来,却是个大问题.后来与同学交流想明白,教师负责给班级授课,一个教师课上多门课程,一个班级可以选很多课,教师给学生打分时通过课程编号,班级编号,学号来选确定。
另外加了三张表负责记录登陆时的账号和密码,为什么不把密码这一项加入学生,教师,管理员中呢?
因为个人觉得密码一项和别的信息联系很少,独立出来更易管理。但是建的基本表越多,冗余和异常就越容易出现。
(2)SQL视图设计问题。
首先,刚开始写软件是一直是直接连接基本表,以为视图不会用到。但后来要实现复杂功能时,才意识到要用视图来实现,于是后期才实现视图。
其次,我在设计基本表的时候,为了顾及信息的详细和全面,设计了12张基本表,为后面的设计带来了很大的麻烦。设计视图的时候,因为有很多信息的交叉,还有很多外键,需要很多自然连接 ,非常繁琐。
(3)触发器和存储过程设计问题。
表示触发器和存储过程上课没怎么讲,自己觉得很高深,一直不敢去动这一方面的设计。后来因为管理员删除教师时,必须要删除关联的'授课表','上课表',还有教师输入某个同学成绩时,要同时修改'学生表'中的'已修学分总数'。才开始接触这一方面。但是语法还是理解了好久。
由于前期理解问题,随便写了一个触发器,导致管理员无法正常删除教师,在同学细心指导下,重新写了一个trigger,测试通过。
触发器:触发器(trigger)是个特殊的存储过程,它的执行不是由程序调用,也不是手工启动,而是由事件来触发,比如当对一个表进行操作( insert,delete, update)时就会激活它执行。触发器经常用于加强数据的完整性约束和业务规则等。触发器可以从DBA_TRIGGERS
USER_TRIGGERS 数据字典中查到。
存储过程:存储过程(Stored Procedure)是一组为了完成特定功能的SQL语句集,是利用SQL
Server所提供的Transact-SQL语言所编写的程序。经编译后存储在数据库中。存储过程是数据库中的一个重要对象,用户通过指定存储过程的名字并给出参数(如果该存储过程带有参数)来执行它。存储过程是由流控制和SQL语句书写的过程,这个过程经编译和优化后存储在数据库服务器中,存储过程可由应用程序通过一个调用来执行,而且允许用户声明变量。同时,存储过程可以接收和输出参数、返回执行存储过程的状态值,也可以嵌套调用。
(4)用NETBENS设计软件。
其实刚开始比较偏爱Eclipse,因为它挑错能力很强,还可以利用快捷键实现代码自动生成。选择NETBEANS是因为同学推荐,支持可视界面设计,自动生成相应代码.显然相比于用代码将组件一个一个的add进panel,这会大大缩短设计时间,但是这些auto-generated-code,冗余度很大,举个例子 javax.swing.JButton;java.awt.event.ActionListener.而这些自动生成的代码不允许用户修改。由于很纠结这一点,于是把代码复制到Eclipse下,自己手动修改这些代码,但是很烦,每改一次界面设计,NetBeans就会重构代码,意味着前面白改了,后来就放弃这种吃力的方法。
虽然不需要敲很多代码,但是为了让界面布局合理花了好多时间去调组件参数,有时候修改一个组件的参数,相邻的组件都会改变,很复杂。
实现对jButton,jComboBox的事件监听很方便,只要求把逻辑调对就可以了。
(5)数据库与NetBeans连接问题.
其实前期一直以为连接数据库很烦,后来在同学指导下学会如何接.Netbeans
对数据库支持很好,在netbeans的IDE可以像SQL Server一样登陆数据库D01jiangnan,查看基本表,视图,能实现select,update,delete语句.还有需要配置软件编译时的库文件,必须要把sqljdbc4.jar放到编译库中去(sql server 2008及以上用 sqljdbc.jar文件,sql server 2005 要用sqljdbc,jar).还有连接数据库有两种方式:jdbc或者jtds.
(6)sql语句撰写问题。
在调试软件的时候,很多时候都是sql语句写错了,但因为sql类型是String,编译时查不出来,需要运行相关代码时才会报错。
(7)体会
通过这次大型实验,真的让我学到了很多东西。以前上课时感觉都听懂的东西,放到实践中来一用,发现都不会,还得细细得找资料、问问题。在大型实验不断进行下去的途中,发现自己在每天学习着新的知识,这样的感觉很好。我发现人的求知欲一旦被激发,就会使人有源源不断的动力去做成这件事情。当然,在大型试验进行中也遇到了各种各样的问题,做事情一定要保持耐心,特别像做科研搞项目的,可能一开始拿到手的东西是你根本无法去下手的,但是你一步步的做下去,会发现其实还是可以步步跟进的,而且在层层推进的过程中,你会体验到成功的快乐。
7.2 系统设计的不足
(1)数据库中数据量太少。
在进行数据设计的时候,只考虑了几个最简单的数据输入,可能只能用于应付作业,并不能用于实际。
(2)界面比较丑,对于netbean使用比较生疏.而且逻辑上存在问题,修改比较繁琐.
姓名: | 姜楠 |
专业: | 计自1101班 |
学号: | 201126100207 |
学院: | 计算机学院 |
提交时间: | 2013年7月11日 |
高校成绩管理数据库系统的设计与实现
1、需求分析
计算机已经深入到日常工作和生活的方方面面,成为我们学习和工作的得力助手,比如文字处理、信息管理、辅助设计、图形图像处理、教育培训以及游戏娱乐等。随着越来越多的应用软件出现,人们对它的要求也越来越高;虽然现在世界上的各种软件层出不穷,但它们依然不能满足用户的各种特殊需要,所以人们仍是不得不开发适合特殊需求的软件。高校成绩管理系统记录了一个大学生成绩的系统,它的出现使得查询、更新、插入简单化,高效化,成本也随之大大减少。使用计算机对成绩信息的管理,具有手工管理所
无法比拟的优点:信息存储及时,检索迅速、查找方便、可靠性高、存储量大、保密性好、寿命长、成本低等。这些优点能够极大地提高学 生成绩管理的效率,也是高校成绩正规化管理的重要途径。
本软件控件均以中文形式表示,对普通程序使用者的查询提供简单方便的快捷操作,不需要技术含量。
以SQL SERVER数据库管理系统为平台,通过设计数据库概念模型、逻辑模型以及利用标准SQL语言的数据库实现,掌握关系数据库系统的设计与实现方法,增强数据库设计和数据库应用系统开发能力。
操作人员与维护人员应懂的SQL语言。
运行环境:
硬件环境:LENOVO-G470
软件环境:1.Windows 8企业版
2.Microsoft SQL Server 2012 Ultimate
3.NETBEANS 7.3
1.1 数据需求描述
![](http://images.cnitblog.com/blog/464052/201402/221639083284215.png)
1.2 系统功能需求
.管理员
(1).添加教师名单;
(2).查询教师名单;
(3).修改教师信息;
(4).删除教师名单;
(5).添加学生名单;
(6).查询学生名单;
(7).修改学生信息;
(8).删除学生名单;
(9).统计生源地信息;
(10).修改密码;
.教师
(1).查看个人信息;
(2).查看每门课程平均成绩统计;
(3).输入学生成绩, 自动生成该学生已修总学分;
(4).查看任课信息;
(5).查看学生成绩名次;
(6).修改密码;
.学生
(1).查看个人信息;
(2).查看自己的课表;
(3).查看不同班级的开课情况;
(4).查询考试成绩;
(5).修改密码;
1.3 其他性能需求
(1).用户输入出错时,有错误提示。
(2).给管理员,教师,学生不同的权限,提高数据安全性;
(3).创建触发器,存储过程,防止数据不一致;
![](http://images.cnitblog.com/blog/464052/201402/221639096804431.png)
2、概念结构设计
![](http://images.cnitblog.com/blog/464052/201402/221639110243174.png)
3、逻辑结构设计
.教师jn(教师编号jn、教师姓名jn、教师性别jn、教师年龄jn、职称jn、联系电话jn)
.上课jn(教师编号jn,班级编号jn)[班级编号jn]
.授课jn(教师编号jn,课程编号jn)
.课程jn(课程编号jn、课程名称jn、教师姓名jn、学期jn、学时jn、考试或考查jn、学分jn)
.学习jn(学号jn,课程编号jn,学期jn,课程名称jn,成绩jn,教师姓名jn)[课程编号jn]
.学生jn(学号jn、学生姓名jn、学生性别jn、学生年龄jn、生源所在地jn、已修学分总数jn,班级编号jn)
.开设jn(课程编号jn,班级编号jn)[课程编号jn,班级编号jn]
.班级jn(班级编号jn,班级名称jn,专业编号jn)
.专业jn(专业编号jn,专业名称jn)
.学生账号jn(学生编号jn,学生密码jn)[学生编号jn]
.教师账号jn(教师编号jn, 教师密码jn)[ 教师编号jn]
.管理员账号jn(管理员编号jn, 管理员密码jn)[ 管理员编号jn]
3.2 数据类型定义
(1).教师jn
数据项名 | 数据类型 | 长度 | 完整性约束 | 备注 |
教师编号jn | char | 20 | 主键,唯一,非空 | |
教师姓名jn | char | 20 | ||
教师性别jn | char | 2 | ||
教师年龄jn | char | 20 | ||
职称jn | char | 10 | ||
联系电话jn | char | 20 |
数据项名 | 数据类型 | 长度 | 完整性约束 | 备注 |
教师编号jn | char | 20 | 主键,唯一,非空,外键 | 教师编号,班级编号都是外键 |
班级编号jn | char | 20 | 外键 |
数据项名 | 数据类型 | 长度 | 完整性约束 | 备注 |
教师编号jn | char | 20 | 主键,唯一,非空 | 教师编号 |
课程编号jn | char | 20 | 外键 | 课程编号 |
数据项名 | 数据类型 | 长度 | 完整性约束 | 备注 |
课程编号jn | char | 20 | 主键,唯一,非空 | |
课程名jn | char | 20 | ||
教师姓名jn | char | 20 | ||
开课时间jn | char | 20 | ||
学时jn | int | 10 | >0 | |
考试或考查jn | char | 4 | ||
学分jn | int | 4 | >0 |
数据项名 | 数据类型 | 长度 | 完整性约束 | 备注 |
学生学号jn | char | 20 | 主键,唯一,非空 | 放入教师姓名为了减少与教师表格的自然连接 |
课程编号jn | char | 20 | 外键 | |
学期jn | char | 10 | ||
课程名称jn | char | 20 | ||
成绩jn | int | 10 | ||
教师姓名 | char | 20 |
数据项名 | 数据类型 | 长度 | 完整性约束 | 备注 |
学生学号jn | char | 12 | 主键,唯一,非空 | 已修学分总数用触发器实现自动统计功能 |
学生姓名jn | char | 10 | ||
学生性别jn | char | 2 | ||
学生年龄jn | int | 4 | ||
生源所在地jn | char | 20 | ||
已修学分总数jn | int | 4 | ||
班级编号jn | char | 10 | 外键 |
数据项名 | 数据类型 | 长度 | 完整性约束 | 备注 |
课程编号jn | char | 20 | 联合主键,唯一,非空 | |
班级编号jn | char | 20 |
数据项名 | 数据类型 | 长度 | 完整性约束 | 备注 |
班级编号jn | char | 20 | 主键,唯一,非空 | |
班级名称jn | char | 20 | ||
专业编号jn | char | 20 | 外键 |
数据项名 | 数据类型 | 长度 | 完整性约束 | 备注 |
专业编号jn | char | 20 | 主键,唯一,非空 | |
专业名称jn | char | 20 |
数据项名 | 数据类型 | 长度 | 完整性约束 | 备注 |
学生编号jn | char | 20 | 主键,唯一,非空 | |
学生密码jn | char | 20 |
数据项名 | 数据类型 | 长度 | 完整性约束 | 备注 |
教师编号jn | char | 20 | 主键,唯一,非空 | |
教师密码jn | char | 20 |
数据项名 | 数据类型 | 长度 | 完整性约束 | 备注 |
管理员编号jn | char | 20 | 主键,唯一,非空 | |
管理员密码jn | char | 20 |
对关系模式进行规范化处理,对关系模式进行评价与修正。
4、物理结构设计
4.1 聚簇设计
该高校成绩管理系统数据库可建立聚簇:
.教师jn(教师编号jn);
![](http://images.cnitblog.com/blog/464052/201402/221639147862320.jpg)
.课程jn(课程编号jn);
![](http://images.cnitblog.com/blog/464052/201402/221639150315863.jpg)
.学生jn(学生学号jn,班级编号jn);
![](http://images.cnitblog.com/blog/464052/201402/221639154531692.jpg)
.jn(班级编号jn);
![](http://images.cnitblog.com/blog/464052/201402/221639157974263.jpg)
这几个聚簇设计是因为这几张表都是实体表,,且聚簇中的属性都是主键或是外键,被访问的概率很高,而其他表或者这些表上的其他属性被访问的概率就相对较低。
4.2 索引设计
索引就是表中数据和相应存储位置的列表,使用索引可以大大减少数据的查询时间。
对于一个确定的关系,通常在下列情况下可以考虑建立索引。
.在主键属性列和外键属性列上通常都可以分别建立索引,不仅有助于唯一性检查和完整性检查,而且可以加快连接查询的速度。
.以查询为主的关系可建立尽可能多的索引。
.对等值连接,但满足条件的元组较少的查询可以考虑建立索引。
.如果查询可以从索引直接得到结果而不必访问关系,则对此种查询可以建立索引。
该高校成绩管理系统数据库可建立以下索引:
.教师jn(教师编号jn);
.课程jn(课程编号jn);
.学生jn(学生学号jn,班级编号jn);
.班级jn(班级编号jn);
.学习jn(学号jn,课程编号jn);
4.3 分区设计
涉及到数据库文件和日志文件的分区问题。
磁盘分区设计的一般原则:
.减少访问冲突,提高I/O并发性。多个事物并发访问同一磁盘时,会产生磁盘访问冲突而导致效率低下,如果事务访问数据均能分布于不同磁盘上,则I/O可并发执行,从而提高数据库访问速度。
.分散热点数据,均衡I/O负担。在数据库中数据访问的频率是不均匀的,那些经常被访问的数据成为热点数据,此类数据宜分散存在于不同的磁盘上,以均衡各个磁盘的负荷,充分发挥多磁盘的并行操作的优势。
.保证关键数据快速访问,缓解系统瓶颈。在数据库中有些数据如数据字典等的访问频率很高,为保证对它的访问不直接影响整个系统的效率,可以将其存放在某一固定磁盘上,以保证其快速访问。
该成绩管理系统由于程序较小,所以不进行分区设计。
5、数据库实施
建立数据库D01jiangnan
![](http://images.cnitblog.com/blog/464052/201402/221639162588807.jpg)
5.1 基本表建立
(1)教师jn
SQL语句为:
CREATE TABLE 教师jn
(
教师编号jn CHAR(20) PRIMARY KEY,
教师姓名jn CHAR(10),
教师性别jn CHAR(2),
教师年龄hn INT,
职称jn CHAR(20),
联系电话jn CHAR(10),
);
SQL执行结果截图:
![](http://images.cnitblog.com/blog/464052/201402/221639167525421.jpg)
(2)专业jn
SQL语句为:
CREATE TABLE 专业jn
(
专业编号jn CHAR(20) PRIMARY KEY,
专业名称jn CHAR(20),
);
SQL执行结果截图:
![](http://images.cnitblog.com/blog/464052/201402/221639170742222.jpg)
(3)班级jn
SQL语句为:
CREATE TABLE 班级jn
(
班级编号jn CHAR(20) PRIMARY KEY,
班级名称jn CHAR(20),
专业编号jn CHAR(20)
constraint Major_Class foreign key(专业编号jn) references 专业jn
);
SQL执行结果截图:
![](http://images.cnitblog.com/blog/464052/201402/221639174274792.jpg)
(4)课程jn
SQL语句为:
CREATE TABLE 课程jn
(
课程编号jn CHAR(20) PRIMARY KEY,
课程名jn CHAR(20),
教师姓名jn CHAR(10),
学时jn INT,
考试或考查jn CHAR(4),
学分jn CHAR(4)
)
SQL执行结果截图:
![](http://images.cnitblog.com/blog/464052/201402/221639177935607.jpg)
(5)学生jn
SQL语句为:
CREATE TABLE 学生jn
(
学生学号jn CHAR(20) PRIMARY KEY,
学生姓名jn CHAR(10),
学生性别jn CHAR(2),
学生年龄jn int,
生源所在地jn char(20),
已修学分总数jn int,
班级编号jn CHAR(20)
constraint Class_Student foreign key(班级编号jn) references 班级jn
)
SQL执行结果截图:
![](http://images.cnitblog.com/blog/464052/201402/221639182372908.jpg)
(6)上课jn
SQL语句为:
CREATE TABLE 上课jn
(
教师编号jn CHAR(20) ,
班级编号jn CHAR(20) ,
PRIMARY KEY(教师编号jn,班级编号jn),
CONSTRAINT Class_Teach1 FOREIGN KEY(教师编号jn)
REFERENCES 教师jn,
CONSTRAINT Class_Teach2 FOREIGN KEY(班级编号jn)
REFERENCES 班级jn,
)
SQL执行结果截图:
![](http://images.cnitblog.com/blog/464052/201402/221639187234224.png)
(7)授课jn
SQL语句为:
CREATE TABLE 授课jn
(
教师编号jn CHAR(20) PRIMARY KEY,
课程编号jn CHAR(20),
CONSTRAINT Course_Instruct FOREIGN KEY(课程编号jn) REFERENCES 课程jn
CONSTRAINT Course_Instruct2 FOREIGN KEY(教师编号jn) REFERENCES 教师jn
)
SQL执行结果截图:
![](http://images.cnitblog.com/blog/464052/201402/221639192646324.jpg)
(8)学习jn
SQL语句为:
CREATE TABLE 学习jn
(
学生学号jn CHAR(20) ,
课程编号jn CHAR(20),
学期jn char(10),
课程名称jn char(20),
成绩jn int,
教师姓名jn char(20),
primary key(学生学号jn,课程编号jn),
CONSTRAINT Course_Study FOREIGN KEY(课程编号jn)
REFERENCES 课程jn
)
SQL执行结果截图:
![](http://images.cnitblog.com/blog/464052/201402/221639197346166.jpg)
(9)开设jn
SQL语句为:
CREATE TABLE 开设jn
(
课程编号jn CHAR(20) ,
班级编号jn char(20),
primary key(课程编号jn,班级编号jn),
CONSTRAINT Class_Setup FOREIGN KEY(班级编号jn) REFERENCES 班级jn
)
SQL执行结果截图:
![](http://images.cnitblog.com/blog/464052/201402/221639200046480.jpg)
5.2 数据输入
.班级
![](http://images.cnitblog.com/blog/464052/201402/221639203015037.jpg)
.教师
![](http://images.cnitblog.com/blog/464052/201402/221639207438109.jpg)
.开设
![](http://images.cnitblog.com/blog/464052/201402/221639211972182.jpg)
.课程
![](http://images.cnitblog.com/blog/464052/201402/221639215039738.jpg)
.上课
![](http://images.cnitblog.com/blog/464052/201402/221639217444282.jpg)
.授课
![](http://images.cnitblog.com/blog/464052/201402/221639220382839.jpg)
.学生
![](http://images.cnitblog.com/blog/464052/201402/221639224263653.jpg)
.专业
![](http://images.cnitblog.com/blog/464052/201402/221639229171740.jpg)
.学习
![](http://images.cnitblog.com/blog/464052/201402/221639233538040.jpg)
.管理员帐号
![](http://images.cnitblog.com/blog/464052/201402/221639239186911.jpg)
.教师账号
![](http://images.cnitblog.com/blog/464052/201402/221639243195969.jpg)
.学生账号
![](http://images.cnitblog.com/blog/464052/201402/221639246941014.jpg)
5.3视图的建立
(1)学生成绩统计
create view 学生成绩统计jn
as
select 学习jn.学生学号jn,学生姓名jn,学习jn.课程名称jn,
班级名称jn,学习jn.教师姓名jn,学分jn,课程jn.学期jn,成绩jn
from 学生jn, 课程jn, 班级jn,学习jn
where 学生jn.学生学号jn
= 学习jn.学生学号jn
AND 学习jn.课程编号jn
= 课程jn.课程编号jn
AND 班级jn.班级编号jn
= 学生jn.班级编号jn
![](http://images.cnitblog.com/blog/464052/201402/221639252216343.jpg)
![](http://images.cnitblog.com/blog/464052/201402/221639270148158.jpg)
(2)每门课程平均成绩统计
create view 每门课程平均成绩jn
as
select avg(成绩jn) 平均成绩jn,课程编号jn
from 学习jn
group by 课程编号jn
![](http://images.cnitblog.com/blog/464052/201402/221639275156244.jpg)
![](http://images.cnitblog.com/blog/464052/201402/221639279149600.jpg)
(3)学生所学课程及学分统计
create view 学生所学课程及学分统计jn
as
select 学生学号jn, 课程名称jn, 学分jn
from 学生成绩统计jn
![](http://images.cnitblog.com/blog/464052/201402/221639282389629.jpg)
![](http://images.cnitblog.com/blog/464052/201402/221639285212417.jpg)
(4)教师任课查询
create view 教师任课查询jn
as
select 教师jn.教师编号jn, 课程jn.教师姓名jn,
课程jn.课程编号jn, 课程名jn, 学时jn, 学分jn
from 教师jn, 课程jn,授课jn
where 授课jn.课程编号jn=课程jn.课程编号jn
and 授课jn.教师编号jn=教师jn.教师编号jn
![](http://images.cnitblog.com/blog/464052/201402/221639288226744.jpg)
![](http://images.cnitblog.com/blog/464052/201402/221639291305301.jpg)
(5)班级课程开设查询
create view 班级课程开设查询jn
as
select 班级jn.班级编号jn, 班级jn.班级名称jn,
课程jn.课程编号jn, 课程名jn, 学时jn,学分jn
from 班级jn, 课程jn,开设jn
where 班级jn.班级编号jn
= 开设jn.班级编号jn
AND 开设jn.课程编号jn
= 课程jn.课程编号jn
![](http://images.cnitblog.com/blog/464052/201402/221639294425331.jpg)
![](http://images.cnitblog.com/blog/464052/201402/221639297085645.jpg)
(6)地区学生数统计
create view 地区学生数统计jn
as
select 生源所在地jn,count(学生学号jn) 地区学生总数jn
from 学生jn
group by 生源所在地jn
![](http://images.cnitblog.com/blog/464052/201402/221639300689688.jpg)
![](http://images.cnitblog.com/blog/464052/201402/221639306496803.jpg)
5.4 索引的建立
下面根据4.2来建立索引:
教师编号jn:
create unique index UI_教师编号jn
on 教师jn(教师编号jn)
![](http://images.cnitblog.com/blog/464052/201402/221639310595861.jpg)
![](http://images.cnitblog.com/blog/464052/201402/221639316127961.jpg)
专业编号jn:
create unique index UI_专业编号jn
on 专业jn(专业编号jn)
![](http://images.cnitblog.com/blog/464052/201402/221639319066518.jpg)
![](http://images.cnitblog.com/blog/464052/201402/221639321464291.jpg)
班级编号jn,专业编号jn:
create unique index UI_班级及专业jn
on 班级jn(班级编号jn,专业编号jn)
![](http://images.cnitblog.com/blog/464052/201402/221639324993633.jpg)
![](http://images.cnitblog.com/blog/464052/201402/221639328637676.jpg)
课程编号jn:
create unique index UI_课程编号jn
on 课程jn(课程编号jn)
![](http://images.cnitblog.com/blog/464052/201402/221639332636734.jpg)
![](http://images.cnitblog.com/blog/464052/201402/221639335722062.jpg)
学生学号jn,班级编号jn:
create unique index UI_学号及班级号jn
on 学生jn(学生学号jn,班级编号jn)
![](http://images.cnitblog.com/blog/464052/201402/221639368707135.jpg)
![](http://images.cnitblog.com/blog/464052/201402/221639371281679.jpg)
学生学号jn,课程编号jn:
create unique index UI_学号及课课程号jn
on 学习jn(学生学号jn,课程编号jn)
![](http://images.cnitblog.com/blog/464052/201402/221639374229235.jpg)
![](http://images.cnitblog.com/blog/464052/201402/221639377123495.jpg)
5.5 触发器建立
(1)当删除"教师jn"中的'教师编号jn'记录时,需要相应地删除"授课jn"和"上课jn"里的"教师编号jn",所以在"教师jn"上建立触发器
sql语句:
create trigger TR_DELETE_教师编号jn
ON 教师jn
instead of delete
as
delete from 授课jn
from deleted
where 授课jn.教师编号jn
= deleted.教师编号jn
delete from 上课jn
from deleted
where 上课jn.教师编号jn
= deleted.教师编号jn
delete from 教师jn
from deleted
where 教师jn.教师编号jn=deleted.教师编号jn
sql执行结果:
![](http://images.cnitblog.com/blog/464052/201402/221639379475565.jpg)
![](http://images.cnitblog.com/blog/464052/201402/221639382337351.jpg)
(2)当更新"教师jn"中的"教师编号jn"记录时,需要相应地更新"授课jn"和"上课jn"里的"教师编号jn",所以在"教师jn"上建立触发器
sql语句为:
create trigger TR_UD_教师编号jn
ON 教师jn
for update
as
if update (教师编号jn)
begin
update 授课jn
set 教师编号jn
= Ins.教师编号jn
from deleted De,inserted Ins ,授课jn
K
where k.教师编号jn=De.教师编号jn
end
begin
update 上课jn
set 教师编号jn
= Ins.教师编号jn
from deleted De,inserted Ins ,上课jn
K
where K.教师编号jn=De.教师编号jn
end
sql语句执行结果:
![](http://images.cnitblog.com/blog/464052/201402/221639385462680.jpg)
![](http://images.cnitblog.com/blog/464052/201402/221639388214466.jpg)
5.6存储过程建立
建立一个输入成绩,自动生成其总学分的存储过程
sql语句如下:
create procedure PRO_输入成绩自动生成学分jn
@学生学号jn
char(20),
@课程编号jn
char(20),
@课程名jn
char(20),
@学期jn
char(20),
@成绩jn
int,
@教师姓名jn
char(20)
as
begin
update 学生jn
set 学生jn.已修学分总数jn
=学生jn.已修学分总数jn
+(select 学分jn
from 课程jn
where @课程编号jn=课程编号jn
)
where 学生jn.学生学号jn=@学生学号jn
end
Sql执行结果如下:
![](http://images.cnitblog.com/blog/464052/201402/221639391394496.jpg)
![](http://images.cnitblog.com/blog/464052/201402/221639394131581.jpg)
6.系统简介
1.登陆界面
![](http://images.cnitblog.com/blog/464052/201402/221639398063868.jpg)
图6.1 用户进入系统首先看到这个界面
2.登入异常
![](http://images.cnitblog.com/blog/464052/201402/221639402949480.jpg)
图6.2没有选择用户类型
![](http://images.cnitblog.com/blog/464052/201402/221639407665025.jpg)
图6.3没有填写用户名或密码
![](http://images.cnitblog.com/blog/464052/201402/221639411325840.jpg)
图6.4 数据库中不存在相应账号
3.进入学生界面
![](http://images.cnitblog.com/blog/464052/201402/221639413807910.jpg)
图6.5 首先跳出一个欢迎界面
![](http://images.cnitblog.com/blog/464052/201402/221639419508254.jpg)
图6.6 出现一个学生信息管理界面
4.学生管理-个人信息
![](http://images.cnitblog.com/blog/464052/201402/221639422921826.jpg)
图6.7 按'学生信息管理界面'上的'个人信息',出现该界面
5.学生管理-课程查询
![](http://images.cnitblog.com/blog/464052/201402/221639428028911.jpg)
图6.8 按'学生信息管理界面'上的'课程查询',出现该界面
6.学生管理-班级开课
![](http://images.cnitblog.com/blog/464052/201402/221639431729725.jpg)
图6.9 按'学生信息管理界面'上的'班级开课',出现该界面,通过选择班级编号能查询不同班开设的课程
7.学生管理-成绩查询
![](http://images.cnitblog.com/blog/464052/201402/221639435491541.jpg)
图6.10按'学生信息管理界面'上的'成绩查询',出现该界面,通过选择学年能查询不同学期课程成绩
8. 学生管理-修改密码
![](http://images.cnitblog.com/blog/464052/201402/221639439222355.jpg)
图6.11按'学生信息管理界面'上的'修改密码',出现该界面.
![](http://images.cnitblog.com/blog/464052/201402/221639445379941.jpg)
图6.12 修改密码成功
![](http://images.cnitblog.com/blog/464052/201402/221639449475770.jpg)
图6.13 修改密码失败,密码不一致
![](http://images.cnitblog.com/blog/464052/201402/221639452564328.jpg)
图6.14 修改密码失败,旧密码错误
9. 学生管理-注销
![](http://images.cnitblog.com/blog/464052/201402/221639457275643.jpg)
图6.15返回登陆界面
10.教师登陆
![](http://images.cnitblog.com/blog/464052/201402/221639464469028.jpg)
图6.16 登陆成功,出现欢迎界面
![](http://images.cnitblog.com/blog/464052/201402/221639468794857.jpg)
图6.17教师信息管理界面
11.教师管理-个人信息
![](http://images.cnitblog.com/blog/464052/201402/221639473247929.jpg)
图6.18 教师个人信息
12教师管理-任课查询
![](http://images.cnitblog.com/blog/464052/201402/221639477251217.jpg)
图6.19 通过选择不同的学年能显示教师任课信息
13.教师管理-查询自己教授不同课程的平均成绩
![](http://images.cnitblog.com/blog/464052/201402/221639480218773.jpg)
图6.20 查询自己教授不同课程的平均成绩,教师不能查询别的教师的课程平均成绩
14.教师管理-成绩排名
![](http://images.cnitblog.com/blog/464052/201402/221639483879588.jpg)
图6.21 查询自己教授不同课程的学生排名,教师不能查询别的教师的课程
15教师管理-输入学生成绩
![](http://images.cnitblog.com/blog/464052/201402/221639487508930.jpg)
图6.22 教师只能添加自己教授的课程的学生成绩
16教师管理-修改密码,注销(与学生管理相同)
17.管理员登陆
![](http://images.cnitblog.com/blog/464052/201402/221639490154946.jpg)
图6.23 出现欢迎界面
![](http://images.cnitblog.com/blog/464052/201402/221639493319273.jpg)
图6.24 出现管理员维护界面
18.管理员维护-管理教师信息
![](http://images.cnitblog.com/blog/464052/201402/221639496981089.jpg)
图6.25 支持查询所有教师,添加教师,修改教师信息,删除教师等功能.
19. 管理员维护-管理学生信息
![](http://images.cnitblog.com/blog/464052/201402/221639500246889.jpg)
图6.26 支持查询所有学生,添加学生,修改学生信息,删除学生等功能.
20. 管理员维护-生源地统计
![](http://images.cnitblog.com/blog/464052/201402/221639506425476.jpg)
图6.26 查询学生源地信息
7. 实验总结
7.1 遇到的问题和解决的办法
(1)ER图,基本表设计问题.
开始的时候什么都不懂,上课学过的东西虽然朦朦胧胧有些听懂了,不知道如何使用。开始建E-R图的时候,先建好了教师,学生,班级的属性集,但是如何将他们结合起来,却是个大问题.后来与同学交流想明白,教师负责给班级授课,一个教师课上多门课程,一个班级可以选很多课,教师给学生打分时通过课程编号,班级编号,学号来选确定。
另外加了三张表负责记录登陆时的账号和密码,为什么不把密码这一项加入学生,教师,管理员中呢?
因为个人觉得密码一项和别的信息联系很少,独立出来更易管理。但是建的基本表越多,冗余和异常就越容易出现。
(2)SQL视图设计问题。
首先,刚开始写软件是一直是直接连接基本表,以为视图不会用到。但后来要实现复杂功能时,才意识到要用视图来实现,于是后期才实现视图。
其次,我在设计基本表的时候,为了顾及信息的详细和全面,设计了12张基本表,为后面的设计带来了很大的麻烦。设计视图的时候,因为有很多信息的交叉,还有很多外键,需要很多自然连接 ,非常繁琐。
(3)触发器和存储过程设计问题。
表示触发器和存储过程上课没怎么讲,自己觉得很高深,一直不敢去动这一方面的设计。后来因为管理员删除教师时,必须要删除关联的'授课表','上课表',还有教师输入某个同学成绩时,要同时修改'学生表'中的'已修学分总数'。才开始接触这一方面。但是语法还是理解了好久。
由于前期理解问题,随便写了一个触发器,导致管理员无法正常删除教师,在同学细心指导下,重新写了一个trigger,测试通过。
触发器:触发器(trigger)是个特殊的存储过程,它的执行不是由程序调用,也不是手工启动,而是由事件来触发,比如当对一个表进行操作( insert,delete, update)时就会激活它执行。触发器经常用于加强数据的完整性约束和业务规则等。触发器可以从DBA_TRIGGERS
USER_TRIGGERS 数据字典中查到。
存储过程:存储过程(Stored Procedure)是一组为了完成特定功能的SQL语句集,是利用SQL
Server所提供的Transact-SQL语言所编写的程序。经编译后存储在数据库中。存储过程是数据库中的一个重要对象,用户通过指定存储过程的名字并给出参数(如果该存储过程带有参数)来执行它。存储过程是由流控制和SQL语句书写的过程,这个过程经编译和优化后存储在数据库服务器中,存储过程可由应用程序通过一个调用来执行,而且允许用户声明变量。同时,存储过程可以接收和输出参数、返回执行存储过程的状态值,也可以嵌套调用。
(4)用NETBENS设计软件。
其实刚开始比较偏爱Eclipse,因为它挑错能力很强,还可以利用快捷键实现代码自动生成。选择NETBEANS是因为同学推荐,支持可视界面设计,自动生成相应代码.显然相比于用代码将组件一个一个的add进panel,这会大大缩短设计时间,但是这些auto-generated-code,冗余度很大,举个例子 javax.swing.JButton;java.awt.event.ActionListener.而这些自动生成的代码不允许用户修改。由于很纠结这一点,于是把代码复制到Eclipse下,自己手动修改这些代码,但是很烦,每改一次界面设计,NetBeans就会重构代码,意味着前面白改了,后来就放弃这种吃力的方法。
虽然不需要敲很多代码,但是为了让界面布局合理花了好多时间去调组件参数,有时候修改一个组件的参数,相邻的组件都会改变,很复杂。
实现对jButton,jComboBox的事件监听很方便,只要求把逻辑调对就可以了。
(5)数据库与NetBeans连接问题.
其实前期一直以为连接数据库很烦,后来在同学指导下学会如何接.Netbeans
对数据库支持很好,在netbeans的IDE可以像SQL Server一样登陆数据库D01jiangnan,查看基本表,视图,能实现select,update,delete语句.还有需要配置软件编译时的库文件,必须要把sqljdbc4.jar放到编译库中去(sql server 2008及以上用 sqljdbc.jar文件,sql server 2005 要用sqljdbc,jar).还有连接数据库有两种方式:jdbc或者jtds.
(6)sql语句撰写问题。
在调试软件的时候,很多时候都是sql语句写错了,但因为sql类型是String,编译时查不出来,需要运行相关代码时才会报错。
(7)体会
通过这次大型实验,真的让我学到了很多东西。以前上课时感觉都听懂的东西,放到实践中来一用,发现都不会,还得细细得找资料、问问题。在大型实验不断进行下去的途中,发现自己在每天学习着新的知识,这样的感觉很好。我发现人的求知欲一旦被激发,就会使人有源源不断的动力去做成这件事情。当然,在大型试验进行中也遇到了各种各样的问题,做事情一定要保持耐心,特别像做科研搞项目的,可能一开始拿到手的东西是你根本无法去下手的,但是你一步步的做下去,会发现其实还是可以步步跟进的,而且在层层推进的过程中,你会体验到成功的快乐。
7.2 系统设计的不足
(1)数据库中数据量太少。
在进行数据设计的时候,只考虑了几个最简单的数据输入,可能只能用于应付作业,并不能用于实际。
(2)界面比较丑,对于netbean使用比较生疏.而且逻辑上存在问题,修改比较繁琐.
相关文章推荐
- 分布式在线数据库学习 && 资料汇总
- Mysql双主复制
- mysql timestamp格式
- Oracle逻辑存储结构1—概述
- MySQL常用技巧
- Mysql主从复制
- MYSQL中插入数据时出现的问题:
- Oracle优化:大量数据插入或更新
- MySQL同步故障:" Slave_SQL_Running:No"
- oracle表连接——处理连接过程中另外一张表没有相关数据不显示问题
- oracle的正则表达式
- 小贝_redis 高级应用-持久化
- sql server中如何实现split功能
- mysql 时间类型 timestamp和datetime
- mongodb的高级查询
- 没有SQL Server数据库时如何打开.MDF文件
- Oracle常用函数
- SQL数据库的基本操作
- ORACLE常用数值函数、转换函数、字符串函数
- oracle存储过程常用技巧