草庐IT

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

不下水的鸭 2023-04-10 原文

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


前言

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

有关【数据库课程设计】SQLServer数据库课程设计(学生宿舍管理),课设报告+源码+数据库关系图的更多相关文章

  1. ruby-on-rails - Rails - 子类化模型的设计模式是什么? - 2

    我有一个模型:classItem项目有一个属性“商店”基于存储的值,我希望Item对象对特定方法具有不同的行为。Rails中是否有针对此的通用设计模式?如果方法中没有大的if-else语句,这是如何干净利落地完成的? 最佳答案 通常通过Single-TableInheritance. 关于ruby-on-rails-Rails-子类化模型的设计模式是什么?,我们在StackOverflow上找到一个类似的问题: https://stackoverflow.co

  2. ruby - 解析 RDFa、微数据等的最佳方式是什么,使用统一的模式/词汇(例如 schema.org)存储和显示信息 - 2

    我主要使用Ruby来执行此操作,但到目前为止我的攻击计划如下:使用gemsrdf、rdf-rdfa和rdf-microdata或mida来解析给定任何URI的数据。我认为最好映射到像schema.org这样的统一模式,例如使用这个yaml文件,它试图描述数据词汇表和opengraph到schema.org之间的转换:#SchemaXtoschema.orgconversion#data-vocabularyDV:name:namestreet-address:streetAddressregion:addressRegionlocality:addressLocalityphoto:i

  3. ruby-on-rails - 使用 rails 4 设计而不更新用户 - 2

    我将应用程序升级到Rails4,一切正常。我可以登录并转到我的编辑页面。也更新了观点。使用标准View时,用户会更新。但是当我添加例如字段:name时,它​​不会在表单中更新。使用devise3.1.1和gem'protected_attributes'我需要在设备或数据库上运行某种更新命令吗?我也搜索过这个地方,找到了许多不同的解决方案,但没有一个会更新我的用户字段。我没有添加任何自定义字段。 最佳答案 如果您想允许额外的参数,您可以在ApplicationController中使用beforefilter,因为Rails4将参数

  4. ruby - Ruby 有 `Pair` 数据类型吗? - 2

    有时我需要处理键/值数据。我不喜欢使用数组,因为它们在大小上没有限制(很容易不小心添加超过2个项目,而且您最终需要稍后验证大小)。此外,0和1的索引变成了魔数(MagicNumber),并且在传达含义方面做得很差(“当我说0时,我的意思是head...”)。散列也不合适,因为可能会不小心添加额外的条目。我写了下面的类来解决这个问题:classPairattr_accessor:head,:taildefinitialize(h,t)@head,@tail=h,tendend它工作得很好并且解决了问题,但我很想知道:Ruby标准库是否已经带有这样一个类? 最佳

  5. ruby - Rails 关联 - 同一个类的多个 has_one 关系 - 2

    我的问题的一个例子是体育游戏。一场体育比赛有两支球队,一支主队和一支客队。我的事件记录模型如下:classTeam"Team"has_one:away_team,:class_name=>"Team"end我希望能够通过游戏访问一个团队,例如:Game.find(1).home_team但我收到一个单元化常量错误:Game::team。谁能告诉我我做错了什么?谢谢, 最佳答案 如果Gamehas_one:team那么Rails假设您的teams表有一个game_id列。不过,您想要的是games表有一个team_id列,在这种情况下

  6. ruby - 我如何添加二进制数据来遏制 POST - 2

    我正在尝试使用Curbgem执行以下POST以解析云curl-XPOST\-H"X-Parse-Application-Id:PARSE_APP_ID"\-H"X-Parse-REST-API-Key:PARSE_API_KEY"\-H"Content-Type:image/jpeg"\--data-binary'@myPicture.jpg'\https://api.parse.com/1/files/pic.jpg用这个:curl=Curl::Easy.new("https://api.parse.com/1/files/lion.jpg")curl.multipart_form_

  7. 世界前沿3D开发引擎HOOPS全面讲解——集3D数据读取、3D图形渲染、3D数据发布于一体的全新3D应用开发工具 - 2

    无论您是想搭建桌面端、WEB端或者移动端APP应用,HOOPSPlatform组件都可以为您提供弹性的3D集成架构,同时,由工业领域3D技术专家组成的HOOPS技术团队也能为您提供技术支持服务。如果您的客户期望有一种在多个平台(桌面/WEB/APP,而且某些客户端是“瘦”客户端)快速、方便地将数据接入到3D应用系统的解决方案,并且当访问数据时,在各个平台上的性能和用户体验保持一致,HOOPSPlatform将帮助您完成。利用HOOPSPlatform,您可以开发在任何环境下的3D基础应用架构。HOOPSPlatform可以帮您打造3D创新型产品,HOOPSSDK包含的技术有:快速且准确的CAD

  8. FOHEART H1数据手套驱动Optitrack光学动捕双手运动(Unity3D) - 2

    本教程将在Unity3D中混合Optitrack与数据手套的数据流,在人体运动的基础上,添加双手手指部分的运动。双手手背的角度仍由Optitrack提供,数据手套提供双手手指的角度。 01  客户端软件分别安装MotiveBody与MotionVenus并校准人体与数据手套。MotiveBodyMotionVenus数据手套使用、校准流程参照:https://gitee.com/foheart_1/foheart-h1-data-summary.git02  数据转发打开MotiveBody软件的Streaming,开始向Unity3D广播数据;MotionVenus中设置->选项选择Unit

  9. 使用canal同步MySQL数据到ES - 2

    文章目录一、概述简介原理模块二、配置Mysql使用版本环境要求1.操作系统2.mysql要求三、配置canal-server离线下载在线下载上传解压修改配置单机配置集群配置分库分表配置1.修改全局配置2.实例配置垂直分库水平分库3.修改group-instance.xml4.启动监听四、配置canal-adapter1修改启动配置2配置映射文件3启动ES数据同步查询所有订阅同步数据同步开关启动4.验证五、配置canal-admin一、概述简介canal是Alibaba旗下的一款开源项目,Java开发。基于数据库增量日志解析,提供增量数据订阅&消费。Git地址:https://github.co

  10. ruby-on-rails - 创建 ruby​​ 数据库时惰性符号绑定(bind)失败 - 2

    我正在尝试在Rails上安装ruby​​,到目前为止一切都已安装,但是当我尝试使用rakedb:create创建数据库时,我收到一个奇怪的错误:dyld:lazysymbolbindingfailed:Symbolnotfound:_mysql_get_client_infoReferencedfrom:/Library/Ruby/Gems/1.8/gems/mysql2-0.3.11/lib/mysql2/mysql2.bundleExpectedin:flatnamespacedyld:Symbolnotfound:_mysql_get_client_infoReferencedf

随机推荐