1.系统概述
本次是做一个学生管理系统,在学了数据库之后,希望通过这个系统把所学知识应用与实际项目中去。加强自己的熟练程度。 开发背景:具备数据库,C#的相关知识储备,掌握基本的html知识。
用途:仅作练习用。通过一门语言,将数据库展现出来。
2.功能需求分析
系统概念层设计:功能用例图如下

1. 登录功能:用于身份认证
2. 数据操作:信息查询,数据的增删改。
a) 数据操作里,管理员具备所有的操作权限。学生具有选课和查看的功能。以及可以修改自己的个人信息。
3. UI设计
3.数据库设计
E-R图 1
首先,学生表(tb_student)设计如下
列名 | 数据类型 | 是否为空(默认未是) | 主键(默认为否) |
Student_name | Nvarchar (15) | ||
Student_num | int | 否 | 是 |
Student_password | Nvarchar(30) | ||
Student_sex | Nvarchar(5) | ||
Student_age | smallint | ||
Student_dept | Nvarchar(20) |
tb_course
列名 | 数据类型 | 是否为空 | 主键 |
Course_num | int | 否 | 是 |
Course_name | Nvarchar(30) | ||
Course_credit | smallint | ||
Course_semester | smallint |
tb_student_course
列名 | 数据类型 | 是否为空 | 主键 |
Sc_id | int | 否 | 是 |
Student_num | int | 外键 | |
Course_num | int | 外键 | |
grade | smallint |
tb_admin
列名 | 数据类型 | 是否为空 | 主键 |
Admin_id | smallint | 否 | 是 |
admin_name | Nvarchar(20) | ||
Admin_password | Nvarchar(40) | ||
remark | Nvarcahr(10) |
一.配置数据库连接
首先,第一步配置好数据库连接:
1.在app.config文件里添加连接字符串,如下代码:
<?xml version="1.0" encoding="utf-8" ?> <configuration> <configSections> </configSections> <connectionStrings> <add name="sql_homework_end.Properties.Settings.sql_homework_endConnectionString" connectionString="Data Source=.;Initial Catalog=sql_homework_end;Integrated Security=True" providerName="System.Data.SqlClient" /> </connectionStrings> <startup> <supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.5" /> </startup> </configuration>
2.建立数据库公共类:
using System;
using System.Collections.Generic;
using System.Configuration;
using System.Data;
using System.Data.SqlClient;
using System.Linq;
using System.Security.Cryptography;
using System.Text;
using System.Threading.Tasks;
namespace sql_homework_end
{
class sqlhelper
{
private static string connStr = ConfigurationManager.ConnectionStrings["sql_homework_end.Properties.Settings.sql_homework_endConnectionString"].ConnectionString;
/// <summary>
/// 返回受影响的数据行数
/// </summary>
/// <param name="sql"></param>
/// <returns></returns>
public static int ExecuteNoQuery(string sql)
{
using (SqlConnection conn=new SqlConnection(connStr))
{
conn.Open();
using (SqlCommand cmd=conn.CreateCommand())
{
cmd.CommandText = sql;
return cmd.ExecuteNonQuery();
}
}
}
/// <summary>
/// 返回一个数据集
/// </summary>
/// <param name="sql"></param>
/// <returns></returns>
public static DataSet ExecuteDataSet(string sql)
{
using (SqlConnection xonn=new SqlConnection(connStr))
{
xonn.Open();
using (SqlCommand cmd = xonn.CreateCommand())
{
cmd.CommandText = sql;
SqlDataAdapter adapter = new SqlDataAdapter(cmd);
DataSet dataset = new DataSet();
adapter.Fill(dataset);
return dataset;
}
}
}
public static object ExecuteScalar(string sql)
{
using (SqlConnection conn=new SqlConnection(connStr))
{
conn.Open();
using (SqlCommand cmd=conn.CreateCommand())
{
cmd.CommandText = sql;
return cmd.ExecuteScalar();
}
}
}
/// <summary>
/// md5加密
/// </summary>
/// <param name="strPwd"></param>
/// <returns></returns>
public static string GetMD5(string strPwd)
{
string pwd = "";
//实例化一个md5对象
MD5 md5 = MD5.Create();
// 加密后是一个字节类型的数组
byte[] s = md5.ComputeHash(Encoding.UTF8.GetBytes(strPwd));
//翻转生成的MD5码
s.Reverse();
//通过使用循环,将字节类型的数组转换为字符串,此字符串是常规字符格式化所得
//只取MD5码的一部分,这样恶意访问者无法知道取的是哪几位
for (int i = 3; i < s.Length - 1; i++)
{
//将得到的字符串使用十六进制类型格式。格式后的字符是小写的字母,如果使用大写(X)则格式后的字符是大写字符
//进一步对生成的MD5码做一些改造
pwd = pwd + (s[i] < 198 ? s[i] + 28 : s[i]).ToString("X");
}
return pwd;
}
}
}二.功能设计
1.登录功能
界面预览:


功能有:身份验证,退出。公共变量传值。
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 sql_homework_end
{
public partial class login : Form
{
public login()
{
InitializeComponent();
}
//界面传值
public static string GlobelValue; // 注意,必须申明为static变量
//登录按钮事件
private void btn_login_Click(object sender, EventArgs e)
{
if (cmb_identity.Text.ToString()=="管理员")
{
verify_identidy("tb_admin","admin_name");
main a = new main();
a.Show();
}
else if (cmb_identity.Text.ToString()=="学生")
{
verify_identidy("tb_student","student_name");
studnet s = new studnet();
s.Show();
}
}
//身份验证的函数
private void verify_identidy(string table,string name)
{
DataSet ds = new DataSet();
ds = sqlhelper.ExecuteDataSet("select * from "+table+" where "+name+" = '" + tbx_loginname.Text + "'");
DataTable dt = new DataTable();
dt = ds.Tables[0];
if (dt.Rows.Count != 0)
{
GlobelValue = tbx_loginname.Text;
this.Visible = false; //隐藏当前窗体
}
else
{
MessageBox.Show("用户名不存在,请重新输入");
}
}
//退出按钮
private void btn_close_Click(object sender, EventArgs e)
{
this.Close();
}
}
}2.主界面-管理员
预览:
管理员信息:

学生信息:

主要使用控件:datagridview
相关代码:
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 sql_homework_end
{
public partial class main : Form
{
public main()
{
InitializeComponent();
}
//绑定并显示相关信息
DataSet ds = new DataSet();
DataTable dt = new DataTable();
private void 学生信息ToolStripMenuItem_Click(object sender, EventArgs e)
{
ds = sqlhelper.ExecuteDataSet("select * from tb_student");
dt = ds.Tables[0];
dataGridView1.DataSource = dt;
}
private void 课程信息ToolStripMenuItem_Click(object sender, EventArgs e)
{
ds = sqlhelper.ExecuteDataSet("select * from tb_course");
dt = ds.Tables[0];
dataGridView1.DataSource = dt;
}
private void 选课信息ToolStripMenuItem_Click(object sender, EventArgs e)
{
ds = sqlhelper.ExecuteDataSet("select * from tb_student_course");
dt = ds.Tables[0];
dataGridView1.DataSource = dt;
dataGridView1.Columns["sc_id"].DisplayIndex = 0;
}
private void 管理员信息ToolStripMenuItem_Click(object sender, EventArgs e)
{
ds = sqlhelper.ExecuteDataSet("select * from tb_admin");
dt = ds.Tables[0];
dataGridView1.DataSource = dt;
}
//添加按钮事件
private void btn_insert_Click(object sender, EventArgs e)
{
if (dataGridView1.Columns[0].HeaderText=="student_num")
{
string sql = @"insert tb_student (student_num,student_name,student_password,student_sex
,student_age,student_dept)values('" + dataGridView1.Rows[dataGridView1.RowCount - 2].Cells[0].Value + "','" +
dataGridView1.Rows[dataGridView1.RowCount - 2].Cells[1].Value + "','" + dataGridView1.Rows[dataGridView1.RowCount - 2].Cells[2].Value
+ "','" + dataGridView1.Rows[dataGridView1.RowCount - 2].Cells[3].Value + "','" + dataGridView1.Rows[dataGridView1.RowCount - 2].Cells[4].Value
+ "','" + dataGridView1.Rows[dataGridView1.RowCount - 2].Cells[5].Value + "')";
sqlhelper.ExecuteNoQuery(sql);
}
else if (dataGridView1.Columns[0].HeaderText=="course_num")
{
string sql = @"insert tb_course (course_num,course_name,course_credit,course_semester)values('" + dataGridView1.Rows[dataGridView1.RowCount - 2].Cells[0].Value + "','" + dataGridView1.Rows[dataGridView1.RowCount - 2].Cells[1].Value + "','" + dataGridView1.Rows[dataGridView1.RowCount - 2].Cells[2].Value + "','" + dataGridView1.Rows[dataGridView1.RowCount - 2].Cells[3].Value + "')";
sqlhelper.ExecuteNoQuery(sql);
}
else if (dataGridView1.Columns[0].HeaderText=="sc_id")
{
try
{
string sql = @"insert tb_student_course (sc_id,student_num,course_num,grade)values('" + dataGridView1.Rows[dataGridView1.RowCount - 2].Cells[0].Value + "','" + dataGridView1.Rows[dataGridView1.RowCount - 2].Cells[1].Value + "','" + dataGridView1.Rows[dataGridView1.RowCount - 2].Cells[2].Value + "','" + dataGridView1.Rows[dataGridView1.RowCount - 2].Cells[3].Value + "')";
sqlhelper.ExecuteNoQuery(sql);
}
catch (Exception)
{
MessageBox.Show("学号或姓名不存在,请重新添加。");
}
}
else if (dataGridView1.Columns[0].HeaderText == "admin_id")
{
string sql = @"insert tb_admin (admin_id,admin_name,admin_password,remark)values('" + dataGridView1.Rows[dataGridView1.RowCount - 2].Cells[0].Value + "','" + dataGridView1.Rows[dataGridView1.RowCount - 2].Cells[1].Value + "','" + dataGridView1.Rows[dataGridView1.RowCount - 2].Cells[2].Value + "','" + dataGridView1.Rows[dataGridView1.RowCount - 2].Cells[3].Value + "')";
sqlhelper.ExecuteNoQuery(sql);
}
MessageBox.Show("添加成功");
}
//更新按钮事件
private void btn_update_Click(object sender, EventArgs e)
{
if (dataGridView1.Columns[0].HeaderText == "student_num")
{
update("tb_student","student_num");
}
else if (dataGridView1.Columns[0].HeaderText == "course_num")
{
update("tb_course","course_num");
}
else if (dataGridView1.Columns[0].HeaderText == "admin_id")
{
update("tb_admin","admin_id");
}
else if (dataGridView1.Columns[0].HeaderText == "sc_id")
{
try
{
update("tb_studnet_course","sc_id");
}
catch (Exception)
{
MessageBox.Show("学号或课程号不存在,请重新输入");
throw;
}
}
}
//更新方法
private void update(string table,string head_id)
{
for (int i = 0; i < dataGridView1.RowCount; i++)
{
int id = Convert.ToInt32(dataGridView1.Rows[i].Cells[0].Value);
for (int j = 1; j < dataGridView1.ColumnCount; j++)
{
if (dataGridView1.Columns[j].Visible == true)
{
string columnName = dataGridView1.Columns[j].Name.ToString();
string sql = "update " + table + " set " + columnName + "='" + dataGridView1.Rows[i].Cells[j].Value + "' where " + head_id + "='" + id + "'";
sqlhelper.ExecuteNoQuery(sql);
}
}
}
MessageBox.Show("更新成功");
}
//删除事件
private void btn_delete_Click(object sender, EventArgs e)
{
if (dataGridView1.Columns[0].HeaderText == "student_num")
{
string sql = "delete from tb_student where student_num='" + dataGridView1.SelectedCells[0].Value + "'";
sqlhelper.ExecuteNoQuery(sql);
}
else if (dataGridView1.Columns[0].HeaderText == "course_num")
{
string sql = "delete from tb_course where course_num='" + dataGridView1.SelectedCells[0].Value + "'";
sqlhelper.ExecuteNoQuery(sql);
}
else if (dataGridView1.Columns[0].HeaderText == "sc_id")
{
string sql = "delete from tb_student_course where sc_id='" + dataGridView1.SelectedCells[0].Value + "'";
sqlhelper.ExecuteNoQuery(sql);
}
else if (dataGridView1.Columns[0].HeaderText == "admin_id")
{
string sql = "delete from tb_admin where admin_id='" + dataGridView1.SelectedCells[0].Value + "'";
sqlhelper.ExecuteNoQuery(sql);
}
MessageBox.Show("删除成功");
}
//界面载入显示身份和登录时间
private void main_Load(object sender, EventArgs e)
{
lbl_username.Text = "Welcome," + login.GlobelValue + "";
lbl_logintime.Text ="登录时间:" +DateTime.Now.ToString()+"";
}
}
}3.学生界面
界面预览:
个人信息显示:在这个界面,学生能看到自己的信息,并进行修改操作。

代码:
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 sql_homework_end
{
public partial class studnet : Form
{
public studnet()
{
InitializeComponent();
}
DataSet ds = new DataSet();
DataTable dt = new DataTable();
private void studnet_Load(object sender, EventArgs e)
{
lbl_username.Text = "Welcome," + login.GlobelValue + "";
lbl_logintime.Text = "登录时间:" + DateTime.Now.ToString() + "";
}
//相关信息显示
private void 个人信息ToolStripMenuItem_Click(object sender, EventArgs e)
{
ds = sqlhelper.ExecuteDataSet("select * from tb_student where student_name='" + login.GlobelValue + "'");
dt = ds.Tables[0];
dataGridView1.DataSource = dt;
btn_update.Visible = true;
btn_insert.Visible = false;
btn_delete.Visible = false;
}
private void 课程信息ToolStripMenuItem_Click(object sender, EventArgs e)
{
ds = sqlhelper.ExecuteDataSet("select * from tb_course");
dt = ds.Tables[0];
dataGridView1.DataSource = dt;
btn_update.Visible = false;
btn_insert.Visible = false;
btn_delete.Visible = false;
}
private void 选课管理ToolStripMenuItem_Click(object sender, EventArgs e)
{
ds = sqlhelper.ExecuteDataSet(@"select sc.sc_id,s.student_num,c.course_num,c.course_name,grade
from tb_student_course sc join tb_student s on sc.student_num=s.student_num
join tb_course c on sc.course_num=c.course_num
where s.student_name = '" + login.GlobelValue + "'");
dt = ds.Tables[0];
dataGridView1.DataSource = dt;
dataGridView1.Columns["sc_id"].DisplayIndex = 0;
btn_update.Visible = false;
btn_insert.Visible = true;
btn_delete.Visible = true;
}
//学生选课功能
private void btn_insert_Click_1(object sender, EventArgs e)
{
if (Convert.ToInt32(dataGridView1.Rows[dataGridView1.RowCount - 2].Cells[4].Value) > 0)
{
MessageBox.Show("不准填写成绩");
}
else
{
string sql = @"insert tb_student_course (sc_id,student_num,course_num)values('" + dataGridView1.Rows[dataGridView1.RowCount - 2].Cells[0].Value + "','" + dataGridView1.Rows[dataGridView1.RowCount - 2].Cells[1].Value + "','" + dataGridView1.Rows[dataGridView1.RowCount - 2].Cells[2].Value + "')";
sqlhelper.ExecuteNoQuery(sql);
MessageBox.Show("选课成功");
}
}
//删除选的课程
private void btn_delete_Click(object sender, EventArgs e)
{
string sql = "delete from tb_student_course where sc_id='" + dataGridView1.SelectedCells[0].Value + "'";
sqlhelper.ExecuteNoQuery(sql);
MessageBox.Show("删除成功,请重新选课。");
}
//更新个人信息
private void btn_update_Click(object sender, EventArgs e)
{
update("tb_student", "student_num");
}
private void update(string table, string head_id)
{
for (int i = 0; i < dataGridView1.RowCount; i++)
{
int id = Convert.ToInt32(dataGridView1.Rows[i].Cells[0].Value);
for (int j = 1; j < dataGridView1.ColumnCount; j++)
{
if (dataGridView1.Columns[j].Visible == true)
{
string columnName = dataGridView1.Columns[j].Name.ToString();
string sql = "update " + table + " set " + columnName + "='" + dataGridView1.Rows[i].Cells[j].Value + "' where " + head_id + "='" + id + "'";
sqlhelper.ExecuteNoQuery(sql);
}
}
}
MessageBox.Show("更新成功");
}
}
}
下载Demo