资源描述
网络数据库课程设计实施方案
29
2020年4月19日
文档仅供参考
《网络数据库》课程设计实施方案
一、《网络数据库》课程设计目的及意义
经过设计一个数据库应用系统,可进一步熟悉SQL Server索引、视图、存储过程、触发器的概念、T-SQL语句的用法,在C#中的数据访问办法及实现方式。经过这个课程设计能够加深对SQL Server数据库知识的学习,理解,积累在实际工程中运用各种数据库对象的经验,使学生掌握使用应用软件开发工具开发数据库管理系统的基本方法。在实用性方面,客房管理系统也是很普遍的一种应用,选择该系统作为课程设计也能够为以后学生可能遇到的实际开发提供借鉴。
二、课程设计项目选题(任选一)
1、客房管理系统
2、工资管理系统设计
3、图书管理系统设计
4、班级管理系统
5、教师信息管理系统
6、成绩管理系统
7、学生信息管理系统
8、实验室管理系统
9、科研项目管理系统
10、商品销售管理系统
三、时间与安排
时间为2周(12天时间),时间应该够用,因为早已把课程设计分解到平时上课所布置的课外作业中。粗略划分:
第1、2天 布置任务及分组、总体需求分析与设计;编写相关文档、设计说明、查找资料
第3、4天数据库设计,数据表的设计、数据的录入,完整性约束
第5、6天视图、触发器和存储过程设计
第7、8各模块的编程设计;
第9、10 使用C#)创立工程并编写代码;
第11天 程序总调试、修改, 撰写课程设计实习报告
四、课程设计报告
内容包括:系统设计目的、数据库对象、数据表结构(每个表要注明索引、视图、触发器、存储过程)、功能模块划分、程序实现思路、设计说明文档、课程设计心得及程序清单(打印),并按学校的课程设计(论文)格式撰写并装订成册,以备下一次再代此课时使用。
五、成绩考核:
系统测试、设计报告、单项实训分别占40%、40%、20%;
六、进度与组织
1、课程设计进度安排(第17周-第18周)
交付方式:第16周交付已打印的文档、可演示的软件。
2、课程设计小组
学生每N人1组(一个面最多6组),自由组合,指定一个组长,负责本小组的任务分配与进度安排。在提交文档时,应在封面上注明小组参加人员,包括学号和姓名,以便老师打分。 课程设计小组应独立工作,能够相互讨论,但小组间不允许互相抄抄袭。
3、 19周进行演示。
参考案例1:小型学生管理系统
问题
本案例实现一个小型的学生管理系统。完成的功能:班级管理、学生管理、科目管理、课程管理、成绩管理以及系统管理员才具有的教师管理和用户管理。
1.班级管理:可对班级进行添加、删除、修改、查找和报表输出等功能,班级属性有:名称、班主任(来自于系统中保存的教师)、当前学生人数、建班日期和备注等属性。
2.学生管理:可对学生进行添加、删除、修改、查找和报表输出等功能,学生属性有:学号、姓名、性别、所属班级(来自于系统中保存的班级)、相片、出生日期和备注等属性。
3.科目管理:可对科目进行添加、删除、修改、查找和报表输出等功能,科目属性有:科目名称、学时数和备注等属性。
4.课程管理:可对每一个班级的上课科目进行添加、删除、修改、查找和报表输出等功能,课程属性有:所属班级(来自于系统中保存的班级)、授课老师(来自于系统中保存的教师)、开课日期、结课日期和备注等属性。
5.成绩管理:可对每一个班级的上课科目的学生成绩进行添加、删除、修改、查找和报表输出等功能,成绩属性有:学生姓名、所属班级(来自于系统中保存的班级)、课程名、成绩、备注等属性。
指导教师讲解问题说明
分析
根据系统的功能划分和实现的方便,我们将整个程序分为三层:数据层、业务层和界面层。数据层负责对数据库进行操作,包括向表中插入数据、更新数据、查询数据和删除数据。业务层负责把界面上的各种操作传达给数据层。界面层主要负责界面的设计,包括控件的位置和外观等设置、实时反映系统的变化情况。
数据库表的设计
根据程序的功能得出数据实体,进行数据库设计分析,确定以下数据表,如图所示:
图1 班级表结构
图2 课程表结构
图3 分数表结构
图4 学生表结构
图5 科目表结构
图6 教师表结构
图7 用户信息表结构
方案实现:
在解决方案中添加3个项目,分别代表数据层、业务层和界面层。因为班级、课程、成绩、学生、科目和教师等对象的实现方式类似,以下以班级类为示例,讲解实现过程:
BusinessRuler.Classes类的实现
该类主要实现班级的业务逻辑,如:验证系统是否有班级、该班是否有学生、该班学生人数是否已超过额定、班级名是否已存在、该班是否已开课、添加、删除、修改和查找班级。具体代码如下所示:
using System;
using System.Windows.Forms;
using DataAccess;
using System.Data.SqlClient;
using System.Collections;
using System.Data;
namespace BusinessRuler
{
public class Classes
{
private DataGridView _dgvClass;
public Classes(DataGridView dgv)
{
_dgvClass = dgv;
}
public Classes()
{ }
//验证系统是否有班级
public static bool IsClassExists()
{
if (DataAccess.Classes.IsClassExists().HasRows)
{
return true;
}
else
{
MessageBox.Show("当前还没有班级,请首先创立班级", "错误", MessageBoxButtons.OK, MessageBoxIcon.Information);
return false;
}
}
//验证该班是否有学生
public bool IsStudentExists(string className)
DataAccess.Classes objClass = DataAccess.Classes.CreateInstance(className);
if (objClass.CurrentCount > 0 )
{
return true;
}
else
{
MessageBox.Show("该班当前还没有学生,无法进行成绩管理,请首先添加学生!", "错误", MessageBoxButtons.OK, MessageBoxIcon.Information);
return false;
}
}
//验证该班学生人数是否已超过额定
public static bool isInCapacity(string className)
{
int studentCapacity = Int32.Parse(BusinessRuler.ReaderWirteConfig.GetValueByKey("studentCapaticyInClass"));
DataAccess.Classes objClass = DataAccess.Classes.CreateInstance(className);
if (objClass.CurrentCount == studentCapacity )
{
MessageBox.Show("该班学生人数已满!", "错误", MessageBoxButtons.OK, MessageBoxIcon.Error);
return false;
}
return true;
}
//验证班级名是否已存在
public static bool CheckExists(string className)
{
return DataAccess.Classes.CheckExists(className).HasRows;
}
//检查该班是否已开课
public bool IsCourseExist(string className)
{
DataAccess.Classes objClass = new DataAccess.Classes(className);
if (objClass.FillByAllSubjectName().Tables[0].Rows.Count > 0 )
{
return true;
}
else
{
MessageBox.Show(className+ " 班尚无课程,无法进行成绩管理,请先添加课程!","错误",MessageBoxButtons.OK,MessageBoxIcon.Error);
return false;
}
}
//更新数据网格的显示
public void UpdateDataGrid()
{
if (this._dgvClass != null)
{
DataSet objDataSet = DataAccess.Classes.FillByAllClass();
this._dgvClass.DataSource = objDataSet.Tables[0];
}
}
//添加班级
public void AddClass(string className, string director, DateTime entranceDate, string remark)
{
//首先判断班级名称是否已存在
if (CheckExists(className))
{
MessageBox.Show("班级名" + className + "已存在,请重新输入班级名!", "班级名已存在", MessageBoxButtons.OK, MessageBoxIcon.Error);
}
else
{
if (DataAccess.Classes.CreateClass(className, director, entranceDate, remark) > 0)
{
UpdateDataGrid();
MessageBox.Show("成功添加班级!", "操作成功", MessageBoxButtons.OK, MessageBoxIcon.Information);
}
}
}
//修改班级
public void ModifyClass(string className, string director,DateTime entranceDate, string remark)
{
DataAccess.Classes objClass = new DataAccess.Classes(className);
objClass.Director = director;
objClass.EntranceDate = entranceDate;
objClass.Remark = remark;
if (objClass.Update() > 0)
{
UpdateDataGrid();
MessageBox.Show("修改班级资料成功!", "操作成功", MessageBoxButtons.OK, MessageBoxIcon.Information);
}
}
//删除班级
public void DeleteClass(string className)
{
if (!CheckExists(className))
{
MessageBox.Show("班级名" + className + "不存在,请重新输入班级名!", "班级名不存在", MessageBoxButtons.OK, MessageBoxIcon.Error);
}
else
{
if (DialogResult.Yes == MessageBox.Show("真的要删除班级' " + className + " '吗?\n 删除该班时,将同时删除该班所有学生的档案及相关课程、成绩的记录,确定要继续吗?", "删除确认", MessageBoxButtons.YesNo, MessageBoxIcon.Question))
{
DataAccess.Classes objClass = new DataAccess.Classes(className);
if (objClass.Delete() > 0)
{
UpdateDataGrid();
MessageBox.Show("成功删除班级' " + className + " '!", "操作成功", MessageBoxButtons.OK, MessageBoxIcon.Information);
}
}
}
}
public void FillCboByAllClassName(ComboBox cbo, int position)
{
cbo.Items.Clear();
DataTable classNames = DataAccess.Classes.GetAllClassName();
foreach (DataRow row in classNames.Rows)
{
cbo.Items.Add(row[0].ToString());
}
cbo.SelectedIndex = position;
}
public void FillCboByAllClassName(ComboBox cbo, string theClassName)
{
cbo.Items.Clear();
int position = 0;
int i = 0;
DataTable classNames = DataAccess.Classes.GetAllClassName();
foreach(DataRow row in classNames.Rows)
{
cbo.Items.Add(row[0].ToString());
if (row[0].ToString().Equals(theClassName))
{
position = i;
}
i++;
}
cbo.SelectedIndex = position;
}
//查找班级
public static void FindByClassName(DataGridView dgv, string className)
{
for (int row = 0; row < dgv.Rows.Count; row++)
{
if (dgv.Rows[row].Cells["colClassName"].Value.ToString().Equals(className))
{
dgv.Rows[row].Selected = true;
return ;
}
}
MessageBox.Show("已到记录末尾!", "结果", MessageBoxButtons.OK, MessageBoxIcon.Information);
}
//按班主任查找
public static void FindByDirector(DataGridView dgv, string director,bool useMatch)
{
for (int row = Int32.Parse(dgv.Tag.ToString()); row < dgv.Rows.Count; row++)
{
bool condition = dgv.Rows[row].Cells["colDirector"].Value.ToString().Equals(director);
if (useMatch)
{
condition = dgv.Rows[row].Cells["colDirector"].Value.ToString().Contains(director);
}
if (condition)
{
dgv.Rows[row].Selected = true;
dgv.Tag = (row+1).ToString();
return ;
}
}
MessageBox.Show("已到记录末尾!", "结果", MessageBoxButtons.OK, MessageBoxIcon.Information);
dgv.Tag = 0;
}
//按建班日期查找
public static void FindByDate(DataGridView dgv, DateTime startDate, DateTime finishDate)
{
for (int row = Int32.Parse(dgv.Tag.ToString()); row < dgv.Rows.Count; row++)
{
DateTime dateValue = DateTime.Parse(dgv.Rows[row].Cells["colEntranceDate"].Value.ToString());
if (dateValue >= startDate && dateValue <= finishDate)
{
dgv.Rows[row].Selected = true;
dgv.Tag = (row + 1).ToString();
return;
}
}
MessageBox.Show("已到记录末尾!", "结果", MessageBoxButtons.OK, MessageBoxIcon.Information);
dgv.Tag = 0;
}
}
}
DataAccess.Classes类的实现
该类主要实现班级的对象的创立和数据库操作,如:得到所有班级名、新建班级、获取班级所有学生的集合、得到指定班级所有课程信息的记录、添加、删除和修改班级。具体代码如下所示:
using System;
using System.Collections.Generic;
using System.Text;
using System.Data;
using System.Data.SqlClient;
using System.Collections;
namespace DataAccess
{
public class Classes
{
private string _className;
private string _director;
private int _currentCount;
private DateTime _entranceDate;
private string _remark;
#region
public string Name
{
get
{
return _className;
}
set
{
_className = value;
}
}
public string Director
{
get
{
return _director;
}
set
{
_director = value;
}
}
public int CurrentCount
{
get
{
return _currentCount;
}
set
{
_currentCount = value;
}
}
public DateTime EntranceDate
{
get
{
return _entranceDate;
}
set
{
_entranceDate = value;
}
}
public string Remark
{
get
{
return _remark;
}
set
{
_remark = value;
}
}
#endregion
//实例化班级
public Classes(string className)
{
_className = className;
}
public Classes()
{
}
public static Classes CreateInstance(string className)
{
Classes c = null;
string strSql = "select * from Class where [ClassName] = @className ";
SqlCommon sqlcomm = new SqlCommon();
SqlDataReader reader = sqlcomm.ExecuteReader(strSql, new SqlParameter("@className", className));
if (reader.Read())
{
c = new Classes(className);
c._director = reader["Director"].ToString();
c._currentCount = (Int32.Parse(reader["CurrentCount"].ToString()));
c._entranceDate = (DateTime)reader["EntranceDate"];
c._remark = reader["Remark"].ToString();
}
reader.Close();
return c;
}
//得到所有班级名
public static DataTable GetAllClassName()
{
string strSql = "select ClassName from Class";
SqlCommon sqlcomm = new SqlCommon();
DataSet ds = sqlcomm.CreaDataSet(strSql, null);
return ds.Tables[0];
}
//新建班级
public static int CreateClass(string className, string director, DateTime entranceDate, string remark)
{
string strSql = "insert into Class(ClassName,Director,EntranceDate,Remark) values(@className,@director,@entranceDate,@remark);";
SqlCommon sqlcomm = new SqlCommon();
SqlParameter[] pa = new SqlParameter[4];
pa[0] = new SqlParameter("@ClassName", className);
pa[1] = new SqlParameter("@Director", director);
pa[2] = new SqlParameter("@EntranceDate", entranceDate);
pa[3] = new SqlParameter("@Remark", remark);
return sqlcomm.ExecuteNonQuery(strSql, pa);
}
//更新班级
public int Update()
{
string strSql = "update Class set [Director] = @director,[EntranceDate] = @entranceDate,[Remark] = @remark where [ClassName] = @className";
SqlCommon sqlcomm = new SqlCommon();
return sqlcomm.ExecuteNonQuery(strSql, new SqlParameter("@Director", this._director), new SqlParameter("@EntranceDate", this._entranceDate), new SqlParameter("@Remark", this._remark),new SqlParameter("@className",_className));
}
//删除班级
public int Delete()
{
//删除班级的同时删除该班所有学生记录、课程记录、成绩记录
StringBuilder strSql = new StringBuilder();
strSql.Append("delete from Score where [StudentNo] in (Select [StudentNo] from Student where [ClassName] = @className) ;");
strSql.Append("delete from Course where [ClassName] = @className ;");
strSql.Append("delete from Student where [ClassName] = @className ;");
strSql.Append("delete from Class where [ClassName] = @className ;");
SqlCommon sqlcomm = new SqlCommon();
return sqlcomm.ExecuteNonQuery(strSql.ToString(),true,false, new SqlParameter("@className", _className));
}
//检查是否有班
public static SqlDataReader IsClassExists()
{
string strSql = "select * from Class ";
SqlCommon sqlcomm = new SqlCommon();
SqlDataReader reader = sqlcomm.ExecuteReader(strSql, null);
return reader;
}
//检查是否有学生
public SqlDataReader IsStudentExists()
{
string strSql = "select * from Class where [ClassName] = @className and [CurrentCount] > 0 ";
SqlCommon sqlcomm = new SqlCommon();
SqlDataReader reader = sqlcomm.ExecuteReader(strSql,new SqlParameter("@className",_className));
return reader;
}
//检查班级名是否已存在
public static SqlDataReader CheckExists(string className)
{
string strSql = "select * from Class where [className] = @className";
SqlCommon sqlcomm = new SqlCommon();
SqlDataReader reader = sqlcomm.ExecuteReader(strSql, new SqlParameter("@className", className));
return reader;
}
//得到所有班级的记录
public static DataSet FillByAllClass()
{
string strSql = "select * from Class";
SqlCommon sqlcomm = new SqlCommon();
DataSet ds = sqlcomm.CreaDataSet(strSql, null);
return ds;
}
//获取班级所有学生的集合
public DataSet FillByAllStudent()
{
string strSql = "select StudentNo,StudentName,Gender,Birthday,Picture,Remark from Student where [ClassName] = @className";
SqlCommon sqlcomm = new SqlCommon();
DataSet ds = sqlcomm.CreaDataSet(strSql, new SqlParameter("@className", _className));
return ds;
}
public DataTable GetAllStudentNo()
{
string strSql = "select StudentNo from Student where [ClassName] = @className";
SqlCommon sqlcomm = new SqlCommon();
DataSet ds = sqlcomm.CreaDataSet(strSql, new SqlParameter("@className", _className));
return ds.Tables[0];
}
//得到指定班级所有课程信息的记录
public DataSet FillByAllCourse()
{
string strSql = "select Sub
展开阅读全文