
顾宏
一.需求分析
学生信息管理系统是一个教育单位不可缺少的部分,它的内容对于学校的决策者和管理者来说都至关重要,所以学生信息管理系统应该能够为用户提供充足的信息和快捷的查询手段。但一直以来人们使用传统人工的方式管理文件档案,这种管理方式存在着许多缺点,如:效率低、保密性差,另外时间一长,将产生大量的文件和数据,这对于查找、更新和维护都带来了不少的困难。
随着科学技术的不断提高,计算机科学日渐成熟,其强大的功能已为人们深刻认识,它已进入人类社会的各个领域并发挥着越来越重要的作用。
作为计算机应用的一部分,使用计算机对学生信息进行管理,具有手工管理所无法比拟的优点.例如:检索迅速、查找方便、可靠性高、存储量大、保密性好、寿命长、成本低等。这些优点能够极大地提高学生信息管理的效率.
二.概念设计(E-R图)(表设计)
用sql-server绘制数据库模型关系图:
三.规范化设计
⑴student表结构
| 字段 | 数据类型 | 长度 | 是否允许空值 | 备注 |
| 学号gh_st_id | Char | 10 | 否 | 主键 |
| 姓gh_st_fname | Char | 10 | 否 | |
| 名gh_st_lname | Char | 10 | 否 | |
| 性别gh_st_sex | Char | 5 | 是 | 男或女 |
| 地址gh_st_addr | Char | 100 | 是 | |
| 班级gh_st_class | Char | 30 | 是 | |
| 专业gh_st_sp | Char | 30 | 是 | |
| 邮箱gh_st_mail | Char | 10 | 是 | |
| 电话gh_st_phone | Char | 15 | 是 | |
| 备注gh_st_desc | Text | 是 |
| 字段 | 数据类型 | 长度 | 是否允许空值 | 备注 |
| 课程号gh_co_id | Char | 10 | 否 | 主键 |
| 课程名gh_co_name | Char | 30 | 否 | |
| 备注gh_co_desc | Text | 是 | ||
| 教师gh_te_id | Char | 10 | 是 | 外键 |
| 字段 | 数据类型 | 长度 | 是否允许空值 | 备注 |
| 学号gh_st_id | Char | 10 | 否 | 外键当主键 |
| 课程号gh_co_id | Char | 10 | 否 | 外键当主键 |
| 成绩gh_sc_num | Tinyint | 是 | 在1~100之间 |
| 字段 | 数据类型 | 长度 | 是否允许空值 | 备注 |
| 工号gh_te_id | Char | 10 | 否 | 主键 |
| 姓gh_te_fname | Char | 10 | 否 | |
| 名gh_te_lname | Char | 10 | 否 | |
| 电话gh_te_phone | Char | 15 | 是 | |
| 备注gh_te_desc | Text | 是 |
1)首先建立名为guhong的数据库:
2)定义guohong_student表:
2)定义guohong_teacher表:
3)定义guohong_course表:
4)定义guohong_score表:
5)查看MS企业管理器(多了四个表):
6)为数据库各表建立索引(如果各表的数据海量,可以加快查询的速度):
7)创建各表的存储过程:
drop procedure guhong_student_pro
go
create procedure guhong_student_pro
( @学号 char(10),
@姓 char (10),
@名 char (10),
@性别 char (5) ='男' ,
@住址 char(100),
@班级 char(30),
@专业 char(30),
@邮箱 char(30),
@电话号码 char(15),
@备注 text,
)
as
insert into guhong_student values(@学号, @姓,@名, @性别, @住址, @班级,
@专业, @邮箱, @电话号码,@备注)
go
五.触发器设计
(1)插入触发器
触发guohong_student表
drop trigger guohong_student_insert_trig
go
create trigger guohong_student_insert_trig
on guohong_student
for insert
as
select * from guohong_student
go
当在guohong_student表中插入某一字段,将触发insert事件,
在guohong_student表插入该学生所一个部分新记录,并将结果显示到查询分析器上。
触发guohong_course表
drop trigger guohong_course_insert_trig
go
create trigger guohong_course_insert_trig
on guohong_course
for insert
as
select * from guohong_course
go
当在guohong_course表中插入某一字段,将触发insert事件,
在guohong_course表插入该学生所一个部分新记录,并将结果显示到查询分析器上。
触发guohong_teacher表
drop trigger guohong_teacher_insert_trig
go
create trigger guohong_teacher_insert_trig
on guohong_teacher
for insert
as
select * from guohong_teacher
go
当在guohong_teacher表中插入某一字段,将触发insert事件,
在guohong_teacher表插入该学生所一个部分新记录,并将结果显示到查询分析器上。
(2)更新触发器
创建一个触发器,它实现当guohong_student表中gh_st_id学号字段的更改,将同步实现guohong_score的学号的改变。
drop trigger guohong_score_update_trig
go
create Trigger guohong_score_update_trig
on guohong_student
for update
As
if update(gh_st_id)
begin
update guohong_score
set guohong_score.gh_st_id=i.gh_st_id
from guohong_score as br , deleted as d ,inserted as i
Where br.gh_st_id=d.gh_st_id
end
go
创建一个触发器,它实现当guohong_course表中gh_co_id课程号字段的更改,将同步实现guohong_score的课程号的改变。
drop trigger guohong_course_update_trig
go
create Trigger guohong_course_update_trig
on guohong_course
for update
As
if update(gh_co_id)
begin
update guohong_score
set guohong_score.gh_co_id=i.gh_co_id
from guohong_score as br , deleted as d ,inserted as i
Where br. gh_co_id =d. gh_co_id
end
go
在guohong_score表创建学生课程成绩在0到100之间的触发器(假如之前并未创建0-100分约束)
drop trigger guohong_score_check_gh_sc_num_0to100_trig
go
create trigger guohong_score_check_gh_sc_num_0to100_trig
on guohong_score
for update,insert
as
if exists(select * from inserted where <0 or gh_sc_num>100)
begin
print '请输入学生课程成绩在0到100分之间的数!'
rollback transaction
end
go
之前我通过alter table guohong_score drop constraint cs3已经成功删除了原约束,现在插入一条成绩101的记录,触发器检测到马上发出警告:
(3)删除触发器
当删除guohong_student中gh_st_id基本信息时,将同步实现guohong_score相应的记录整行的级联删除。
drop trigger guohong_score_cascade_delete_trig
go
create trigger guohong_score_cascade_delete_trig
on guohong_student
for delete
as
begin
delete guohong_score
from deleted as d1 , guohong_score as br1
where d1.gh_st_id=br1.gh_st_id
end
go为何是delete score的表??
当删除guohong_course中gh_co_id基本信息时,将同步实现guohong_score相应的记录整行的级联删除。
drop trigger guohong_score_cascade_delete_trig2
go
create trigger guohong_score_cascade_delete_trig2
on guohong_course
for delete
as
begin
delete guohong_score
from deleted as d1 , guohong_score as br1
where d1.gh_co_id=br1.gh_co_id
end
go
当删除guohong_teacher中gh_te_id基本信息时,将同步实现guohong_course相应的记录整行的级联删除。
drop trigger guohong_course_cascade_delete_trig
go
create trigger guohong_course_cascade_delete_trig
on guohong_teacher
for delete
as
begin
delete guohong_course
from deleted as d1 , guohong_course as br1
where d1.gh_te_id=br1.gh_te_id
end
go
(4)已经定义的触发器全览:
六.游标实现
创建一个函数function_newavg1使用游标cursor_s返回guohong_score表中每个学生成绩gh_sc_num的平均值:
create function function_newavg1(@gh_st_id varchar(10))
returns float
as
begin
declare @gh_co_id int,
@gh_sc_num int,
@sc_avg float,
@newavg float
declare cursor_s cursor fast_forward
for select gh_co_id,gh_sc_num from guohong_score where gh_st_id=@gh_st_id
open cursor_s
fetch next from cursor_s into @gh_co_id, @gh_sc_num
while(@@fetch_status=0)
begin
set @sc_avg=(select avg(gh_sc_num) from guohong_score where gh_co_id=@gh_co_id )
fetch next from cursor_s into @gh_co_id, @gh_sc_num
end
set @newavg=(select avg(gh_sc_num) from guohong_score where gh_st_id=@gh_st_id)
close cursor_s
deallocate cursor_s
return @newavg
end
go
之后定义一个存储每个学生成绩gh_sc_num的平均值的guohong_dual表
接着定义guohong_dual表的插入触发器
drop trigger guohong_dual_insert_trig
go
create trigger guohong_dual_insert_trig
on guohong_dual
for insert
as
select * from guohong_dual
go
然后向guohong_dual表插入学号为1的记录
七.图形界面的实现
创建Web站点并添加数据库
连接数据源及创建文本输入框和button之后
注册页面:
注册成功:
只显示了部分的信息
登入界面:
默认账号123456 密码123456
对课程表执行查询操作:
更新操作
插入操作
删除操作
选课操作
选课操作是仅仅对其中一个属性可以修改它的值,其他的均不能修改,例子中只能对课程的名字修改,其他的即使修改了,在数据库那边也不会变,如例子中的第一行仅课程名变化了
触发器的使用(算出平均分)
