C#大作业——学生信息管理系统

农民  金牌会员 | 2022-6-25 18:15:45 | 显示全部楼层 | 阅读模式
打印 上一主题 下一主题

主题 802|帖子 802|积分 2406

目录



   gitee项目地址(觉得有用的道友star一下,谢谢)
  
一、数据库操作

建立数据库结构

1:新建一个数据库

   1:打开 数据库管理软件 navicat/SQLoya
2:创建连接
3:选择连接右键新建数据库
4:展开数据库
5:右键新建表
  2:表中数据

   唯一的ID:对这个表的标识 类似身份证 唯一。
id:一般我们都会让它作为主键(非空、自增)
  3:填充表中数据

   新建表的时候: 每个字段都有一个类型
我们填充数据的时候:要根据类型填充数据
int:整数 如:1、2、3、…
varchar:字符串(必须指定长度) 如:‘呆呆’、‘西门吹雪’、…
  表结构展示


对数据的基本操作(添加 修改 删除 查询)

   现在表中添加数据,然后我们展示列表并查询
  1:新增

语法:INSEST INTO + 表名 (字段名1,字段名2,字段3...) VALUES(列表1,列表2,...)
返回值:受影响的行(执行增删改的时候,都会返回受影响的数据)
   新增一个学生 由于sid自增 我们每次添加数据不需要添加主键;因为sid 会自动添加。
  1. INSERT INTO student (sname, sage) VALUES("周芷若", 19)
复制代码
  新增多条数据
  1. INSERT INTO student (sname, sage) VALUES('周一', 18),('周二', 19),('周三', 20)
复制代码

2:修改

语法:UPDATE + 表名 set 列名 = '新的数据' where 条件
   把id为1的人名字 改成张三
  1. update student set sname='张三' where sid=1
复制代码
  把周一的名字 改成 周五
  1. update student set sname='周日' where sname='周一'
复制代码

3:删除

语法:DELETE from 表名 + WHERE 条件
   删除学号为1的学生
  1. DELETE FROM student WHERE sid = 1
复制代码
  在真正的开发中,删除并不是物理删除 而是逻辑删除(即用一个变量表示是否被删除)
  
4:查询 单表、多表的查询

语法:SELECT  from + 表名 where 条件
   查询所有的学生信息(表中所有列)
  1. SELECT * FROM student
复制代码
  查询学生年龄 和 姓名
  1. SELECT sname, sage FROM student
复制代码
  条件查询 查询出来年龄是18 的人的名称
  1. SELECT sname FROM student WHERE sage=18
复制代码
  多个条件 查询年龄是18 而且 姓名是周二的人的所有信息
  1. SELECT * FROM student WHERE sage=18 AND sname='周二'
复制代码
  模糊查询 查询所有名字里带周
  1. SELECT * FROM student WHERE sname LIKE '%周%'
复制代码

为什么需要创建关联表?

当我们执行班级操作时,如果我们把班级放在学生表中可能会操作不了。
比如:三个2020班级的学生,查询到数据重复,再比如新增2025班级,但是这个时候还没有学生在2025班级,无法操作学生表怎么办。这个时候我们可以考虑:使用关联表,新建一个班级表。


C# WinForm和数据库结合操作

获取数据框的值

  1. // 根据组件的属性name获取 输入框(TextBox)里面的数据
  2. // this:当前窗口使用 name:属性名 Text:文本
  3. string sname = this.sname.Text;
  4. string sage = this.sage.Text;
复制代码
新增数据(连接数据库+执行SQL语句)

  1.                 private void button1_Click(object sender, EventArgs e)
  2.         {
  3.             // 根据组件的属性name获取 输入框(TextBox)里面的数据
  4.             // this:当前窗口使用 name:属性名 Text:文本
  5.             string sname = this.sname.Text;
  6.             string sage = this.sage.Text;
  7.             // 连接数据库的操作
  8.             // 1: 声明一个数据源 目的:找到我的收据库
  9.             /*
  10.              * server:服务 localhost/127.0.0.1(本地)
  11.              * port:端口号 MySQL数据库的端口号就是3306 所以契合
  12.              * database:数据库 声明我要用哪个数据库
  13.              * uid:数据库用户名
  14.              * pwd:数据库的密码
  15.              */
  16.             string url = "server=127.0.0.1; port=3306;database=csharp;uid=root;pwd=root";
  17.             // 2:创建 链接
  18.             // 注意 : 我们链接数据库的时候需要引用 mysql.data.dll
  19.             MySqlConnection con = new MySqlConnection(url);
  20.             // 3: 打开数据库
  21.             con.Open();
  22.             // MessageBox.Show("打开数据库");
  23.             //4: 声明一个sql
  24.             // 既然 数据库已经打开了 我是不是可以对数据库进行一些操作
  25.             // 注意:SQL字符串需要用引号括着
  26.             string sql = string.Format("INSERT INTO student (sname,sage) VALUES('{0}', {1})", sname, sage);
  27.             // 5:创建一个操作 sql的对象(MySqlCommand)
  28.             MySqlCommand com = new MySqlCommand(sql, con);
  29.             // 6: 执行结束之后 返回一个结果 整数 int
  30.             // ExecuteNonQuery: 执行增删改的 新增 修改 删除
  31.             int i= com.ExecuteNonQuery();
  32.             if (i > 0) {
  33.                 //类似于js中的console.log()提示框
  34.                 MessageBox.Show("新增成功");
  35.             } else {
  36.                 MessageBox.Show("失败");
  37.             }
  38.         }
复制代码

工具类——DBhelp封装

  1.                 private static String connStr = "server=localhost;database=csharp;uid=root;pwd=root;charset=utf8;sslmode=none";
  2.         
  3.         //声明链接
  4.         public static MySqlConnection GetConn()
  5.         {
  6.             MySqlConnection conn = new MySqlConnection(connStr);//
  7.             if (conn.State == ConnectionState.Closed) conn.Open();//判断是否关闭 打开链接
  8.             return conn;//返回链接
  9.         }
  10.         public static void CloseAll(MySqlConnection conn)
  11.         {
  12.             if (conn == null) return;
  13.             if (conn.State == ConnectionState.Open || conn.State == ConnectionState.Connecting)
  14.                 //判断
  15.                 conn.Close();//关闭链接
  16.         }
  17.         public static int ExecuteNonQuery(string sql) // 增删改 封装 返回受影响的行
  18.         {
  19.             MySqlConnection conn = null;
  20.             int result; //提前设置一个返回值
  21.             try
  22.             {
  23.                 conn = GetConn();//获取链接
  24.                 MySqlCommand cmd = new MySqlCommand(sql, conn);
  25.                 result = cmd.ExecuteNonQuery();//执行sql 并返回受影响的行的个数
  26.             }
  27.             finally
  28.             {
  29.                 CloseAll(conn);
  30.             }
  31.             return result;
  32.         }
  33.         public static MySqlDataReader executeQuery(string sql) //查询
  34.         {
  35.             MySqlDataReader res = null;
  36.             MySqlConnection conn = null;
  37.             try
  38.             {
  39.                 MySqlConnection conn1 = GetConn();
  40.                 MySqlCommand cmd = new MySqlCommand(sql, conn1);
  41.                 res = cmd.ExecuteReader();
  42.             }
  43.             finally
  44.             {
  45.                 CloseAll(conn);
  46.             }
  47.             return res;
  48.         }
复制代码

优化新增数据(通过工具类)

  1.                 private void button1_Click(object sender, EventArgs e)
  2.         {
  3.             string sname = this.sname.Text;
  4.             string sage = this.sage.Text;
  5.             string sql = string.Format("INSERT INTO student (sname,sage) VALUES('{0}', {1})", sname, sage);
  6.             int i = DBhelp.ExecuteNonQuery(sql);
  7.             if (i > 0) {
  8.                 MessageBox.Show("新增成功");
  9.             } else {
  10.                 MessageBox.Show("失败");
  11.             }
  12.         }
复制代码

二、多表操作

1:为什么执行多表操作

   如图所示:我进行班级操作的时候,此时是没办法操作,周一、周三两人退学,那么2020这个班级就不复存在了。无法操作班级2020。

  2:解决方案(创建关联表,操作多表数据)


3:操作数据


   多表操作一般情况下只使用查询操作
多表操作:as(起别名) 此时有问题 没有班级的学生(即gid为NULL)难道 不配被查询嘛?
SELECT * FROM student AS a, grade AS b WHERE a.gid = b.gid
高级多表查询:INNER JOIN 内连接 LEFT JOIN 左连接(以左表为主表查询 如果右表没有与之匹配的数据就用null来代替)
SELECT * FROM student a LEFT JOIN grade b ON a.gid = b.gid
  
三、登录操作

  1.                         // 重置按钮:清空输入框里面的值
  2.             this.textBox1.Text = "";
  3.             this.textBox2.Text = "";
  4.             this.radioButton1.Checked = true;
  5.             this.radioButton2.Checked = false;
  6.                        
  7.                         // 点击登录
  8.                         string password = null;
  9.             if (radioButton1.Checked == true)
  10.             {
  11.                 // string.Format格式化字符串
  12.                 string sql = string.Format(@"SELECT password FROM student WHERE username='{0}'", textBox1.Text);
  13.                 // 执行sql    返回一个结果集
  14.                 MySqlDataReader res = DBhelp.executeQuery(sql);
  15.                 // 一行一行 往下读
  16.                 while (res.Read())
  17.                 {
  18.                     password = res["password"].ToString();
  19.                 }
  20.                 if (password.Equals(textBox2.Text))
  21.                 {
  22.                     MessageBox.Show("登录成功");
  23.                 } else
  24.                 {
  25.                     MessageBox.Show("账号密码错误");
  26.                 }
  27.             } else
  28.             {
  29.                 string sql = string.Format(@"SELECT password FROM teacher WHERE username='{0}'", textBox1.Text);
  30.                 MySqlDataReader res = DBhelp.executeQuery(sql);
  31.                 while (res.Read())
  32.                 {
  33.                     password = res["password"].ToString();
  34.                 }
  35.                 if (password.Equals(textBox2.Text))
  36.                 {
  37.                     MessageBox.Show("登录成功");
  38.                 }
  39.                 else
  40.                 {
  41.                     MessageBox.Show("账号密码失败");
  42.                 }
  43.             }
复制代码

四:菜单操作

1:显示菜单


  1.                                         // 创建 学生菜单的实例
  2.                     StudentMenu stu = new StudentMenu();
  3.                     // 这个是展示窗口
  4.                     stu.Show();
  5.                     // 展示窗体之后,把前一个打开的窗体关闭
  6.                     this.Hide();
复制代码
2:ListView控件的使用

选择编辑行


修改ListView框的属性




五:回显数据



  1.                 string gid = null; //班级号
  2.         StuList s = null; //已经打开就不再new了
  3.         private void AddStudent_Load(object sender, EventArgs e)
  4.         {
  5.             string sql = string.Format(@"SELECT * FROM grade");
  6.             MySqlDataReader res = DBhelp.executeQuery(sql);
  7.             while (res.Read())
  8.             {
  9.                 string gname = res["gname"].ToString();
  10.                 this.comboBox1.Items.Add(gname);
  11.             }
  12.             // 设置下拉框初始值
  13.             comboBox1.Items.Insert(0, "请选择");
  14.             this.comboBox1.SelectedIndex = 0;
  15.         }
  16.         private void button2_Click(object sender, EventArgs e)
  17.         {
  18.             string sql = string.Format(@"insert into student (sname, sage, gid, username) values('{0}', {1}, {2}, '{3}')", textBox1.Text, textBox2.Text, gid, textBox4.Text);
  19.             int i = DBhelp.ExecuteNonQuery(sql);
  20.             if (i > 0)
  21.             {
  22.                 if (s == null)
  23.                 {
  24.                     s = new StuList();
  25.                     s.Show();
  26.                 }
  27.                 else
  28.                 {
  29.                     s.Reload();
  30.                 }
  31.                 DialogResult dialogResult = MessageBox.Show("新增成功,是否需要继续新增", "新增提示", MessageBoxButtons.YesNo, MessageBoxIcon.Exclamation);
  32.                 if (dialogResult == DialogResult.Yes)
  33.                 {
  34.                     this.TopMost = true;
  35.                 }
  36.                 else if (dialogResult == DialogResult.No)
  37.                 {
  38.                     this.Hide();
  39.                 }
  40.             } else
  41.             {
  42.                 MessageBox.Show("新增失败");
  43.             }
  44.         }
  45.         private void comboBox1_SelectedIndexChanged(object sender, EventArgs e)
  46.         {
  47.             //获取gid
  48.             string sql1 = string.Format(@"SELECT * FROM grade where gname = '{0}'", comboBox1.Text);
  49.             MySqlDataReader res1 = DBhelp.executeQuery(sql1);
  50.             while (res1.Read())
  51.             {
  52.                 gid = res1["gid"].ToString();
  53.             }
  54.         }
复制代码

六、修改删除数据


双击图中的事件:

  1.         private void listView1_SelectedIndexChanged(object sender, EventArgs e)
  2.         {
  3.             //判断有没有选中数据,选中后回显数据
  4.             if (this.listView1.SelectedItems.Count > 0)
  5.             {
  6.                 // 拿到选中数据 索引值从0开始:因为每次选中一行,所有索引值为0
  7.                 ListViewItem lis = this.listView1.SelectedItems[0];
  8.                 string sid = lis.Tag.ToString();
  9.                 string sname = lis.Text;
  10.                 // 获取子菜单
  11.                 string sage = lis.SubItems[1].Text;
  12.                 string gname = lis.SubItems[2].Text;
  13.                 string username = lis.SubItems[3].Text;
  14.                 //把拿到的数据赋值在修改框中
  15.                 textBox1.Text = sname;
  16.                 textBox2.Text = sage;
  17.                 textBox3.Text = gname;
  18.                 textBox4.Text = username;
  19.             }
  20.         }
复制代码

七、页面之间的传值





免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

农民

金牌会员
这个人很懒什么都没写!

标签云

快速回复 返回顶部 返回列表