1、数据库原理与应用课程设计说 明 书题 目: 运动会成绩管理系统 学 院: 班 级: 完成人:组号: 姓名:XXX 学号:XXXX 成绩: 姓名:XXX 学号:XXXX 成绩: 指导教师: 山 东 科 技 大 学2014 年 6 月 27 日课 程 设 计 任 务 书一、课程设计题目: 运动会成绩管理系统 二、课程设计应解决的主要问题:(按实现的系统功能)(1)运动项目、运动员、运动成绩以及班级名次的记录存储(2)添加修改和删除项目表、运动员表和成绩表信息 (3)自动生成班级名次表(触发器)(4)运动员表有改动时,自动更新班级名次表(触发器)(5)成绩表有改动时自动对成绩表中记录按项目排名次(触
2、发器) (6)成绩表自动排名自动更新班级名次表中班级总分(存储过程)(7)更新班级总分之后自动对班级排名(学院名次,学校名次)(存储过程)(8)对成绩表进行初次排名功能(9)通过项目号获得相应项目的排名表(表值函数)(10)通过学号或姓名或运动号获得某学生运动成绩表(表值函数) (11)通过班级名称获得某班所有运动员运动成绩表(表值函数) (12)通过学院名称获得学院所有运动员运动成绩表(表值函数) (13)获得全校所有运动员的运动成绩表(表值函数) (14)获得全校所有班级总分数以及在学院排名和早全校排名(表值函数) 3、任务发出日期: 2014-4-25 课程设计完成日期: 2014-6-
3、27 小组分工说明小组编号 题 目: 运动会成绩管理系统 小组分工情况:XXX:参与数据库的讨论和设计;搜集整理数据、录入数据;设计了具体的逻辑结构,绘制 E-R 图;创建数据库以及项目表、运动员表、成绩表和班级名次表;实现了表之间的关联,创建必要的默认值、规则;创建了相应的索引;创建了班级名次表的视图。XXX:参与数据库的讨论和设计;创建某项目名次表值函数;创建触发器实现成绩表的按项目自动排名功能;创建存储过程实现班级名次表的班级总成绩的更新功能;创建存储过程实现班级名次表的排名功能;创建触发器实现运动员表改动时自动更新班级名次表的功能;创建多个表值函数用于实现不同的查询功能:项目查询函数,
4、个人成绩查询函数,班级成绩查询函数,学院成绩查询函数,全校成绩查询函数,全校班级名次查询函数。整个数据库部分的设计共创建了三个触发器,四个存储过程以及七个表值函数。另外还设计了本运动会成绩管理系统的界面部分,以及文档编辑工作。组长签字: 年 月 日指导教师对课程设计的评价成绩: 指导教师签字: 年 月 日 目 录1 需求分析 111 数据事实 112 主要用户视图 22 概念结构设计 221 局部 ER 图 322 全局 ER 图 33 逻辑结构设计 44 物理结构设计 45 主要功能详细设计 551 创建数据库 552 创建数据表 553 添加数据(仅以一条为例) 654 数据库完整性 75
5、5 成绩表按成绩自动排名(触发器,函数,存储过程) 756 更新 clscore 表(触发器) 1257 成绩表按照项目初始名次 1358 查询某个项目的全部成绩和排名(表值函数) 1459 查询某个班的运动员成绩(表值函数) 14510 查询某个学生的所有成绩(表值函数) 15511 查询某个学生的某个项目成绩(表值函数) 16512 查询某个学院的运动员成绩(表值函数) 16513 查询全校运动员成绩(表值函数) 17514 通过学号和运动号查询成绩和名次(存储过程) 17515 创建班级成绩和名次视图 18516 创建索引 186 界面设计主要过程 186.1 界面总体设计 196.2
6、登录界面设计 196.3 成绩管理员界面设计 206.4 运动员查询界面设计 2601 需求分析本系统是用于管理运动会成绩的系统,要实现的功能就是运动会成绩的增加,修改和删除,同时还应该具有运动员和运动项目的增加修改和删除功能。(1)本系统面向用户有两种:成绩管理员、学生运动员。(2)管理员功能介绍管理员正确登陆后,可以增加、删除、修改、查询运动员信息,比赛项目以及比赛成绩。(3)学生运动员主要功能介绍学生登录后,可以查询(比赛成绩、运动动员信息、运动项目) 。11 数据事实数据实例112 主要用户视图用户 需求成绩管理员 登录(正确输入用户名及密码登录)增加、删除、修改、查询运动员信息,比赛
7、项目以及比赛成绩学生 登录(默认用户名)查询(比赛成绩、运动动员信息、运动项目)2 概念结构设计学生登录成绩查询 基本信息查询管理员登入成绩查询 基本信息查询 信息录入查询 查询 查询与修改查询与修改查询与修改项目表成绩表运动员表个人成绩查询项目成绩查询班级成绩查询全校成绩查询全校名次查询学院成绩查询添加学生信息比赛成绩录入添加比赛项目学生登录成绩查询 基本信息查询查询 查询2图 2.1 系统边界21 局部 ER 图图 1 项目表 图 2 学生表图 3 成绩表 图 4 班级名次表22 全局 ER 图运动号性别项目二姓名 学院学生表学号项目一班级项目表项目号 项目名称成绩表学号 项目号成绩 名次
8、班级名次表班级名 班级得分在学院排名 在校排名n m学生表 项目表成绩表班级名次表选择排名33 逻辑结构设计关系模式如下:运动员(学号、姓名、性别、学院、班级、运动号、项目一、项目二)运动项目(项目号、项目名称)成绩(学号、项目号、成绩、名次)班级排名(学院、班级、总成绩、在学院名次、在校名次)4 物理结构设计学生表列名 数据类型 允许空 说明SNO Int 否 学生编号SName Varchar(50) 否 姓名SDept Varchar(50) 是 系别SClassNO Varchar(50) 是 班级SportsNO Int 否 运动编号项目表列名 数据类型 允许空 说明SportsNO
9、 Int 否 项目编号SportsName Varchar(50) 否 项目名称项目成绩表列名 数据类型 允许空 说明SNO Int 否 学生编号SportsNO Int 否 项目编号Score Varchar(5 否 成绩40)Srank int 否 名次班级名次表列名 数据类型 允许空 说明sdeptname Varchar(20)是 学院sclassname Varchar(20)否 班级sclscore int 是 总分sclrankindept int 是 学院名次sclrankinsch int 是 学校名次5 主要功能详细设计51 创建数据库CREATE DATABASE spo
10、rtsON (NAME = 运动会数据, FILENAME = D:SQLsports.MDF,SIZE = 10MB, MAXSIZE = 100MB)LOG ON (NAME = 运动会数据日志, FILENAME = D:SQLsports_Log.LDF,SIZE = 5MB, MAXSIZE = 25MB)52 创建数据表1、 创建项目表use sports5create table sp(sportno int NOT NULL PRIMARY KEY,sportname varchar(30) not null)2、 创建学生表create table stu(sno int N
11、OT NULL PRIMARY KEY,sname varchar(10)not null,sdept varchar(20),sclassname varchar(20),ssex varchar(2),spno int not null unique,sportno1 int foreign key references sp(sportno) not null,sportno2 int foreign key references sp(sportno) )3、 创建成绩表-全体运动员的各个项目的成绩表create table sc(sno int FOREIGN KEY referen
12、ces stu(sno),sportno int FOREIGN KEY references sp(sportno),score varchar(10),srank intprimary key (sno,sportno)4、 创建名次表-记录全校所有班级的得分以及在学院的名次和在全校的名次create table clscore(sdeptname varchar(20),-学院名sclassname varchar(20) primary key,-班级名称sclscore int,-班级成绩sclrankindept int,-班级在学院中的名次sclrankinsch int-班级在
13、学校中的名次)53 添加数据(仅以一条为例)1、 添加运动项目表记录use sports insert into sp values (1,男子一百),(2, 男子二百)62、 添加学生表记录use sportsinsert into stu values(10103,赵浩 ,数学,数学一班,男,10001,1,3),(10105,钱浩, 数学 ,数学一班,男,10002,2,4)3、 添加比赛成绩表记录use sportsinsert into sc (sno,sportno,score) values(10103,1,12.2)54 数据库完整性1、 绑定列上默认值use sportsgo
14、create default ssex as 男goexec sp_bindefault ssex,stu.ssexgo2、 绑定规则create rule rule_sportno as c1 between 1 and 12gocreate rule rule_sno as c1 between 10101 and 40340goexec sp_bindrule rule_sportno,sp.sportno goexec sp_bindrule rule_sno,stu.sno go55 成绩表按成绩自动排名(触发器,函数,存储过程)功能简介:当 sc 表有成绩插入删除或者修改时就触发,
15、实现对 sc 表中单项目名次 nrank 属性的及时更新,更新完之后,调用存储过程,实现对 clscore 表中班级成绩和班级排名的更新。551 更新项目名次触发器-触发器-及时更新 sc 表-当有成绩插入删除或者修改sc 表时就触发-实现对sc 表中单项目名次 nrank属性的及时更新use sportsgo-插入更新与删除操作 sc 表if exists(select * from sysobjects where name = trSC and type = TR)drop trigger trSCgocreate trigger trSCon sc after insert,updat
16、e,deleteasdeclare sportno0 int,sno0 int,sportno1 int,sportno2 intselect sno0=sno,sportno0=sportno from insertedselect sportno1=sportno1,sportno2=sportno2 from stu where sno = sno07if sportno0 not in(sportno1,sportno2)-if sportno0!=sportno1 and sportno0!=sportno2beginprint 操作有误,此记录与运动员表不一致,请先修改运动员表!r
17、ollbackendelsebegin-更新名次-声明变量declare sno int,sportno int,rank intdeclare iu_scSportno_cursor CURSOR forselect sportno from spopen iu_scSportno_cursorfetch next from iu_scSportno_cursor into sportnowhile fetch_status = 0beginset rank = 1-声明游标declare iu_sc_cursor CURSOR forselect sno from scRankFun(sp
18、ortno)-打开游标open iu_sc_cursor-提取第一行fetch next from iu_sc_cursor into snowhile FETCH_STATUS = 0beginupdate scset srank = rankwhere sno = sno and sportno = sportnoset rank = rank+ 1fetch next from iu_sc_cursor into snoendclose iu_sc_cursordeallocate iu_sc_cursorfetch next from iu_scSportno_cursor into
19、sportnoendclose iu_scSportno_cursordeallocate iu_scSportno_cursorend-执行存储过程updateClscore,更新clscore 表-exec updateClscoregoGo测试代码及截图如下:8552 计算班级总成绩存储过程存储过程:当sc 表名次有变动时,及时更新 clscore表中的班级总成绩-当sc 表有更新时,及时更新clscore表中每个班的总分数-use sportsgoif exists(select * from sysobjects where name = updateClscore and type
20、 = P)drop procedure updateClscoregocreate procedure updateClscore asbegindeclare classname varchar(20),srank int,srankTotal intdeclare cursor_class cursor forselect sclassname from stu group by sclassnameopen cursor_classfetch next from cursor_class into classnamewhile FETCH_STATUS = 0beginset srank
21、Total = 0declare cursor_srank cursor forselect srank from sc where sno in(select sno from stu where sclassname = classname)open cursor_srankfetch next from cursor_srank into srankwhile FETCH_STATUS = 0beginif srank = 0 if (Delete(sno) MessageBox.Show(“删?除y成功|!?“);dataGridView1.DataSource = sel();pub
22、lic bool Delete(string sno)SqlConnection conn = new SqlConnection(“Data Source=(local);Initial Catalog=sports;Integrated Security=True“);conn.Open();string sql = “delete sc where sno=cast(sno as int) and sportno=cast(sportno as int)“;22SqlParameter parn1 = new SqlParameter(“sno“, sno);SqlCommand cmd
23、 = new SqlCommand(sql, conn);SqlParameter parn2 = new SqlParameter(“sportno“, sportno);cmd.Parameters.Add(parn1); cmd.Parameters.Add(parn2);int result = cmd.ExecuteNonQuery();conn.Close();cmd.Dispose();return result!=0;2、假设此时管理员选择了学生个人成绩查询,则会出现查询某个学生成绩的界面,包含三种查询方式,可以选择不同的方式进行查询。private void button1_
24、Click(object sender, EventArgs e)string name = textBox1.Text;if (name.Length = 0) return;if (selectKind = 1)if (!Exeited(1, name) MessageBox.Show(“输入学号有误,请重新输入!“);else dataGridView1.DataSource = sel(selectKind, name);if (selectKind = 2)if (!Exeited(2, name) MessageBox.Show(“输入姓名有误,请重新输入!“);else data
25、GridView1.DataSource = sel(selectKind, name);if (selectKind = 3)if (!Exeited(3, name) MessageBox.Show(“输入运动号有误,请重新输入!“);else dataGridView1.DataSource = sel(selectKind, name);for (int i = 0; i dataGridView1.Columns.Count; i+)if (i!=3)23dataGridView1.Columnsi.ReadOnly = true;else dataGridView1.Columnsi.ReadOnly = false;同样,管理员也可以直接修改这个表中的成绩,并且系统自动更新相应的名次。比较上图中的第一行的记录可以看出通过修改成绩,实现了名次的自动更新,以及数据库的修改。3、班级成绩查询界面4、学院成绩查询245、全校查成绩查询6、班级名次查询(2)对于另外两个信息录入和基本信息查询功能不再一一介绍代码.1、基本信息录入界面: