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

16 篇文章 1 订阅
3 篇文章 0 订阅


前言

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

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


小结

MySql的数据库链接就是下面的步骤,其他的都是对他们的封装

  • 连接数据库的字符串connectStr
  • 连接数据库的MySqlConnection

string connectStr = "sever= ; port= ; user= ; password=; database= ;";
MySqlConnection connection = new MySqlConnection(connectStr);

如果连接后,想对连接的数据库进行操作,那么就需要用sql语句进行操作

  • 调用数据库的语句MySqlCommand
string sql = "这里是sql的操作语句";
MySqlCommand command = new MySqlCommand(sql,connect);

注意

  • 本案例中访问数据库中的数据是用 msdr = mscom.ExecuteReader();这个其实是适合连线状态下的使用
  • 推荐使用MySqlDataAdapter adapter = new MySqlDataAdapter(command)
            using (MySqlDataAdapter adapter = new MySqlDataAdapter(command))
            {
                adapter.Fill(dataTable);
            }

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

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:创建+复刻第一章~第八章。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值