记录|链接MySQL数据库实现学生管理系统

news2024/9/22 15:29:13

目录

  • 前言
  • 一、管理系统的后台数据库
    • 1.1 创建DB库
    • 1.2 创建login表和student表
      • login表
      • student表
  • 二、窗体创建
    • 1.1 VS项目框架
    • 1.2 窗口1设计:登录窗口
      • 所需控件
      • 界面效果
    • 1.3 窗口2设计:学生信息管理界面
      • 添加新界面
      • 所需控件
      • 界面效果
    • 1.4 窗口3设计:信息输入界面
      • 添加新界面
      • 所需控件
      • 界面效果
  • 三、数据库链接
    • 3.1 创建Student类【与数据库的student表对应】
    • 3.2 连接MySQL数据库
      • 3.2.1 前提:MySql.Data.dll
      • 3.2.2 引用MySql.Data.dll
        • 方法1:
        • 方法2:NuGet
      • 3.2.3 连接MySQL数据库
        • Step1. 新建MySqlOpHelper类
  • 四、登录功能的实现
    • 4.1 使用自建的MySqlOpHelper类
    • 4.2 效果展示
      • 成功
      • 失败
  • 五、查询功能的实现
    • Step1. Manager.cs
    • 5.2 效果展示
  • 六、新增学生信息
    • 6.1 思路
    • 6.2 “新增”按钮事件
    • 6.3 “保存”按钮事件
    • 6.4 效果展示
  • 七、删除学生信息
    • 7.1 Manager.cs
    • 7.2 效果展示
  • 八、修改功能的实现
    • 8.1 DataGridView中的DataSource数据
    • 8.2 Manager.cs
    • 8.3 效果展示
  • 九、排序功能实现【待更新】
    • 9.1 代码实现
    • 9.2 效果展示
  • 更新时间


前言

参考文章:
[完整教程]C#WinForm连接MySQL数据库实现学生管理系统

目的:学习链接、学习winform中的GridView控件如何使用、学习界面跳转。


一、管理系统的后台数据库

1.1 创建DB库

CREATE DATABASE studentmanagersystem;

1.2 创建login表和student表

login表

  • 在studentmanagersystem库中创建个login表【代码如下】
create table login(
username VARCHAR(50) PRIMARY KEY,
passwd VARCHAR(50) not NULL
)
  • 在login表中添加两条数据【如下图】
    在这里插入图片描述

student表

  • 在studentmanagersystem库中创建个student表【代码如下】
CREATE TABLE student(
sNo INT PRIMARY KEY,
sName VARCHAR(50) not NULL,
sAge INT NOT NULL,
sex VARCHAR(50) NOT Null,
grade INT NOT NULL 
)
  • 创建2条数据【如下图】
    在这里插入图片描述

二、窗体创建

1.1 VS项目框架

  • 选择"Windows窗体应用(.NET Framework)"【如下图】,并重命名项目为:StudentManagerSystem
    在这里插入图片描述

1.2 窗口1设计:登录窗口

所需控件

  • 2个Label
  • 2个textBox
  • 1个Button

界面效果

在这里插入图片描述

1.3 窗口2设计:学生信息管理界面

添加新界面

在这里插入图片描述

所需控件

  • 1个DataGridView
  • 1个TextBox
  • 5个Button

界面效果

在这里插入图片描述

1.4 窗口3设计:信息输入界面

添加新界面

在这里插入图片描述

所需控件

  • 5个Label
  • 5个TextBox
  • 1个Button

界面效果

在这里插入图片描述


三、数据库链接

3.1 创建Student类【与数据库的student表对应】

  • Student类是为了和DB库中的student表中属性进行映射
    在这里插入图片描述

  • 新建“Student”,【如下图】【代码如下】
    在这里插入图片描述

    internal class Student
    {
        public int sNO { get;set; }
        public string sName { get;set; }
        public int sAge { get; set; }
        public string sex { get; set; }
        public int grade { get;set; }

        public Student(int sNO, string sName, int sAge, string sex, int grade)
        {
            this.sNO = sNO;
            this.sName = sName;
            this.sAge = sAge;
            this.sex = sex;
            this.grade = grade;
        }

        public override string ToString()
        {
            return $"学生信息:学号:{sNO.ToString()} 姓名:{sName} 年龄:{sAge.ToString()} 性别:{sex} 成绩:{grade.ToString()}";
        }
    }

3.2 连接MySQL数据库

3.2.1 前提:MySql.Data.dll

一般是在MYSQL安装器内,有.NET相关的部分。

3.2.2 引用MySql.Data.dll

方法1:

在Visual Studio的“解决方案资源管理器”里,选择“引用”,右键“添加引用”,添加对应版本的MySql.Data.dll动态库文件。

如何找到:找到对应的.NET版本(选择项目,右键属性,查看目标框架)文件路径的MySql.Data.dll动态库。

方法2:NuGet

如果没有MySql.Data.dll,那就需要通过NuGet下载获得。

  • 选择“工具”,点击“NuGet包管理器”,选择“管理解决方案的NuGet程序包”【如下图】
    在这里插入图片描述
  • 搜索“mysql.data”,并安装第一个【如下图】
    在这里插入图片描述

3.2.3 连接MySQL数据库

创建连接字符串 -> MySqlConnection对象 -> MySqlCommand对象
为了代码组织更方便,这里创建一个数据库操作类(MySqlOpHelper),方便操作数据库。

Step1. 新建MySqlOpHelper类
  • conStr:一个私有字符串变量,用于存储数据库连接字符串。
  • msc:一个私有的MySqlConnection对象,用于建立与MySQL数据库的连接。
  • msco:一个私有的MySqlCommand对象,用于执行SQL命令。
  • msdr:一个私有的MySqlDataReader对象,用于读取从数据库返回的数据。
  • dics:一个公共字典,用于存储登录信息(用户名和密码)。
  • stus:一个公共列表,用于存储学生信息(尽管在这段代码中没有使用)

具体代码如下:

/*
 * 功 能:     N/A
 * 创建时间:  2024/8/19 15:47:40
 * 创建人:     17642
*/
using MySql.Data.MySqlClient;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;

namespace StudentManagerSystem.manager
{
    internal class MySqlOpHelper
    {
        private string conStr = null;
        private MySqlConnection msc = null;
        private MySqlCommand msco = null;
        private MySqlDataReader msdr = null;
        //操作系统登录,存储用户名和密码
        public Dictionary<string, string> dics = null;
        public List<Student> stus = null;
        public MySqlOpHelper(string conStr)
        {
            this.conStr = conStr ?? throw new ArgumentNullException(nameof(conStr));
        }
        /// <summary>
        /// 用户登录
        /// </summary>
        /// <param name="queryStr"></param>
        public void OpLoginMySql(string queryStr)
        {
            try
            {
                msc = new MySqlConnection(conStr);
                msc.Open();
                msco = new MySqlCommand(queryStr, this.msc);
                msdr = msco.ExecuteReader();
                dics = new Dictionary<string, string>();
                while (msdr.Read())
                {
                    dics.Add(msdr[0].ToString(), msdr[1].ToString());
                }
            }
            catch
            {
                MessageBox.Show("登录失败!","用户登录",MessageBoxButtons.OK,MessageBoxIcon.Error);
            }
            finally
            {
                msco.Dispose();
                msc.Close();
            }
        }
        /// <summary>
        /// 数据库操作 增删改
        /// </summary>
        /// <param name="opStr"></param>
        public void OpAddDeleteUpdateMysql(string opStr)
        {
            try
            {
                msc = new MySqlConnection(conStr);
                msco = new MySqlCommand(opStr, this.msc);
                msc.Open();
                msco.ExecuteNonQuery();
                MessageBox.Show("操作成功","数据库操作",MessageBoxButtons.OK,MessageBoxIcon.Information);
            }
            catch
            {
                MessageBox.Show("操作失败!","数据库操作",MessageBoxButtons.OK,MessageBoxIcon.Error);
            }
            finally
            {
                msco.Dispose();
                msc.Close();
            }
        }
        /// <summary>
        /// 数据操作 查
        /// </summary>
        /// <param name="queryStr"></param>
        public void OpQueryMySql(string queryStr)
        {
            try
            {
                msc = new MySqlConnection(conStr);
                msco = new MySqlCommand(queryStr, this.msc);
                msc.Open();
                msdr = msco.ExecuteReader();
                stus = new List<Student>();
                while (msdr.Read())
                {
                    stus.Add(new Student(int.Parse(msdr[0].ToString()), msdr[1].ToString(), int.Parse(msdr[2].ToString()),
                        msdr[3].ToString(), int.Parse(msdr[4].ToString()) ));
                }
            }
            catch
            {
                MessageBox.Show("查询失败","数据库查询",MessageBoxButtons.OK,MessageBoxIcon.Error);
            }
            finally
            {
                msco.Dispose();
                msc.Close();
            }
        }


    }
}


四、登录功能的实现

4.1 使用自建的MySqlOpHelper类

在登录界面的.cs文件中创建如下代码:

using StudentManagerSystem.manager;
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;

namespace StudentManagerSystem
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }
        // 数据库链接字符串
        string conStr = "server=127.0.0.1;" +
            "port=3306;" +
            "user=root;" +
            "password=0000;" +
            "database=studentmanagersystem";
        // 查询语句
        string sqlLogin = "select username,passwd from login;";

        private void btnLogin_Click(object sender, EventArgs e)
        {
            UserLoading();
        }
        /// <summary>
        /// 用户登录方法
        /// </summary>
        private void UserLoading()
        {
            MySqlOpHelper msoh = new MySqlOpHelper(conStr);
            msoh.OpLoginMySql(sqlLogin);
            //对比账号和密码是否有同时匹配上的
            bool isConnect=false;//标记是否连接上
            foreach (var i in msoh.dics)
            {
                if (txtUsername.Text == i.Key.ToString() && txtPasswd.Text == i.Value.ToString())
                {
                    isConnect = true;
                    break;
                }
            }
            //根据连接转态给予反馈
            if (isConnect) {
                new Manager().Show(); //打开管理界面
                this.Hide(); //隐藏当前页面
            }
            else
            {
                MessageBox.Show("登录失败!", "用户登录", MessageBoxButtons.OK, MessageBoxIcon.Error);
            }
        }
    }
}

对于上面的server=127.0.0.1。这是个本地回环地址(localhost)。

4.2 效果展示

成功

在这里插入图片描述

失败

在这里插入图片描述


五、查询功能的实现

Step1. Manager.cs

在Manager.cs中要全局定义:

  • 数据库链接字符创conStr
  • 查询语句sqlQuery 【这里直接写死,点击查询按钮直接能获得库中所有的信息】
    代码如下:
        string conStr = "server=127.0.0.1;" +
            "port=3306;" +
            "user=root;" +
            "password=0000;" +
            "database=studentmanagersystem";
        string sqlQuery = "select * from student";
        private void btnSelect_Click(object sender, EventArgs e)
        {
            QueryAll();
        }
        /// <summary>
        /// 查询方法
        /// </summary>
        private void QueryAll()
        {
            MySqlOpHelper msoh = new MySqlOpHelper(conStr);
            msoh.OpQueryMySql(sqlQuery);
            //将datagridview的数据源设置为msoh对象的一个List数据成员stus。
            dgvShow.DataSource = msoh.stus;

        }

5.2 效果展示

在这里插入图片描述

六、新增学生信息

6.1 思路

这里是点击“新增”按钮后,会弹出新界面“信息输入”,在这个窗口中进行编辑,点击保存后,新增成功。

6.2 “新增”按钮事件

  • 点击按钮,实现跳转到新界面【Manager.cs中代码如下】
        private void btnInsert_Click(object sender, EventArgs e)
        {
            new StudentInfoInput().Show();
        }

上面代码能实现,点击“新增”按钮后,跳转到信息输入界面【即如下界面】
在这里插入图片描述

6.3 “保存”按钮事件

  • “保存”按钮事件为:
  • 链接数据库
  • 插入数据
    具体代入如下所示:【在StudentInfoInput.cs中】
    public partial class StudentInfoInput : Form
    {
        public StudentInfoInput()
        {
            InitializeComponent();
        }
        string conStr = "server = 127.0.0.1;" +
            "port=3306;" +
            "user=root;" +
            "password= 0000;" +
            "database=studentmanagersystem";
        private void btnSave_Click(object sender, EventArgs e)
        {
            string sqlInsert = $"insert into student(sNo,sName,sAge,sex,grade) values(" +
                $"{int.Parse(txtStuNo.Text)}," +
                $"'{txtStuName.Text}'," +
                $"{int.Parse(txtStuAge.Text)}," +
                $"'{txtSex.Text}'," +
                $"{int.Parse(txtStuGrade.Text)});";
            MySqlOpHelper msoh = new MySqlOpHelper(conStr);
            msoh.OpAddDeleteUpdateMysql(sqlInsert);
            // 输入完之后,几个文本框要置为null
            txtStuNo.Text = null;
            txtStuName.Text = null;
            txtStuAge.Text = null;
            txtSex.Text = null;
            txtStuGrade.Text = null;
        }
    }

6.4 效果展示

在这里插入图片描述


七、删除学生信息

7.1 Manager.cs

  • 重点是获得当前鼠标选中的DataGridView中的那一行所对应的数据。
  • studs是个Student型的List,被封装在MySqlOpHelper类中。
    代码如下:
        private void DeleteInfo()
        {
            // 获取选择行的Student对象
            Student currentSelectedStu = msoh.stus[dgvShow.CurrentRow.Index];
            string sqlDelete = $"delete from student where sNo = {currentSelectedStu.sNO};";
            msoh = new MySqlOpHelper(conStr);
            msoh.OpAddDeleteUpdateMysql(sqlDelete);
        }

注意:

  • 这里的获取选择行的Student对象和sqlDelete语句一定是在msoh=new MySqlOpHelper(conStr);的前面。
  • 应为msoh = new MySqlOpHelper(conStr);会将msoh进行重置,即stus=null;

7.2 效果展示

在这里插入图片描述

八、修改功能的实现

8.1 DataGridView中的DataSource数据

要进行修改,需要了解DataSource中的存的数据是什么样的形式【如下图】
在这里插入图片描述
在这里插入图片描述

8.2 Manager.cs

        private void btnAlter_Click(object sender, EventArgs e)
        {
            UpdateInfo();
        }
                /// <summary>
        /// 修改信息方法
        /// </summary>
        private void UpdateInfo()
        {
            //获取当前选择行的行号
            Student currentSelectedStu = msoh.stus[dgvShow.CurrentRow.Index];
            string sqlUpdate = $"update student set sName='{dgvShow["sName", dgvShow.CurrentRow.Index].Value}'," +
                $"sAge={dgvShow["sAge", dgvShow.CurrentRow.Index].Value}," +
                $"sex='{dgvShow["sex", dgvShow.CurrentRow.Index].Value}'," +
                $"grade={dgvShow["grade", dgvShow.CurrentRow.Index].Value}" +
                $"where sNo={currentSelectedStu.sNo};";
            msoh = new MySqlOpHelper(conStr);
            msoh.OpAddDeleteUpdateMysql(sqlUpdate);
        }

8.3 效果展示

在这里插入图片描述


九、排序功能实现【待更新】

9.1 代码实现

这里的排序功能,主要是利用了List中的sort()函数进行排序

  • 固定是按照“成绩Grade”进行降序排序
  • 注意,排完序后要进行更新DataGridView的数据源。
        private void btnSort_Click(object sender, EventArgs e)
        {
            SortByGrade();
        }
  
        private void SortByGrade()
        {

            if (msoh!=null)
            {
                msoh = new MySqlOpHelper(conStr);
                msoh.OpQueryMySql(sqlQuery); //这步生成了stus List集合
                                             //按Student对象的方式进行排序
                msoh.stus.Sort(delegate (Student stu1, Student stu2)
                {
                    return stu2.grade.CompareTo(stu1.grade);
                });
                //排序后,要更新DataGridView的数据源
                dgvShow.DataSource = msoh.stus;
            }
            else
            {
                MessageBox.Show("排序失败!","排序",MessageBoxButtons.OK,MessageBoxIcon.Error);
            }

9.2 效果展示

在这里插入图片描述


更新时间

  • 2024.08.19:创建+复刻第一章~第八章。

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

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

相关文章

用低代码平台搭建了一套贷前进件系统,1天搞定!

贷前进件系统是什么 贷前进件系统是指金融机构&#xff08;如银行、消费金融公司等&#xff09;在贷款申请过程中&#xff0c;用于收集、整理、审核和管理借款人申请资料的系统。该系统是贷款流程中的重要环节&#xff0c;主要作用在于提高贷款申请的处理效率&#xff0c;降低…

滑动变阻器的未来发展趋势和前景如何?是否有替代品出现?

滑动变阻器是常见的电子元件&#xff0c;主要用于调节电路中的电阻值。随着科技的不断发展&#xff0c;滑动变阻器的未来发展趋势和前景也引起了广泛关注。 滑动变阻器的未来发展将更加注重智能化&#xff0c;随着物联网、人工智能等技术的快速发展&#xff0c;滑动变阻器也将与…

Transformer中的位置编码:绝对位置编码、相对位置编码与旋转位置编码

1. 引言 Transformer模型自2017年提出以来&#xff0c;凭借其在序列到序列任务中的优异表现&#xff0c;迅速成为自然语言处理&#xff08;NLP&#xff09;领域的主流模型。与传统的循环神经网络&#xff08;RNN&#xff09;不同&#xff0c;Transformer模型完全基于自注意力机…

Java 入门指南:反射机制

RTTI RTTI&#xff08;Run-Time Type Identification&#xff09;是一种在运行时确定对象类型的机制。它是一种编程语言特性&#xff0c;主要用于在运行时动态识别和处理对象的实际类型。 通过 RTTI&#xff0c;可以在运行时根据对象的实际类型执行相应的操作。这在处理多态对…

sdn nce insight

SDN&#xff08;Software-Defined Networking&#xff09; 和 NFV&#xff08;Network Functions Virtualization&#xff09; 是现代网络架构中的两项关键技术&#xff0c;它们共同推动了网络的虚拟化、自动化和灵活性。尽管它们各自有不同的焦点和应用领域&#xff0c;但通常…

HarmonyOS应用四之页面加载构建以及数据请求

目录&#xff1a; 1、加载网络页面/本地页面/html页面2、页面布局3、HTTP/HTTPS的数据请求4、上传图片并保存数据 1、加载网络页面/本地页面/html页面 // xxx.ets import { webview } from kit.ArkWeb; import { BusinessError } from kit.BasicServicesKit;Entry Component s…

Java面试八股之消息队列中推模式和拉模式分别有哪些使用场景

消息队列中推模式和拉模式分别有哪些使用场景 消息队列的推模式&#xff08;Push&#xff09;和拉模式&#xff08;Pull&#xff09;各有不同的使用场景和优缺点。下面我会详细介绍这两种模式及其适用场景&#xff1a; 推模式&#xff08;Push&#xff09; 特点&#xff1a;…

进哥在线shinyapps工具(自备)

Jingle’s shinyapps toolkit – 王进的个人网站 (jingege.wang) 一些常用生物信息学分析可视化apps&#xff0c;以及一些分子生物学分析工具&#xff08;尴尬&#xff0c;一直忘记附上链接&#xff09; Jingles toolkit 可以进行多种分析&#xff1a; 1. General plots示例…

putty中修改默认窗口大小和字体、字号

在WinSCP中调用putty&#xff0c;发现默认窗口太小&#xff0c;字号也很小&#xff0c;非常不友好。现在显示器都是1080p起步&#xff0c;所以很有必要修改之。 以中文版v0.70为例&#xff0c;方法&#xff1a; 1. 点击左上角图标 &#xff0c;选择下拉菜单中的“修改设置”&…

Qt-信号和槽(8)

目录 信号的概念 Qt中的信号三要素 connect函数 connect的原型 connect的使用 信号函数和槽函数 参数匹配 close关闭槽函数 运行结果 第一个问题&#xff1a;怎么知道 手册使用 第二个问题&#xff0c;为什么可以直接传递函数指针 自定义槽函数 第一种自定义槽函…

Flask详细教程

1、Flask是什么&#xff1f; Flask是一个非常小的PythonWeb框架&#xff0c;被称为微型框架&#xff08;类似Java的SpringBoot&#xff09;&#xff1b;只提供了一个稳健的核心&#xff0c;其他功能全部是通过扩展实现的&#xff1b;意思就是我们可以根据项目的需要量身定制&a…

前端css动画transform多个属性值写法

X轴平移400px transform: translateX(400px); X轴平移400px并缩小0.5倍 transform: translateX(400px) scale(0.5); X轴平移400px并旋转45度 transform: translateX(400px) rotate(45d…

农产品智慧物流系统pf

TOC springboot537农产品智慧物流系统pf 第1章 绪论 1.1 课题背景 互联网发展至今&#xff0c;无论是其理论还是技术都已经成熟&#xff0c;而且它广泛参与在社会中的方方面面。它让信息都可以通过网络传播&#xff0c;搭配信息管理工具可以很好地为人们提供服务。所以各行…

全新分支版本!微软推出Windows 11 Canary Build 27686版

已经很久没有看到 Windows 11 全新的分支版本了&#xff0c;今天微软发布 Windows 11 Canary 新版本&#xff0c;此次版本号已经转移到 Build 27xxx&#xff0c;首发版本为 Build 27686 版。 此次更新带来了多项改进&#xff0c;包括 Windows Sandbox 沙盒功能切换到 Microsof…

『 Linux 』利用UDP套接字实现简单群聊

文章目录 服务端通过传入命令处理实现远程命令执行使用Windows编辑UDP客户端实现Windows远程控制Linux接收套接字的其他信息UDP套接字简单群聊服务端UDP套接字简单群聊客户端运行测试及分离输入输出 参考代码 服务端通过传入命令处理实现远程命令执行 『 Linux 』利用UDP套接字…

led台灯对眼睛好不好?台灯太亮会影响视力吗?解锁护眼台灯小知识

中国的近视情况十分严峻&#xff0c;尤其在青少年群体中表现得更为突出。据统计&#xff0c;中国青少年的近视率高居世界第一&#xff0c;这主要与长时间的近距离用眼、过度使用电子产品以及户外活动时间减少等因素有关。优质的护眼台灯不仅能减少近视的发生率&#xff0c;还能…

创建一个简单的Vue3.0应用程序

1、Vue.createApp() 方法的介绍 每一个 Vue.js 的应用都需要创建一个应用程序的实例对象并挂载到指定 DOM 上。在 Vue3.0 中&#xff0c;创建一个应用程序实例的语法格式如下&#xff1a; Vue.createApp(App) createApp() 是一个全局 API&#xff0c;它接收一个根组件选项对…

基于SpringBoot+Vue疫情物资捐赠和分配系统--论文pf

TOC springboot518基于SpringBootVue疫情物资捐赠和分配系统--论文pf 第1章 绪论 1.1 课题背景 二十一世纪互联网的出现&#xff0c;改变了几千年以来人们的生活&#xff0c;不仅仅是生活物资的丰富&#xff0c;还有精神层次的丰富。在互联网诞生之前&#xff0c;地域位置往…

开源一款H5自适应留言表白墙php源码下载

开源一款H5自适应留言表白墙php源码下载&#xff0c;优点就是安装简单&#xff0c;功能实用[滑稽][滑稽] 缺点就是UI简陋&#xff0c;功能稀少 第一张是首页&#xff0c;第二张是查看留言 第三张是留言列表(10秒自动刷新)&#xff0c;第四张是表白墙界面

小程序商城被盗刷,使用SCDN安全加速有用吗?

在电子商务蓬勃发展的今天&#xff0c;小程序商城因其便捷性和灵活性成为商家和消费者的新宠。然而&#xff0c;随着其普及&#xff0c;小程序商城的安全问题也日益凸显&#xff0c;尤其是盗刷现象频发&#xff0c;给商家和用户带来了巨大损失。面对这一挑战&#xff0c;是否可…