基于C#+SqlServer实现(WinForm)学生信息管理系统
学生选课及成绩查询管理系统的设计与开发1、项目背景学生选课及成绩查询系统是一个学校不可缺少的部分传统的人工管理档案的方式存在着很多的缺点如效率低、保密性差等所以开发一套综合教务系统管理软件很有必要它应该具有传统的手工管理所无法比拟的优点如检索迅速、查找方便、可靠性高、存储量大、保密性好、寿命长、成本低等。这些优点能够极大的提高学校的管理效率有助于推进学校的信息化建设。2、技术选型C#的窗体程序开发本系统未采用 C#实现 MDI——多文档窗口因为考虑到 C#的该技术与 Java 类似而暑期 Java 实训时曾用过类似的方法做过停车场管理系统所以想为这次的系统注入一点新鲜的血液所以本系统设计的主题采用了了 C#的 C#TreeView 实现。SQL server 数据库3、需求分析本系统包括两类用户学生、管理员。管理员可以通过系统来添加管理员信息、修改管理员信息、添加学生信息、修改学生信息开设课程、查询课程、录入成绩、统计成绩、修改成绩、修改个人密码等而学生则可以通过系统来选择课程、查询课程、显示自己的课表、查询自己的成绩单、修改个人密码等等。3.1 系统实现的功能流程具体的功能概述如下3.2管理员角色拥有的功能管理员信息管理添加管理员信息管理员可以添加其他的管理员信息。修改管理员信息管理员可以删除其他的管理员信息。学生信息管理添加学生信息管理员可以添加学生信息这些信息包括学生的学号密码年级专业出生日期等等。修改学生信息管理员可以修改学生的信息课程管理开设课程管理员可以录入课程信息学生就可以浏览到这些课程信息从而选课。查询课程可以通过学期查询课程或通过学期和课程结合的方式查询课程。成绩管理录入成绩管理员可以录入学生的成绩。统计成绩管理员可以通过学期和课程信息来统计某门课的学生成绩平均分、最高分、最低分以及可以通过成绩区间来查询某个学期某门课的学生的成绩信息。并且可以实现排序功能。修改成绩管理员可以对成绩出错的学生的成绩进行修改。修改个人密码管理员可以修改自己的密码。3.3 学生角色拥有的功能课程管理选择课程学生可以根据本学期管理员发布的课程来选课。查询课程可以通过学期查询课程或通过学期和课程结合的方式查询课程。显示课表学生可以根据自己的选课情况来查询自己的课表。成绩管理我的成绩单学生可以根据学期来查询自己某个学期所有选修课程的成绩信息。修改个人密码学生可以修改自己的密码。4、数据库设计4.1 数据库关系图4.2 完成系统中数据表的结构设计学生信息表用户表student字段名称数据类型可空默认值说明stuidint不可主键学生 id无实际意思每次自增 1stunameNvarchar(30)不可学生姓名stuxuehaoNvarchar(30)不可学生学号不能重复登陆时的用户名默认是学号。stupasswdNvarchar(30)不可学生密码stugradeNvarchar(30)学生年级stumajorNvarchar(30)学生专业stusexvarchar(2)学生性别stubornNvarchar(30)学生出生日期roleNvarchar(30)学生角色学生stuhometownNvarchar(30)学生籍贯管理员信息表管理员信息表manager字段名称数据类型可空默认值说明manidint不可主键管理员 id无实际意思每次自增 1mannameNvarchar(30)不可管理员用户名roleNvarchar(30)不可管理员角色管理员manpasswdNvarchar(30)不可管理员密码课程表课程表class字段名称数据类型可空默认值说明claidint不可主键课程 id无实际意思每次自增 1clanameNvarchar(30)不可课程名termNvarchar(30)不可开课的学期teacherNvarchar(30)不可开课的教师课程细节表课程细节表sctime字段名称数据类型可空默认值说明sctimeidint不可主键课程细节 id无实际意思每次自增 1claidint不可外键课程号sctimeNvarchar(30)不可课程上课的时间locationNvarchar(30)不可课程上课的地点选课表选课表sc字段名称数据类型可空默认值说明scidint不可主键选课 id无实际意思每次自增 1stuidint不可外键学生 idclaidint不可外键课程 idgradesint不可学生成绩5、界面设计登录界面5.1 管理员角色管理员主界面管理员-------添加管理员界面管理员——修改管理员界面管理员——开设课程界面管理员——查询课程界面管理员——录入成绩界面管理员——统计成绩页面管理员——修改成绩界面管理员——添加学生信息界面管理员——修改学生信息界面管理员——修改密码界面5.2 学生界面学生登录主界面学生——选择课程界面学生——查询课程界面学生——显示课表界面学生——我的成绩单学生——密码修改界面6、关键技术的介绍6.1 使用 treeview 实现点击不同的选项在右侧面板中显示不同的界面。具体代码如下private void treeView1_AfterSelect(object sender, TreeViewEventArgs e) { switch (this.treeView1.SelectedNode.Text) { case录入成绩: Form2 f new Form2(); f.TopLevel false; f.FormBorderStyle FormBorderStyle.None; f.WindowState FormWindowState.Maximized; panel2.Controls.Add(f); f.Show(); break; case我的成绩单: searchgradeForm f1 new searchgradeForm(); f1.TopLevel false; f1.FormBorderStyle FormBorderStyle.None; f1.WindowState FormWindowState.Maximized; panel2.Controls.Add(f1); f1.Show(); break; case统计成绩: countForm f2 new countForm(); f2.TopLevel false; f2.FormBorderStyle FormBorderStyle.None; f2.WindowState FormWindowState.Maximized; panel2.Controls.Add(f2); f2.Show(); break; case开设课程: kaisheForm f3 new kaisheForm(); f3.TopLevel false; f3.FormBorderStyle FormBorderStyle.None; f3.WindowState FormWindowState.Maximized; panel2.Controls.Add(f3); f3.Show(); break; case选择课程: chooseForm f4 new chooseForm(); f4.TopLevel false; f4.FormBorderStyle FormBorderStyle.None; f4.WindowState FormWindowState.Maximized; panel2.Controls.Add(f4); f4.Show(); break; case查询课程: searchclassForm f5 new searchclassForm(); f5.TopLevel false; f5.FormBorderStyle FormBorderStyle.None; f5.WindowState FormWindowState.Maximized; panel2.Controls.Add(f5); f5.Show(); break; case添加管理员信息: addmanForm f6 new addmanForm(); f6.TopLevel false; f6.FormBorderStyle FormBorderStyle.None; f6.WindowState FormWindowState.Maximized; panel2.Controls.Add(f6); f6.Show(); break; case修改管理员信息: modifymanForm f7 new modifymanForm(); f7.TopLevel false; f7.FormBorderStyle FormBorderStyle.None; f7.WindowState FormWindowState.Maximized; panel2.Controls.Add(f7); f7.Show(); break; case添加教师信息: addteacForm f8 new addteacForm(); f8.TopLevel false; f8.FormBorderStyle FormBorderStyle.None; f8.WindowState FormWindowState.Maximized; panel2.Controls.Add(f8); f8.Show(); break; case修改教师信息: modifyteacForm f9 new modifyteacForm(); f9.TopLevel false; f9.FormBorderStyle FormBorderStyle.None; f9.WindowState FormWindowState.Maximized; panel2.Controls.Add(f9); f9.Show(); break; case添加学生信息: addstuForm f10 new addstuForm(); f10.TopLevel false; f10.FormBorderStyle FormBorderStyle.None; f10.WindowState FormWindowState.Maximized; panel2.Controls.Add(f10); f10.Show(); break; case修改学生信息: modifystuForm f11 new modifystuForm(); f11.TopLevel false; f11.FormBorderStyle FormBorderStyle.None; f11.WindowState FormWindowState.Maximized; panel2.Controls.Add(f11); f11.Show(); break; case关于: aboutForm f12 new aboutForm(); f12.TopLevel false; f12.FormBorderStyle FormBorderStyle.None; f12.WindowState FormWindowState.Maximized; panel2.Controls.Add(f12); f12.Show(); break; case 退出系统: Application.Exit(); break; case 显示课表: showkebiaoForm f13 new showkebiaoForm(); f13.TopLevel false; f13.FormBorderStyle FormBorderStyle.None; f13.WindowState FormWindowState.Maximized; panel2.Controls.Add(f13); f13.Show(); break; case 修改密码: modifymimaForm f14 new modifymimaForm(); f14.TopLevel false; f14.FormBorderStyle FormBorderStyle.None; f14.WindowState FormWindowState.Maximized; panel2.Controls.Add(f14); f14.Show(); break; case 修改成绩: modifygradeFram f15 new modifygradeFram(); f15.TopLevel false; f15.FormBorderStyle FormBorderStyle.None; f15.WindowState FormWindowState.Maximized; panel2.Controls.Add(f15); f15.Show(); break; } }6.2 在其他的窗口得到在登录窗口输入的信息实现方法在 loginFram 中设置两个方法在其他类中只需要引用 loginFram 的这些方法即可。具体实现如下public static String getStudent() { String stuxuehao ; stuxuehao loginForm.name; return stuxuehao; } public static String getRole() { String role1 ; role1 role; return role1; }6.3 管理员开设课程时对于同一时间该教室有课的情况怎么做出异常处理。集体实现如下private void button1_Click(object sender, EventArgs e) { string teacher textBoxteacher.Text; string classes textBoxclass.Text; string term comboBoxterm.SelectedItem.ToString(); string flags 1; SqlConnection conn new SqlConnection(loginForm.connectionString); conn.Open(); SqlCommand cmd new SqlCommand(); cmd.Connection conn; //将开课信息插入到开课表里 //MessageBox.Show(开设课程成功); string sql ; //得到上课的地点 string didian comboBoxdidian.SelectedItem.ToString(); //checkedListBoxtime for (int i 0; i checkedListBoxtime.Items.Count; i) { if (checkedListBoxtime.GetItemChecked(i)) { String time checkedListBoxtime.GetItemText(checkedListBoxtime.Items[i]); sql select * from sctime where sctime time and location didian ; SqlDataAdapter adp new SqlDataAdapter(sql, conn); DataSet ds new DataSet(); adp.Fill(ds); if (ds.Tables[0].Rows.Count 0) { flags 2; MessageBox.Show(该时间该教室已经有课); break; } else { flags 1; break; } } } if (flags 1) { sql insert into class (claname,term,teacher) values ( classes , term , teacher ); cmd.CommandText sql; cmd.ExecuteNonQuery(); for (int i 0; i checkedListBoxtime.Items.Count; i) { if (checkedListBoxtime.GetItemChecked(i)) { string time checkedListBoxtime.GetItemText(checkedListBoxtime.Items[i]); //将开课表的id得到 sql select claid from class where claname classes and term term and teacher teacher ; cmd.CommandText sql; String id1 cmd.ExecuteScalar().ToString(); int id 0; int.TryParse(id1, out id); sql insert into sctime values( id , time , didian ); cmd.CommandText sql; cmd.ExecuteNonQuery(); } } MessageBox.Show(开设课程成功); } conn.Close(); }6.4 学生选择课程时对选择一门课程与已选择的课程出现上课时间冲突的情况的异常处理。集体实现如下private void button1_Click(object sender, EventArgs e) { string flags 1; //得到stuid string stuxuehao textBox1.Text; SqlConnection conn new SqlConnection(loginForm.connectionString); conn.Open(); string sql select stuid from student where stuxuehao stuxuehao ; SqlCommand cmd new SqlCommand(sql, conn); String id1 cmd.ExecuteScalar().ToString(); int.TryParse(id1, out stuid); //得到课程的id int claid 0; int.TryParse(textBoxid.Text, out claid); //查询你在该时间是否有课 sql select sctime from sctime where claid claid; SqlDataAdapter adp new SqlDataAdapter(sql, conn); DataSet ds new DataSet(); adp.Fill(ds); for (int i 0; i ds.Tables[0].Rows.Count; i) { DataRow dr ds.Tables[0].Rows[i]; string time dr[0].ToString();//第一列 sql select * from sc,sctime,class where class.claid sc.claid and class.claid sctime.claid and sctime time and sc.stuid stuid; SqlDataAdapter adp1 new SqlDataAdapter(sql, conn); DataSet ds1 new DataSet(); adp1.Fill(ds1); if (ds1.Tables[0].Rows.Count 0) { flags 2; MessageBox.Show(课程上课时间冲突); break; } } if (flags 1) { sql insert into sc(claid,stuid) values( claid , stuid ); cmd.CommandText sql; if (cmd.ExecuteNonQuery() 0) { MessageBox.Show(选课成功); } } if (listBox1.Items.Count 0) {//清空所有项 listBox1.Items.Clear(); } sql select class.claname from sc,class where sc.claid class.claid and stuid stuid; SqlDataAdapter adp2 new SqlDataAdapter(sql, conn); DataSet ds2 new DataSet(); adp2.Fill(ds2); foreach (DataRow row in ds2.Tables[0].Rows) { listBox1.Items.Add(row[0].ToString()); } conn.Close(); }7、系统测试怎么提高访问数据库的速度改进方法引入视图、触发器、函数、存储过程优化表结构建立索引。8、完成情况总结通过几周的努力从前期的需求分析与架构设计到实际的编码阶段我完成了学生选课及成绩管理系统的开发与设计。已经大致完成了主要的功能不过还有一些亟待完善的方面例如对数据的存储采用加密的措施UI 设计并不是很出色等等这些问题都需要我再以后的时间里去慢慢弥补还有刚开始我对 treeview 并不熟悉所以先建立了几个原型来测试领会了 treeview 的使用方法后才切入正题进行开发。在这开发的过程中我收获很大相比前几次的开发我真正重视起测试在软件开发中的作用在软件开发的后期我专门建立一个 bug 列表将出现的 bug 详细记录在列表中并在软件调试的后期对照列表认真改进软件考虑以后使用软件来做相关方面的管理。当然我也遇到不少代码编写的问题有时要花较长的时间来解决问题这也是自己平时编写代码较少的原因。通过这次软件的开发在编写代码上有了一定的提高同时也知道了软件开发过程中需要注意的问题。比如开发逻辑思维要清晰不然可能会把问题想的复杂化。平时多和项目成员交流这样你才能知道自己的想法有那些出入利于软件的开发。通过这次实验使我对软件开发有了更深一步的了解。在软件开发中应注意的问题和考虑的问题都能较好的做到。♻️ 资源大小4.18MB➡️资源下载https://download.csdn.net/download/s1t16/87425302注更多内容可关注微信公众号【神仙别闹】如当前文章或代码侵犯了您的权益请私信作者删除