目录
- 前言
- 一、管理系统的后台数据库
- 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:创建+复刻第一章~第八章。