数据库课程设计——学生宿舍管理,需要全部源码可以关注私信我
- 前言
- 一、课题背景和开发环境
- 1、课题背景
- 2、开发环境
- 二、系统功能及示意图
- 1、系统实现功能
- 2、功能示意图
- 2.1学生模块
- 2.2管理人员模块
- 三、概念结构设计
- 1、管理员分配宿舍E_R图
- 2、数据库关系图
- 四、数据库表
- 五、数据库的实施
- 1、触发器设计
- 六、部分系统功能设计与实现
- 1、database类
- 2、登录界面
- (1)界面展示:
- 3、宿舍界面
- (1)界面展示
- (2)界面功能
- 4、分配宿舍界面
- (1)界面展示
- (2)界面功能
- 七、系统测试(部分功能)
- 1、学生登录
- (1)查看个人信息:
- (2)查看宿舍信息:
- (3)申请更换宿舍:
- 2、管理人员登录(用权限为1管理员登录可以进行所有操作):
- (1)宿舍楼管理:
- (2)宿舍管理:
- 总结
前言
学生宿舍管理系统从实际问题出发,解决高校传统方式进行学生宿舍管理的缺点,极大提高了学生宿舍管理的效率。本系统基于SQLServer数据库系统,从学生和管理人员两个角度出发进行设计。从学生角度出发,学生能够查看个人信息,查看宿舍的信息,提交更换宿舍申请以及修改登录密码;从管理人员角度出发,实现管理宿舍信息、学生信息、对宿舍、学生进行增删改查、分配新生的宿舍、对申请更换宿舍的学生进行宿舍的分配。不仅如此,针对低权限的管理人员,不能操作宿舍楼、宿舍信息,加强了数据的保密性。
一、课题背景和开发环境
1、课题背景
学生宿舍管理系统对于一个学校来说是不可获取的重要组成部分。学生宿舍是大学生在高校校园里一个重要的学习、生活、交往的空间环境。大学生,大约有2/3 的时间是在宿舍环境里度过的。随着高校办学规模的扩大,在校学生的学历层次、思想状态、文化水平呈多样化、复杂化趋势,这在很大程度上给学生管理工作带来许多新的问题。例如:学生宿舍的住宿管理也日益增多,宿管员的工作难度逐渐加大,已经不能满足实际的需要,工作效率也比较低,并且这种传统方式也存在着许多弊端,如:保密性差,效率低,很难保存记录等。当今社会是飞速进步的世界,原始的记录方式已经被社会所淘汰了,计算机化管理正是适应时代的产物。采用计算机来管理宿舍和学生的信息,大大提高了查询的速度,节约了人力和物力资源。现如今,计算机的价格十分亲民,性能也有了很大的进步。它已经被应用于许多领域。我们针对高校学生宿舍存在的问题,设计了一套学生宿舍管理系统。本系统针对高校采用传统方式管理的缺点,极大提高了学生宿舍管理的效率,也是科学化、正规化的管理;本系统的开发是为了方便宿管员的管理以及对相关信息的更新,为老师、学生查询所在宿舍的信息。实现寝室信息管理工作流程的系统化、规范化和自动化。
2、开发环境
使用的数据库是Microsoft SQL Server Management Studio 18。具有许多显著的优点:易用性、适合分布式组织的可伸缩性、用于决策支持的数据仓库功能、与许多其他服务器软件紧密关联的集成性、良好的性价比等。使用了Visual Studio 2022中的Window 窗体应用(.NET Framework),用于创建具有Window窗体用户界面的项目。
二、系统功能及示意图
1、系统实现功能
从实际生活应用角度出发,学生宿舍管理系统应该同时提供给系统管理员与学生使用,而二者所需要的功能并不相同。因此系统从学生与管理员两个角度进行出发,结合实际所需要的操作进行分模块设计。
一、学生界面功能:
(1)登录功能:设计登录界面,针对学生输入的学号密码,通过匹配数据库里的学号密码,实现不同的学生进行登录。
(2)个人信息查询:通过学生的学号查询,学生可以检查自己的各项信息。
(3)修改密码:通过学号进行密码修改,学生可以修改自己的登录密码。
(4)宿舍信息查询:宿舍信息界面向学生展示了宿舍成员的信息,以及宿舍的一些基本信息。
(5)申请更换宿舍:学生可以根据自己需求,向管理员提出更换宿舍的申请,需等管理员同意且分配完宿舍后,才有新的宿舍信息。
二、管理人员界面功能
(1)宿舍楼管理:根据填写的信息,对宿舍楼进行增删改查。
(2)宿舍管理界面:根据填写的信息,对宿舍的信息进行增删改查操作。
(3)分配宿舍界面:给未分配宿舍的同学,进行宿舍分配,其中有未分配人员的信息,空余宿舍的信息。
(4)学生信息管理界面:对学生信息进行增删改查操作。
(5)调整宿舍界面:对申请更换宿舍的学生进行调整,其中有申请同学的信息和空余宿舍的信息。
(6)登录功能:在登录界面,选择管理员,输入正确的账号密码即可进入管理人员界面。对于低权限的管理人员不能进行宿舍楼管理和宿舍管理。只有超级管理员才可以进行这两个操作。
2、功能示意图
2.1学生模块
2.2管理人员模块
三、概念结构设计
1、管理员分配宿舍E_R图
2、数据库关系图
四、数据库表
①Student
由上表(数据图关系图)可知,学生需要有姓名,性别,出生日期,专业,班级,手机号码的属性,因此创建学生表。
代码如下:CREATE TABLE [dbo].[Student]([ssid] [char](10) NOT NULL,[sname] [varchar](10) NULL,[sex] [char](2) NULL,[birth] [datetime] NULL,[sdept] [varchar](20) NULL,[class] [int] NULL,[phone] [varchar](15) NULL,PRIMARY KEY CLUSTERED ([ssid] ASC)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON, OPTIMIZE_FOR_SEQUENTIAL_KEY = OFF) ON [PRIMARY]) ON [PRIMARY]GO
②Studentlogin
学生登录表记录了学生的登录账号和密码,该表的账号为学生的学号,是Student表中ssid的外键。
代码如下:CREATE TABLE [dbo].[Studentlogin]([ssid] [char](10) NULL,[pwd] [char](10) NULL) ON [PRIMARY]GO
③Building
宿舍楼有楼号,宿舍数量和地理位置的属性,所以我们创建宿舍楼表,记录每栋楼的信息,将楼号bid设为主键。
代码如下:CREATE TABLE [dbo].[Building]([bid] [char](10) NOT NULL,[num] [int] NULL,[local] [char](20) NULL, CONSTRAINT [PK__Building__DE90ADE74750D263] PRIMARY KEY CLUSTERED ([bid] ASC)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON, OPTIMIZE_FOR_SEQUENTIAL_KEY = OFF) ON [PRIMARY]) ON [PRIMARY]GO
④Dormitory
宿舍有宿舍编号(方便运用),楼号,宿舍号,楼层,床位,价格等信息,所以我们建立宿舍表,将宿舍号设为主键。
代码如下:CREATE TABLE [dbo].[Dormitory]([did] [int] NOT NULL,[bid] [char](10) NULL,[dnum] [int] NULL,[dfloor] [int] NULL,[bed] [int] NULL,[price] [decimal](18, 0) NULL, CONSTRAINT [PK__Dormitor__D877D216A2D12D3F] PRIMARY KEY CLUSTERED ([did] ASC)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON, OPTIMIZE_FOR_SEQUENTIAL_KEY = OFF) ON [PRIMARY]) ON [PRIMARY]GO
⑤Manager
管理员拥有账号,密码,姓名和权限这些属性,权限用以区别超级管理员和普通管理员,并且将账号mid设为主键。
代码如下:CREATE TABLE [dbo].[Manager]([mid] [int] NOT NULL,[pass] [char](10) NULL,[sname] [char](5) NULL,[permission] [char](1) NULL,PRIMARY KEY CLUSTERED ([mid] ASC)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON, OPTIMIZE_FOR_SEQUENTIAL_KEY = OFF) ON [PRIMARY]) ON [PRIMARY]GO
⑥StuDormitory
学生宿舍表记录学生的宿舍编号和学号,将学号和宿舍编号设为主键,才能唯一确定一条记录,学号为Student表的ssid的外键,宿舍编号为Dormitoryd的did的外键。
代码如下:CREATE TABLE [dbo].[StuDormitory]([did] [int] NOT NULL,[ssid] [char](10) NOT NULL,PRIMARY KEY CLUSTERED ([did] ASC,[ssid] ASC)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON, OPTIMIZE_FOR_SEQUENTIAL_KEY = OFF) ON [PRIMARY]) ON [PRIMARY]GO
⑦Apply
学生宿舍申请表拥有学号,旧宿舍,申请日期,原因和状态五个属性,状态为0表示处理完,状态为1表示未处理。学号是Student表的ssid的外键。
代码如下:CREATE TABLE [dbo].[Apply]([ssid] [char](10) NULL,[olddnum] [int] NULL,[adate] [datetime] NULL,[reason] [varchar](50) NULL,[condition] [int] NULL) ON [PRIMARY]GO
⑧Change
学生宿舍变动表记录学生的学号,处理日期,旧宿舍和更换过后的新宿舍,学号是Student表的外键。
代码如下:CREATE TABLE [dbo].[Change]( [ssid] [char](10) NULL, [olddnum] [int] NULL, [newdnum] [int] NULL, [cdata] [datetime] NULL) ON [PRIMARY]GO
五、数据库的实施
1、触发器设计
1、Studentlogin表的插入触发器。当插入学号和密码时,表中存在相同学号,则不允许插入。
2、更换宿舍申请表的插入触发器。当进行插入时,幻表中已经进行了插入,获取当前表中按时间顺序排第二的记录(即插入记录的上一条记录)得到处理状态,如果为0,证明处理完毕,可以进行插入,如果为1,证明尚未处理,不可插入。
3、学生宿舍表的插入触发器。如果在表中不存在插入的学号,并且插入的宿舍剩余床位大于0,则同意插入,不满足二者其一条件则不允许插入。
六、部分系统功能设计与实现
1、database类
创建database类,通过非连接的方式访问数据库,对传参的sql语句进行处理,有两个方法,获取数据()与更新(),获取数据主要是用于读取数据库的信息,利用SqlDataAdapter的对象myAdapter.Fill方法将数据从数据库复制到DataSet的对象myDataSet中,最后将myDataSet返回。就实现了从数据库获取信息。更新主要是用于对数据库的数据进行增删改查操作。创建database类方便之后要从数据库获取数据的代码编写,减少代码冗余。
代码如下:using System;using System.Collections.Generic;using System.Data;using System.Data.SqlClient;using System.Linq;using System.Text;using System.Threading.Tasks;using System.Windows.Forms;namespace StudentdormManaSys{ internal class database { private static string connStr = @"data source=.;database = Dormitorymanager; integrated security = true"; private static SqlConnection conn = new SqlConnection(connStr); public static DataSet 获取数据(string sqlStr)//sqlStr是需要执行的sql语句 { try { conn.Open(); SqlDataAdapter myAdapter = new SqlDataAdapter(sqlStr, conn); DataSet myDataSet = new DataSet(); myDataSet.Clear(); myAdapter.Fill(myDataSet); conn.Close(); if (myDataSet.Tables[0].Rows.Count != 0) { return myDataSet; } else { return null; } } catch (Exception ex) { MessageBox.Show("打开数据库失败", "提示"); return null; } } public static void 更新(string sqlStr) { try { conn.Open(); SqlCommand myCmd = new SqlCommand(sqlStr, conn); myCmd.CommandType = CommandType.Text; myCmd.ExecuteNonQuery(); conn.Close(); } catch { MessageBox.Show("更新据库失败", "提示"); return; } } }}
2、登录界面
用户根据不同的身份(学生或者管理员)进行选择后,输入自己的用户名与密码,如果与数据库匹配正确即可登录。对登录组件利用Color.FromArgb方法设置成透明,使界面展示美观。点击学生则显示学生登录窗口,点击管理人员则显示管理人员登录窗口。一开始加载时默认选择学生登录。
(1)界面展示:
代码如下: public static string ssid;//设置静态变量,方便之后调用 public static string mmid; private void studentlogin_CheckedChanged(object sender, EventArgs e) { if (studentlogin.Checked == true) { Stulogin.Show(); Manlogin.Hide(); managerlogin.Checked = false; } } private void managerlogin_CheckedChanged(object sender, EventArgs e) { if (managerlogin.Checked == true) { Manlogin.Show(); Stulogin.Hide(); studentlogin.Checked = false; } } private void 登录_Load(object sender, EventArgs e) { studentlogin.Checked = true; logintype.Show(); logintype.BackColor = Color.FromArgb(65, 204, 212, 230); Stulogin.Show(); Stulogin.BackColor = Color.FromArgb(65, 204, 212, 230); Manlogin.Hide(); Manlogin.BackColor = Color.FromArgb(65, 204, 212, 230); button1.BackColor = Color.FromArgb(65, 204, 212, 230); sidpassword.Clear(); midpassword.Clear(); }
对登录账号密码进行验证:根据学生跟管理人员的单选框有没有被选中进行判断是学生还是管理员进行登录操作(if-else判断)。采用非连接的方式访问数据库,设置一个DataSet 调用database中获取数据的方法。根据DataSet是否为空,判断是否存在账号。若存在则判断密码与DataSet中的密码字段是否相等,相等就显示登录成功。
代码如下: private void button1_Click(object sender, EventArgs e) { string connstring = @"Data Source = .;Database = DormitoryManager;integrated security = true"; SqlConnection conn = new SqlConnection(connstring); try { conn.Open(); if (studentlogin.Checked == true) { string sid = sidaccount.Text.Trim(); ssid = sid; string sql1 = "select * from Studentlogin where ssid='" + sid + "'";//查找学生账号 DataSet s1 = new DataSet();//new一个对象 s1 = database.获取数据(sql1);//传入查询语句 if (s1 == null)//没有匹配到账户 { MessageBox.Show("该账号不存在!"); } else { string selectpwd1 = s1.Tables[0].Rows[0]["pwd"].ToString(); if (selectpwd1.Trim().Equals(sidpassword.Text.Trim()))//比较输入密码与表中密码是否一致 { MessageBox.Show("恭喜您登录成功!"); 学生管理 f1 = new 学生管理(); f1.Show(); }else { MessageBox.Show("密码错误!", "提示"); } } } else { string mid = midaccount.Text.Trim(); mmid = mid; string sql2 = "select * from Manager where mid='"+mid+"'";//查找管理账号 DataSet s2 = new DataSet();//new一个对象 s2 = database.获取数据(sql2);//传入查询语句 if (s2 == null)//没有匹配到账户 { MessageBox.Show("该账号不存在!"); } else { string selectpwd2 = s2.Tables[0].Rows[0]["pass"].ToString(); if (selectpwd2.Trim().Equals(midpassword.Text.Trim()))//比较输入密码与表中密码是否一致 { MessageBox.Show("恭喜您登录成功!"); 管理人员界面 f2=new 管理人员界面(); f2.Show(); } else { MessageBox.Show("密码错误!", "提示"); } } } } catch (Exception ex) { MessageBox.Show("数据库连接异常!" + ex.Message, "系统消息", MessageBoxButtons.OK, MessageBoxIcon.Information); } finally { conn.Close(); } }
3、宿舍界面
(1)界面展示
(2)界面功能
对宿舍进行增删改查的操作,在文本框输入正确的信息即可实现对宿舍进行添加、修改、删除操作。
代码如下: private void 宿舍更新(string str)//宿舍信息中宿舍信息表更新 { DataSet ds = new DataSet(); ds = database.获取数据(str); if (ds != null) { DorDgv.DataSource = ds.Tables[0]; DorDgv.Columns["did"].HeaderText = "宿舍id"; DorDgv.Columns["bid"].HeaderText = "楼号"; DorDgv.Columns["dnum"].HeaderText = "宿舍号"; DorDgv.Columns["dfloor"].HeaderText = "楼层"; DorDgv.Columns["bed"].HeaderText = "床位数"; DorDgv.Columns["price"].HeaderText = "单价"; } else { DorDgv.DataSource = null; } } private bool IsNotchongfu_d_b(string did, string dnum, string bid) { DataSet ds = new DataSet(); ds = database.获取数据 ("select * from Dormitory where did !='" + did + "'and dnum='" + dnum + "'" + "and bid='" + bid + "'"); if (ds != null) { return false; } else { return true; } } private bool IsNotExist_did(string no) { DataSet ds = new DataSet(); ds = database.获取数据("select * from Dormitory where did='"+no+"'"); if (ds == null) return true; else return false; }
编写宿舍更新方法、判断宿舍记录是否存在。一个是同一栋楼是否有相同的宿舍号,一个是判断宿舍编号是否相同。
代码如下: private void 添加Dor_Click(object sender, EventArgs e)//宿舍信息界面添加宿舍 { string did=didtxt.Text.Trim(); string bid=bidtxt.Text.Trim(); string dnum = dnumtxt.Text.Trim(); string floor=floortxt.Text.Trim(); string bed=bedtxt.Text.Trim(); string price=pricetxt.Text.Trim(); if (didtxt.Text.Trim().Equals("") || bidtxt.Text.Trim().Equals("") || dnumtxt.Text.Trim().Equals("") || floortxt.Text.Trim().Equals("") || bedtxt.Text.Trim().Equals("") || pricetxt.Text.Trim().Equals("")) { if (didtxt.Text.Trim().Equals("")) MessageBox.Show("请输入宿舍id!", "提示"); else if (bidtxt.Text.Trim().Equals("")) MessageBox.Show("请选择楼号!", "提示"); else if (dnumtxt.Text.Trim().Equals("")) MessageBox.Show("请输入宿舍号!", "提示"); else if (floortxt.Text.Trim().Equals("")) MessageBox.Show("请输入楼层!", "提示"); else if (bedtxt.Text.Trim().Equals("")) MessageBox.Show("请输入床位数!", "提示"); else if (pricetxt.Text.Trim().Equals("")) MessageBox.Show("请输入单价!", "提示"); } else if (!IsNotExist_did(didtxt.Text.Trim()) || !IsNotchongfu_d_b(didtxt.Text.Trim(), dnumtxt.Text.Trim(), bidtxt.Text.Trim())) { MessageBox.Show("该记录已存在!", "提示"); return; } else { string sqlStr1; try { sqlStr1 = "insert into Dormitory values('" + didtxt.Text.Trim() + "','" + bidtxt.Text.Trim() + "','" + dnumtxt.Text.Trim() + "','" + floortxt.Text.Trim() + "','" + bedtxt.Text.Trim() + "','" + pricetxt.Text.Trim() + "')"; database.更新(sqlStr1); 宿舍获取(); MessageBox.Show("添加成功!", "提示"); } catch { MessageBox.Show("操作失败!请检查规范", "提示"); } } } private void 修改Dor_Click(object sender, EventArgs e)//宿舍信息界面修改宿舍信息 { if (bidtxt.Text.Trim().Equals("") || didtxt.Text.Trim().Equals("") || dnumtxt.Text.Trim().Equals("") || floortxt.Text.Trim().Equals("") || bedtxt.Text.Trim().Equals("") || pricetxt.Text.Trim().Equals("")) { if (didtxt.Text.Trim().Equals("")) MessageBox.Show("请输入宿舍id!", "提示"); else if (bidtxt.Text.Trim().Equals("")) MessageBox.Show("请选择楼号!", "提示"); else if (dnumtxt.Text.Trim().Equals("")) MessageBox.Show("请输入宿舍号!", "提示"); else if (floortxt.Text.Trim().Equals("")) MessageBox.Show("请输入楼层!", "提示"); else if (bedtxt.Text.Trim().Equals("")) MessageBox.Show("请输入床位数!", "提示"); else if (pricetxt.Text.Trim().Equals("")) MessageBox.Show("请输入单价!", "提示"); } else if (IsNotExist_did(didtxt.Text.ToString().Trim())==true) { MessageBox.Show("该记录不存在!", "提示"); return; } else if (!IsNotchongfu_d_b(didtxt.Text.Trim(), dnumtxt.Text.Trim(), bidtxt.Text.Trim())) { MessageBox.Show("该宿舍记录已存在!", "提示"); return; } else { string sqlStr1; try { sqlStr1 = "update Dormitory set did='" + didtxt.Text.Trim() + "',bid='" +bidtxt.Text.Trim() + "',dnum='" + dnumtxt.Text.Trim() + "',dfloor='" + floortxt.Text.Trim() + "',bed='" + bedtxt.Text.Trim() + "',price='" + pricetxt.Text.Trim()+ "' where did='" + didtxt.Text.Trim() + "'"; database.更新(sqlStr1); 宿舍获取(); MessageBox.Show("修改成功!", "提示"); } catch { MessageBox.Show("操作失败!请检查规范", "提示"); } } } private void 删除Dor_Click(object sender, EventArgs e)//宿舍信息界面删除宿舍 { if (didtxt.Text.Trim().Equals("")) { MessageBox.Show("请输入宿舍id!", "提示"); } else if (!IsNotExist_did(didtxt.Text.ToString().Trim())) { string sqlStr1; if (MessageBox.Show("确定要删除该记录吗?无法撤销!", "删除", MessageBoxButtons.YesNo, MessageBoxIcon.Question, MessageBoxDefaultButton.Button2) == DialogResult.Yes) { try { sqlStr1 = "delete from Dormitory where did='" + didtxt.Text.Trim() + "'"; database.更新(sqlStr1); 宿舍获取(); MessageBox.Show("删除成功!", "提示"); } catch(Exception ex) { MessageBox.Show("操作失败!请检查规范", "提示"); } } else return; } else { MessageBox.Show("该记录不存在!", "提示"); return; } } private void 取消Dor_Click(object sender, EventArgs e) { bidtxt.Text = ""; didtxt.Text = ""; dnumtxt.Text = ""; floortxt.Text = ""; bedtxt.Text = ""; pricetxt.Text = ""; 查询txt.Text = ""; }
编写按钮的点击事件,实现对宿舍的增删改查操作,每次操作完后更新一下DataGridView中的信息。以便管理人员直接看到数据变化。
代码如下: private void 取消Dor_Click(object sender, EventArgs e) { bidtxt.Text = ""; didtxt.Text = ""; dnumtxt.Text = ""; floortxt.Text = ""; bedtxt.Text = ""; pricetxt.Text = ""; 查询txt.Text = ""; } private void button8_Click(object sender, EventArgs e) { 宿舍获取(); }
4、分配宿舍界面
(1)界面展示
(2)界面功能
对未分配的学生分配宿舍,在右边输入正确的信息,查看空宿舍,点击分配宿舍既可给学生分配宿舍。
代码如下: private void 分配宿舍学生信息更新(string str)//分配宿舍表更新 { DataSet ds = new DataSet(); DataTable dt = new DataTable(); ds = database.获取数据(str); if (ds != null) { int count = ds.Tables[0].Rows.Count; dt.Columns.Add("ssid", typeof(string));//添加一列 dt.Columns.Add("sname", typeof(string));//添加一列 dt.Columns.Add("sex", typeof(string));//添加一列 dt.Columns.Add("birth",typeof(string)); dt.Columns.Add("sdept", typeof(string));//添加一列 dt.Columns.Add("class", typeof(string));//添加一列 dt.Columns.Add("phone", typeof(string));//添加一列 for (int i = 0; i < count; i++) { DataRow dr1 = dt.NewRow(); dr1["ssid"] = ds.Tables[0].Rows[i]["ssid"].ToString(); dr1["sname"] = ds.Tables[0].Rows[i]["sname"].ToString(); dr1["sex"] = ds.Tables[0].Rows[i]["sex"].ToString(); dr1["birth"] = ds.Tables[0].Rows[i]["birth"].ToString(); dr1["sdept"] = ds.Tables[0].Rows[i]["sdept"].ToString(); dr1["class"] = ds.Tables[0].Rows[i]["class"].ToString(); dr1["phone"] = ds.Tables[0].Rows[i]["phone"].ToString(); dt.Rows.InsertAt(dr1, 0); } 分配宿舍学生信息.DataSource = dt; 分配宿舍学生信息.Columns["ssid"].HeaderText = "学号"; 分配宿舍学生信息.Columns["sname"].HeaderText = "姓名"; 分配宿舍学生信息.Columns["sex"].HeaderText = "性别"; 分配宿舍学生信息.Columns["birth"].HeaderText = "出生日期"; 分配宿舍学生信息.Columns["sdept"].HeaderText = "专业"; 分配宿舍学生信息.Columns["class"].HeaderText = "班级"; 分配宿舍学生信息.Columns["phone"].HeaderText = "电话"; } else { 分配宿舍学生信息.DataSource = null; } } private void 获取空余宿舍() { DataSet ds = new DataSet(); DataTable dt = new DataTable(); DataSet number = new DataSet(); ds = database.获取数据 ("select * from Dormitory where bed> (select COUNT (StuDormitory.did) from StuDormitory where StuDormitory.did=Dormitory.did) "); if (ds != null) { int count = ds.Tables[0].Rows.Count; dt.Columns.Add("did", typeof(string));//添加一列 dt.Columns.Add("bid", typeof(string));//添加一列 dt.Columns.Add("dnum", typeof(string));//添加一列 dt.Columns.Add("dfloor", typeof(string));//添加一列 dt.Columns.Add("bed", typeof(string));//添加一列 dt.Columns.Add("remain", typeof(string));//添加一列 dt.Columns.Add("price", typeof(string));//添加一列 for (int i = 0; i < count; i++) { DataRow dr1 = dt.NewRow(); dr1["did"] = ds.Tables[0].Rows[i]["did"].ToString(); dr1["bid"] = ds.Tables[0].Rows[i]["bid"].ToString(); dr1["dnum"] = ds.Tables[0].Rows[i]["dnum"].ToString(); try { number = database.获取数据 ("select COUNT(did) from StuDormitory where StuDormitory.did='" + ds.Tables[0].Rows[i]["did"].ToString() + "'"); dr1["remain"] = (Convert.ToInt32(ds.Tables[0].Rows[i]["bed"].ToString()) - Convert.ToInt32(number.Tables[0].Rows[0][0])).ToString(); } catch { dr1["remain"] = "计算失败"; } dr1["dfloor"] = ds.Tables[0].Rows[i]["dfloor"].ToString(); dr1["bed"] = ds.Tables[0].Rows[i]["bed"].ToString(); dr1["price"] = ds.Tables[0].Rows[i]["price"].ToString(); dt.Rows.InsertAt(dr1, 0); } dataGridView1.DataSource = dt; dataGridView1.Columns["did"].HeaderText = "宿舍id"; dataGridView1.Columns["bid"].HeaderText = "楼号"; dataGridView1.Columns["dnum"].HeaderText = "宿舍号"; dataGridView1.Columns["dfloor"].HeaderText = "楼层"; dataGridView1.Columns["bed"].HeaderText = "床位数"; dataGridView1.Columns["price"].HeaderText = "单价"; dataGridView1.Columns["remain"].HeaderText = "剩余床位"; } else { dataGridView1.DataSource = null; } } private bool IsNotExist_OtherSex(string did, string sid) { DataSet ds = new DataSet(); ds = database.获取数据 (@"select * from StuDormitory,Student where StuDormitory.ssid=Student.ssid and did='" + did + "'and sex=(select sex from Student where ssid='" + sid + "')"); if (ds != null) { return true; } else { ds = database.获取数据 (@"select * from StuDormitory where did='" + did + "'"); if (ds != null) { return false; } else return true; } }
编写获取空余宿舍和分配宿舍学生信息更新两个方法,方便后面点击事件的更新和获取学生、宿舍信息数据的代码编写。编写判断原宿舍的成员性别和添加的学生性别是否一致,不一致就拒绝添加。
代码如下: private void 男生rb_CheckedChanged(object sender, EventArgs e)//分配宿舍查询男生信息 { if (男生rb.Checked == true) { string str = "select * from Student where ssid not in(select ssid from StuDormitory) and sex='男'"; 分配宿舍学生信息更新(str); } } private void 女生rb_CheckedChanged(object sender, EventArgs e)//分配宿舍查询女生信息 { if (女生rb.Checked == true) { string str = "select * from Student where ssid not in(select ssid from StuDormitory) and sex='女'"; 分配宿舍学生信息更新(str); } } private void allrb_CheckedChanged(object sender, EventArgs e)//分配宿舍查询所有信息 { if (allrb.Checked) { string str = "select * from Student where ssid not in(select ssid from StuDormitory )"; 分配宿舍学生信息更新(str); } }
编写按钮点击事件,实现对未分配宿舍的学生进行宿舍分配。
代码如下: private void 分配宿舍查询_Click(object sender, EventArgs e)//分配宿舍查询空宿舍信息 { 获取空余宿舍(); } private void 分配宿舍Bt_Click(object sender, EventArgs e) { if (分配宿舍宿舍编号txt.Text.Equals("") || 分配宿舍学号txt.Text.Equals("")) { MessageBox.Show("缺少选中数据!", "提示"); return; } else { if (!IsNotExist_OtherSex(分配宿舍宿舍编号txt.Text.Trim(), 分配宿舍学号txt.Text.Trim())) { MessageBox.Show("该宿舍已经有其他性别的学生!", "提示"); return; } try { string str2 = @" insert into StuDormitory values('" + 分配宿舍宿舍编号txt.Text.Trim() + "','" + 分配宿舍学号txt.Text.Trim() + "')"; database.更新(str2); 分配宿舍楼号txt.Text = ""; 分配宿舍宿舍编号txt.Text = ""; 分配宿舍宿舍号txt.Text = ""; 分配宿舍学号txt.Text = ""; 分配宿舍性别txt.Text = ""; 分配宿舍姓名txt.Text = ""; 分配宿舍学生信息更新(@"select * from Student where not exists( select * from StuDormitory where ssid=Student.ssid )"); 获取空余宿舍(); MessageBox.Show("操作完成", "提示"); } catch { MessageBox.Show("操作失败!", "提示"); } } }
七、系统测试(部分功能)
1、学生登录
(1)查看个人信息:
(2)查看宿舍信息:
可以查看宿舍成员以及宿舍的基本信息。
(3)申请更换宿舍:
学生提交申请更换宿舍的请求,最后一个列数值为1表示还未被处理。
2、管理人员登录(用权限为1管理员登录可以进行所有操作):
(1)宿舍楼管理:
添加宿舍楼:
修改宿舍楼信息:
删除宿舍楼信息:
(2)宿舍管理:
添加宿舍信息:
删除宿舍信息:
总结
此次课程设计使用了SQL Server与VS中的Window 窗体应用相结合,根据实际情况进行需求分析,设计学生宿舍管理系统。该系统解决高校传统方式进行学生宿舍管理的缺点,极大提高了学生宿舍管理的效率。系统还存在许多功能没有完善,例如对宿舍报修的处理、对宿舍放假回家的出入统计等功能。接下来可以继续增添这方面的功能来完善该系统。