目录
- 前言
- 一、管理系统的后台数据库
- 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动态库文件。

方法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:创建+复刻第一章~第八章。



















