【数据库课程设计】SQLServer数据库课程设计(学生宿舍管理),课设报告+源码+数据库关系图

news2024/11/24 1:11:28

数据库课程设计——学生宿舍管理,需要全部源码可以关注私信我,把邮箱发在评论区

  • 前言
  • 一、课题背景和开发环境
    • 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 窗体应用相结合,根据实际情况进行需求分析,设计学生宿舍管理系统。该系统解决高校传统方式进行学生宿舍管理的缺点,极大提高了学生宿舍管理的效率。系统还存在许多功能没有完善,例如对宿舍报修的处理、对宿舍放假回家的出入统计等功能。接下来可以继续增添这方面的功能来完善该系统。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/86974.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

传染病模型3

一、研究方向 建立传染病的数学模型描述传染病的传播过程 分析感染人数的变化规律&#xff0c;预测传染病高峰的到来 探索控制、根除、预防传染病传播蔓延的手段 二、舱室 流行病学中的一大类模型&#xff0c;称为“舱室”模型&#xff0c;它是将人群分成若干个“舱室…

为什么机器码、汇编不可移植,而C语言可以移植?

1、机器码不可移植的原因 机器码&#xff08;二进制&#xff09;是处理器能直接识别的语言&#xff0c;不同的机器码代表不同的运算指令&#xff0c;处理器可以识别哪些机器码是由处理器的硬件设备决定的&#xff0c;不同的处理器机器码可能不同。 比如在ARM处理器上加法可能…

Linux 线程池

文章目录线程池的定义使用线程池的原因基于POSIX实现的线程池基于block队列的线程池实现基于ring队列的线程池实现设计单例模式线程池线程池的定义 线程池就一堆已经创建好的任务线程&#xff0c;初始它们都处于空闲等待状态&#xff0c;当有新的任务需要处理的时候&#xff0…

大话设计模型 Task01:设计原则

目录1. 单一职责原则&#xff08;SRP&#xff09;使用动机如何使用2. 开闭原则&#xff08;OCP&#xff09;使用动机如何使用使用原则3. 依赖倒置原则&#xff08;DIP&#xff09;使用动机使用原则4. 里氏替换原则&#xff08;LSP&#xff09;使用动机5. 迪米特法则&#xff08…

12、MInio文件系统的使用小记一

前言&#xff1a;文档存储从最初的文本文档发展到现在的图片视频存储&#xff0c;存储容器也从数据库演变成了文件系统&#xff0c;目前市面上提供云存储的公司很多&#xff0c;百度腾讯阿里华为等&#xff0c;这些公司都有成熟的文件存储方案及restapi接口&#xff0c;很方便&…

Docker-网络配置

目录 一&#xff0c;网络模式 1.bridge模式&#xff08;默认模式&#xff09; 2.host模式 二&#xff0c;bridge模式 三&#xff0c;host模式 网络模式与数据卷容器挂载的操作 三&#xff0c;如何创建自定义网络 一&#xff0c;网络模式 Docker在创建容器时有四种网络模式…

Sulfo CY5-马来酰亚胺|Cyanine5 MAL菁染料CY5标记

Sulfo CY5-马来酰亚胺|Cyanine5 MAL菁染料CY5标记 Cyanine5 maleimide是单一活性染料&#xff0c;有选择性的与硫醇基团&#xff08;比如蛋白和多肽的半胱氨酸&#xff09;结合以进行标记。我们使用水溶的Sulfo-Cyanine5 maleimide标记抗体和其他敏感蛋白。Cyanine5是Cy5的类似…

web前端设计与开发期末作品_期末大作业【使用HTML制作汽车首页】

&#x1f389;精彩专栏推荐 &#x1f4ad;文末获取联系 ✍️ 作者简介: 一个热爱把逻辑思维转变为代码的技术博主 &#x1f482; 作者主页: 【主页——&#x1f680;获取更多优质源码】 &#x1f393; web前端期末大作业&#xff1a; 【&#x1f4da;毕设项目精品实战案例 (10…

校园二手商品交易平台的设计与实现(J2EE)

目 录 摘要 I Abstract II 目录 III 1 绪论 1 1.1 课题研究背景及意义 1 1.2 本课题主要工作 1 2 系统相关技术 3 2.1 J2EE技术 3 2.2 MVC模式 4 2.3 B/S结构 4 2.4 数据库技术 4 3 系统需求分析 6 3.1 用户功能需求 6 3.2 系统可行性分析 6 3.2.1 技术可行性 6 3.2.2 经济可行…

Qt扫盲-QComboBox理论总结

QComboBox理论总结1. 简述2. 显示内容3. 信号4. 常用功能5. model/view 使用1. 简述 QComboBox 提供了一种以占用最小屏幕空间的方式向用户显示选项列表的方法。QCombox是显示当前项目的选择小部件&#xff0c;可以弹出可选项目的列表。QComBox其实就是一个下拉列表。选择的项…

做短视频开直播要不要买流量?

我是卢松松&#xff0c;点点上面的头像&#xff0c;欢迎关注我哦&#xff01; 做短视频要不要买流量&#xff0c;开直播要不要买流量&#xff0c;买了流量以后是不是就要一直买&#xff0c;不买就没有免费流量了? 在这儿给大家普及一下这件事&#xff1a; 在买流量之前呢&…

一种多臂PEG衍生物——8-Arm peg-Biotin,8-Arm PEG-Biotin,八臂PEG生物素

英文名称&#xff1a;8-Arm peg-Biotin 中文名称&#xff1a;八臂-聚乙二醇-生物素 8臂PEG生物素是一种多臂PEG衍生物&#xff0c;在连接到一个六甘油核心的八个臂的每个末端具有生物素基团。PEG生物素可通过与链霉亲和素和抗生物素结合进行聚乙二醇化&#xff0c;具有高亲和…

python语言Django框架搭建学生信息管理系统

1.系统介绍 本系统是基于Django 2.2.3开发的,面向学生信息管理系统。 系统以学生个体为核心向外拓展诸如宿舍、班级、学生组织等一系列组,诸如请假、签到、通知发布等一系列应用。 计划内实现功能有:班级、学生、宿舍三大项为基础的信息管理系统,早检、晨跑、卫检及相应…

ASFormer:Transformer for Action Segmentation论文阅读笔记

摘要 为了解决动作分割类问题&#xff0c;作者设计了一个高效的基于transformer的动作分割任务模型&#xff0c;ASFormer&#xff0c;该模型具有以下三个特征&#xff1a; &#xff08;i&#xff09;由于特征的高局部性&#xff0c;作者明确地引入了局部连通性归纳先验。它将假…

经典文献阅读之--Swin Transformer

0. 简介 Transfomer最近几年已经霸榜了各个领域&#xff0c;之前我们在《经典文献阅读之–Deformable DETR》这篇博客中对DETR这个系列进行了梳理&#xff0c;但是想着既然写了图像处理领域的方法介绍&#xff0c;正好也按照这个顺序来对另一个非常著名的Swin Transformer框架…

Qt-Web混合开发-QWebEnginePage权限管理(3)

Qt-Web混合开发-使用QWebEnginePage打开摄像头演示权限管理&#x1f3f3;️‍&#x1f308; 文章目录Qt-Web混合开发-使用QWebEnginePage打开摄像头演示权限管理&#x1f3f3;️‍&#x1f308;1、概述&#x1f6a9;2、实现效果&#x1f97d;3、实现功能&#x1f50a;4、关键代…

PodSummPreSumm

PodSumm&#xff1a;播客音频摘要 论文地址 简介 最近播客的流行给现有的内容发现和推荐系统带来了巨⼤的机遇和⼀系列独特的挑战。与听音乐不同&#xff0c;播客通常需要听众长时间积极关注。演讲者的演讲风格、幽默类型或制作质量等主观属性可能会影响听众的偏好&#xff…

CVPR2022 | 动作识别框架新范式 STRM,用最小的样本获得最高的精度

论文题目&#xff1a;Spatio-temporal Relation Modeling for Few-shot Action Recognition 论文连接&#xff1a;https://arxiv.org/abs/2112.05132v2 代码连接&#xff1a;https://github.com/Anirudh257/strm 综述 我们提出了一种few-shot动作识别框架STRM&#xff0c;它…

非线性非高斯模型的改进粒子滤波算法(Matlab代码实现)

&#x1f468;‍&#x1f393;个人主页&#xff1a;研学社的博客 &#x1f4a5;&#x1f4a5;&#x1f49e;&#x1f49e;欢迎来到本博客❤️❤️&#x1f4a5;&#x1f4a5; &#x1f3c6;博主优势&#xff1a;&#x1f31e;&#x1f31e;&#x1f31e;博客内容尽量做到思维缜…

unordered_mapunordered_set的应用以及底层实现(哈希表)

文章目录1️⃣unordered系列关联容器unordered_setunordered_map2️⃣底层结构哈希概念哈希冲突哈希函数常见的哈希函数哈希冲突解决闭散列线性探测的实现开散列开散列的概念开散列的实现3️⃣模拟实现unordered_map&&unordered_set哈希表的改造unordered_setunordered…