该程序主要是通过对C#窗体的DataGridView控件的单元格进行修改,实现对mysql数据库的增删查改等操作。
附上C#使用MySql.Data.MySqlClient;命名空间的方法:
C# 使用Mysql.Data.MysqlClient命名空间
编译环境:
Windows VS2019
运行效果:
开始界面
用两个文本框中的内容去匹配数据表中内容,
匹配成功则进入操作界面。
点击蓝色的注册文字,跳转到注册界面。
注册界面
可通过在文本框中输入账号和密码在对应数据表中插入一个账号信息。
注册成功则重新返回登录界面。
操作界面
代码将数据表中的学生信息填充到了DataGridView控件中。
可通过双击DataGridView控件的单元格,修改其中的内容,间接对数据库中信息的进行修改。
增加学生信息,只需修改界面上最后一行的单元格进行修改,即可添加。
点击删除按钮,当前所选中的单元格的一行信息,将被删除。
另外,我添加了一个文本框,可通过在文本框中输入sql语句再点击执行,对数据信息进行操作。但dql语句并不会有作用。
所有数据库中的学生信息或更改数据后显示,或手动刷新。
DataGridView控件本身提供了通过单击字段名,对数据进行排序显示的功能。
还有更多程序细节在代码中可见。
由于C#会在InitializeComponent中自动添加控件相关代码和编译器自动对代码进行了较多的分文件操作,所以导致整个项目的代码较多且分散。
粘贴全部代码不仅麻烦,而且还没有意义。
所以在此只粘贴了三个窗口的实现代码,还请大家多多包含。
Form1登录窗口:
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using MySql.Data;
using MySql.Data.MySqlClient;
namespace C_sharp学生信息管理系统
{
public partial class Form1 : Form
{
MySqlConnection conn; //用于连接数据库对象
MySqlCommand cmd; //用于查询数据库对象1
MySqlDataReader DataReader; //用于查询数据库对象2
String connetStr = //连接数据库用的字符串
"server=localhost;port=3306;user=root;password=123456; database=studentsql;";
//程序入口
//窗口类构造函数
public Form1()
{
InitializeComponent(); //创建窗口
//设置窗口显示位置居中
this.StartPosition = System.Windows.Forms.FormStartPosition.CenterScreen;
}
//封装查询数据库函数,参数为要查询的数据表
void sqlinquire(String sql)
{
//点击登录按钮时,查询数据库的账号密码表
//当文本框中的数据等于对应账号密码信息时,进入下一界面
//每次使用语句之前重新连接数据库
// server=localhost 代表本机,端口号port默认是3306可以不写,
//user用户名,password密码,database要使用的数据库
conn = new MySqlConnection(connetStr);
conn.Open();
cmd = new MySqlCommand(sql, conn);
DataReader = cmd.ExecuteReader();
}
//点击登录按钮事件
private void button1_Click(object sender, EventArgs e)
{
try
{
//将账号和密码字符串与数据库中的对应字段进行匹配,匹配成功则进入管理界面
sqlinquire("select * from account");
//Read初始索引是-1,执行读取下一行数据,没有下一行返回false
//通过遍历表中所有数据确定对应的关系
bool sign = false; //标记是否登录成功
while (DataReader.Read())
//如果账号和密码与数据库中account管理员账户数据表中的数据对应,则登录成功
if ((textBox1.Text == DataReader.GetString("id")) &&
(textBox2.Text == DataReader.GetString("password")))
{
sign = true;
break; //有一次匹配成功则代表找到成功跳出循环
}
else
sign = false;
if (!sign)
{
MessageBox.Show("用户名或密码错误!");
return;
}
//账号密码匹配则进入管理界面
Form3 form3 = new Form3();
form3.Show();
this.Hide(); //隐藏当前窗口
}
catch
{
MessageBox.Show("意料之外的错误!");
return;
}
}
//点击注册按钮事件
private void label5_Click(object sender, EventArgs e)
{
//显示注册窗口
Form2 form2 = new Form2();
form2.Show();
//隐藏当前窗口
this.Hide();
}
}
}
Form2注册窗口:
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;
using MySql.Data;
using MySql.Data.MySqlClient;
namespace C_sharp学生信息管理系统
{
public partial class Form2 : Form
{
String connetStr = //连接数据库字符串
"server=localhost;port=3306;user=root;password=123456; database=studentsql;";
public Form2()
{
InitializeComponent();
//设置窗口显示位置居中
this.StartPosition = System.Windows.Forms.FormStartPosition.CenterScreen;
}
//注册按钮点击事件
private void button1_Click(object sender, EventArgs e)
{
//检查注册的用户名和密码是否为空
if (textBox1.Text.Length < 4)
{
MessageBox.Show("用户名不可少于4位!");
return;
}
if ((textBox2.Text.Length < 4) || (textBox3.Text.Length < 4))
{
MessageBox.Show("注册密码不可少于4位!");
return;
}
//检查两次密码输入是否一致
if(textBox2.Text != textBox3.Text)
{
MessageBox.Show("两次密码输入不一致!");
return;
}
try
{
//将box1中的文本和box2中的文本插入到管理员数据表中
MySqlConnection conn = new MySqlConnection(connetStr);
conn.Open();
String sql =
"INSERT INTO account VALUE(" + textBox1.Text + "," + textBox3.Text + "); ";
MySqlCommand cmd = new MySqlCommand(sql, conn);
cmd.ExecuteNonQuery();
//弹出提示框
MessageBox.Show("注册成功!");
//进入操作界面
Form1 form1 = new Form1();
form1.Show();
this.Hide(); //隐藏当前窗口
}
catch
{
MessageBox.Show("用户名已存在或其他错误!");
return;
}
}
//窗口退出之后事件,该窗口退出后程序退出
private void Form2_FormClosed(object sender, FormClosedEventArgs e)
{
Application.Exit();
}
//隐藏密码单选框被选中时,密码框设置掩码
private void radioButton1_CheckedChanged(object sender, EventArgs e)
{
textBox2.PasswordChar = '#';
textBox3.PasswordChar = '#';
}
}
}
Form3操作窗口:
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;
using MySql.Data;
using MySql.Data.MySqlClient;
namespace C_sharp学生信息管理系统
{
public partial class Form3 : Form
{
String connetStr = //连接数据库字符串
"server=localhost;port=3306;user=root;password=123456; database=studentsql;";
MySqlConnection conn; //操作数据库使用的对象
MySqlCommand cmd;
String nameid; //临时记录数据表id列字段
int index_y; //记录选中当前行索引
int index_x; //记录选中当前列索引
String sql; //执行的sql语句字符串
//构造
public Form3()
{
InitializeComponent();
//设置窗口显示位置居中
this.StartPosition = System.Windows.Forms.FormStartPosition.CenterScreen;
queryop();
}
//该窗体关闭后,程序退出
private void Form3_FormClosing(object sender, FormClosingEventArgs e)
{
Application.Exit();
}
//刷新:查询并将结果填充到表格
private void queryop()
{
try
{
//将数据表中的信息填充到表格控件中
conn = new MySqlConnection(connetStr);
conn.Open();
sql = "select * from studentmess;";
cmd = new MySqlCommand(sql, conn);
MySqlDataAdapter adapter = new MySqlDataAdapter(sql, conn);
DataTable dataTable = new DataTable();
adapter.Fill(dataTable); //将adapter中的信息填充到表格中
dataGridView1.DataSource = dataTable;
dataGridView1.AutoGenerateColumns = true;
dataGridView1.DataSource = dataTable;
}
catch
{
MessageBox.Show("意料之外的错误!");
return;
}
}
//点击查询按钮执行查询
private void button1_Click(object sender, EventArgs e)
{
queryop();
}
//限定日期添加规则函数
private String addruletime()
{
//如果当前列不是日期列返回默认日期字符串
//否则不变
String timetemp;
if (index_x != 2)
timetemp = "2020/1/1";
else
timetemp = dataGridView1.Rows[index_y].Cells[2].Value.ToString();
return timetemp;
}
//限定成绩添加函数
private String addrulescore()
{
//如果当前列不是三个成绩列,则返回默认成绩,否则不变
String tempscore;
int tempx = 0; //临时记录列
if (index_x != 5 || index_x != 6 || index_x != 7)
{
tempscore = "0";
return tempscore; //不是成绩列直接返回
}
//是成绩列判断是那一列,然后根据列返回
switch (index_x)
{
case 5:
tempx = 5;
break;
case 6:
tempx = 6;
break;
case 7:
tempx = 7;
break;
}
tempscore = dataGridView1.Rows[index_y].Cells[tempx].Value.ToString();
return tempscore;
}
//当前所选内容更改时发生
private void dataGridView1_CellValueChanged(object sender, DataGridViewCellEventArgs e)
{
//更改内容包括更改和添加新行
//首先尝试添加新行,但如果要添加新行,此时更改的行坐标对应的姓名等信息不存在,所以程序抛出异常
//这时转为在数据库中插入新行操作
try
{
//获取当前行的索引
index_y = dataGridView1.CurrentRow.Index;
//连接数据库服务
conn = new MySqlConnection(connetStr); //conn new新对象时,会自动调用关闭数据库连接函数
conn.Open();
//获取当前选中行的每一个数据,并修改到数据库
//执行的sql语句
sql =
"UPDATE studentmess SET " +
"id = " + dataGridView1.Rows[index_y].Cells[0].Value.ToString() + "," +
"`name` = '" + dataGridView1.Rows[index_y].Cells[1].Value.ToString() + "'," +
"birthday = '" + dataGridView1.Rows[index_y].Cells[2].Value.ToString() + "'," +
"idcardnum = '" + dataGridView1.Rows[index_y].Cells[3].Value.ToString() + "'," +
"contact = '" + dataGridView1.Rows[index_y].Cells[4].Value.ToString() + "'," +
"`C# score` = " + dataGridView1.Rows[index_y].Cells[5].Value.ToString() + "," +
"` C++ score` = " + dataGridView1.Rows[index_y].Cells[6].Value.ToString() + "," +
"`Data structure score` = " + dataGridView1.Rows[index_y].Cells[7].Value.ToString() +
" WHERE id = '" + nameid + "';";
cmd = new MySqlCommand(sql, conn);
cmd.ExecuteNonQuery(); //执行sql语句
}
catch
{
//尝试添加新的行
//如果再次出现异常代表,没有从id(主键)列开始添加行,弹出提示框
try
{
//连接数据库
conn = new MySqlConnection(connetStr);
conn.Open();
//根据规则执行
sql =
"INSERT INTO `studentmess` VALUES(" +
dataGridView1.Rows[index_y].Cells[0].Value.ToString() + "," +
"'" + dataGridView1.Rows[index_y].Cells[1].Value.ToString() + "'," +
"'" + addruletime() + "'," +
"'" + dataGridView1.Rows[index_y].Cells[3].Value.ToString() + "'," +
"'" + dataGridView1.Rows[index_y].Cells[4].Value.ToString() + "'," +
"'" + addrulescore() + "'," +
"'" + addrulescore() + "'," +
"'" + addrulescore() + "'" +
"); ";
cmd = new MySqlCommand(sql, conn);
cmd.ExecuteNonQuery(); //执行sql语句
}
catch
{
MessageBox.Show("\t操作无效!\n没有在id列开始添加新行或其他错误");
return;
}
}
}
//单元格编辑模式启动时发生
private void dataGridView1_CellBeginEdit(object sender, DataGridViewCellCancelEventArgs e)
{
//获取编辑单元格前的单元格行索引
index_y = dataGridView1.CurrentRow.Index;
//列索引
index_x = dataGridView1.ColumnCount;
//记录开始的id信息,用于更改后在数据库中查找对应id
nameid = dataGridView1.Rows[index_y].Cells[0].Value.ToString();
}
//删除按钮点击事件
private void button2_Click(object sender, EventArgs e)
{
try
{
//获取当前行列索引
index_y = dataGridView1.CurrentRow.Index;
conn = new MySqlConnection(connetStr);
conn.Open();
//sql语句
sql =
"DELETE FROM studentmess WHERE id = "
+ dataGridView1.Rows[index_y].Cells[0].Value.ToString() + ";";
cmd = new MySqlCommand(sql, conn);
cmd.ExecuteNonQuery(); //执行sql语句
}
catch (Exception)
{
MessageBox.Show("意料之外的错误!");
}
finally
{
queryop(); //刷新数据
}
}
//单击文本框事件
private void textBox1_Click(object sender, EventArgs e)
{
//将文本内容清除
textBox1.Text = "";
}
//执行按钮点击事件
private void button3_Click(object sender, EventArgs e)
{
try
{
//输入执行语句功能,不能显示查询语句
conn = new MySqlConnection(connetStr);
conn.Open();
sql = textBox1.Text;
cmd = new MySqlCommand(sql, conn);
cmd.ExecuteNonQuery(); //执行sql语句
MessageBox.Show("执行成功!");
}
catch
{
MessageBox.Show("sql语法错误!");
}
finally
{
queryop(); //刷新表格
}
}
}
}
不足之处:
由于我目前对数据库和C# winform的知识了解的还比较少,所以整个程序也仅仅是实现了功能而已,其中必有诸多纰漏之处。
比如,修改出生日期数据时的格式不对导致的错误,我就还暂时没有办法给出相应的提示。
还请大家多多包含。
感谢大家的支持。