基于C#+SQL Server(CS界面)学生选课及成绩查询管理系统

学生选课及成绩查询管理系统的设计与开发

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完成系统中数据表的结构设计

学生信息表

管理员信息表

课程表

课程细节表

选课表

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();//checkedListBoxtimefor (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";//得到stuidstring 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);//得到课程的idint 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、系统测试

7.1怎么提高访问数据库的速度

改进方法:引入视图、触发器、函数、存储过程,优化表结构,建立索引。

8、完成情况总结

通过几周的努力,从前期的需求分析与架构设计到实际的编码阶段,我完成了学生选课及成绩管理系统的开发与设计。已经大致完成了主要的功能,不过还有一些亟待完善的方面,例如对数据的存储采用加密的措施,UI设计并不是很出色等等,这些问题都需要我再以后的时间里去慢慢弥补,还有刚开始,我对treeview并不熟悉,所以先建立了几个原型来测试,领会了treeview的使用方法后才切入正题进行开发。

在这开发的过程中,我收获很大,相比前几次的开发,我真正重视起测试在软件开发中的作用,在软件开发的后期,我专门建立一个bug列表,将出现的bug详细记录在列表中,并在软件调试的后期对照列表认真改进软件,考虑以后使用软件来做相关方面的管理。当然,我也遇到不少代码编写的问题,有时要花较长的时间来解决问题,这也是自己平时编写代码较少的原因。通过这次软件的开发,在编写代码上有了一定的提高,同时也知道了软件开发过程中需要注意的问题。比如,开发逻辑思维要清晰,不然可能会把问题想的复杂化。平时多和项目成员交流,这样你才能知道自己的想法有那些出入,利于软件的开发。

通过这次实验,使我对软件开发有了更深一步的了解。在软件开发中应注意的问题和考虑的问题都能较好的做到。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.xdnf.cn/news/1544002.html

如若内容造成侵权/违法违规/事实不符,请联系一条长河网进行投诉反馈,一经查实,立即删除!

相关文章

对onlyoffice进行定制化开发

基于onlyoffice8.0源码&#xff0c;进行二次开发&#xff0c;可实现包括但不限于以下的功能 1、内容控件的插入 2、内容空间的批量替换 3、插入文本 4、插入图片 5、添加&#xff0c;去除水印 6、修改同时在线人数限制 7、内容域的删除 8、页面UI的定制化 9、新增插件开发 10、…

华为全联接大会HUAWEI Connect 2024印象(四):上海大学的脑机接口演示

在HC上&#xff0c;除了华为自己的技术展示&#xff0c;也包括一些合作伙伴的展示。一个印象比较深的是上海大学的韶脑传感脑机接口。 上海大学现场准备了一个可以被脑机接口控制的电动轮椅供参观者现场体验。体验者需要先戴上一个头套&#xff0c;上面有各种传感器。据上海大…

STL队列

一、队列的介绍 队列是一种操作&#xff08;或者说运算&#xff09;受到限制的特殊线性表。其插入操作限定在表的一端进行&#xff0c;称为入队&#xff1b;其删除操作则限定在表的另一端进行&#xff0c;称为出队。插入一端称为队尾&#xff08;rear&#xff09;&#xff1b;删…

鸿蒙 OS 开发单词打卡 APP 项目实战 20240922 笔记和源码分享

配套有完整的录播课, 需要的私信. 零基础入门级别, 有点前端基础都能学会. 效果截图: 代码截图: 页面完整代码: import { AnswerStatus } from ../enums/AnswerStatus import { PracticeStatus } from ../enums/PracticeStatus import { getRandomQuestions, Question …

❤Node11-登录人token信息接口

❤Node11-登录人token信息接口​ 上一章我们已经从登录部分拿到了用户的登录jwt返回的token信息&#xff0c;接下来我们就通过token来换取用户信息 这里我们可以将其理解为一种加密以及解密的思想来思考这个jwt和token的关系&#xff0c;token就是一个加密的字符串&#xff0c…

python 斑马打印模板

打印代码逻辑如下&#xff1b; 包括样式、表格 import win32printdef print_zpl_from_usb_printer(printer_name, zpl_content):# 打开打印机hPrinter win32print.OpenPrinter(printer_name)if hPrinter is None:print(f"Failed to open printer: {printer_name}")…

Spring Cloud Alibaba-(6)Spring Cloud Gateway【网关】

Spring Cloud Alibaba-&#xff08;1&#xff09;搭建项目环境 Spring Cloud Alibaba-&#xff08;2&#xff09;Nacos【服务注册与发现、配置管理】 Spring Cloud Alibaba-&#xff08;3&#xff09;OpenFeign【服务调用】 Spring Cloud Alibaba-&#xff08;4&#xff09;Sen…

商标管理软件如何助力企业实现商标数字化管理?

商标作为企业的无形资产和品牌形象的核心&#xff0c;其管理方式的数字化升级已成为企业不可回避的课题。启服云商标管理软件凭借其强大的功能和灵活的解决方案&#xff0c;正帮助企业商标管理向数字化、智能化方向迈进&#xff0c;为企业品牌保护和市场拓展提供了强有力的支撑…

apache paimon简介(官翻)

介绍 如下架构所示: 读/写操作: Paimon 支持多样化的数据读写方式,并支持 OLAP 查询。 读取: 支持从历史快照(批处理模式)中消费数据,从最新偏移量(流处理模式)中读取数据,或以混合方式读取增量快照。写入: 支持从数据库变更日志(CDC)进行流式同步,从离线数据中…

QT菜单栏设计(二级菜单栏)

目的&#xff1a;创建一级菜单栏&#xff0c;添加对应选项&#xff0c;并向一级菜单栏中添加二级菜单栏选项。 #include "mainwindow.h" #include "ui_mainwindow.h"MainWindow::MainWindow(QWidget *parent): QMainWindow(parent), ui(new Ui::MainWindo…

科研绘图系列:R语言堆积图(stacked barplot)

文章目录 介绍加载R包导入数据数据预处理画图导出数据系统信息介绍 微生物堆积图是一种数据可视化工具,通常用于展示微生物群落中不同物种的相对丰度。这种图表通过将每个样本中的微生物按照其分类学等级(如门、属等)进行分类,并以不同颜色的块状图表示,每个块的大小代表…

基于SSM+Android的签到系统

目录 前言 功能设计 系统实现 获取源码 博主主页&#xff1a;百成Java 往期系列&#xff1a;Spring Boot、SSM、JavaWeb、python、小程序 前言 随着Internet的发展&#xff0c;人们的日常生活已经离不开网络。未来人们的生活与工作将变得越来越数字化&#xff0c;网络化和…

Leetcode 2246. 相邻字符不同的最长路径(一般树)树形dp C++实现

问题&#xff1a;Leetcode 2246. 相邻字符不同的最长路径 给你一棵 树&#xff08;即一个连通、无向、无环图&#xff09;&#xff0c;根节点是节点 0 &#xff0c;这棵树由编号从 0 到 n - 1 的 n 个节点组成。用下标从 0 开始、长度为 n 的数组 parent 来表示这棵树&#x…

Debezium

Debezium 是一个开源的分布式平台&#xff0c;用于捕获数据库变化数据&#xff08;Change Data Capture, CDC&#xff09;。允许用户实时地从数据库中捕捉到数据的变化&#xff08;如插入、更新和删除操作&#xff09;&#xff0c;并将这些变化以结构化的数据流的形式提供给其他…

Java | Leetcode Java题解之第429题N叉树的层序遍历

题目&#xff1a; 题解&#xff1a; class Solution {public List<List<Integer>> levelOrder(Node root) {if (root null) {return new ArrayList<List<Integer>>();}List<List<Integer>> ans new ArrayList<List<Integer>&g…

语音识别控制(软件、硬件)

1. 环境 python版本&#xff1a;3.11.9 2. 完整代码 import sqlite3 import time import wave # 使用wave库可读、写wav类型的音频文件 from funasr import AutoModel import sounddevice as sd import numpy as np from modelscope import pipeline, Tasks from pypinyin …

centos7安装docker DokcerCompose

一, 安装docker 1.更新yum源 yum下载很慢&#xff0c;一直出现正在尝试其它镜像&#xff0c;更改yum地址为阿里云镜像即可 1&#xff09;下载了阿里云提供的CentOS 7的Yum源配置文件&#xff0c;并将其覆盖到系统中的 /etc/yum.repos.d/CentOS-Base.repo 文件。 wget -O /et…

简单计算器(python基础代码撰写)

简单计算器&#xff1a;仅适用无括号加减乘除&#xff0c;算法初阶&#xff0c;代码基础&#xff0c;不调库或模块“纯”手撕。 (笔记模板由python脚本于2024年09月22日 12:08:02创建&#xff0c;本篇笔记适合喜欢用python解决实际问题的coder翻阅) 【学习的细节是欢悦的历程】…

宠物鱼油补充剂行业调研:未来几年年复合增长率CAGR为7.8%

宠物鱼油补充剂是一种营养补充剂&#xff0c;富含从鱼类中提取的欧米伽-3 脂肪酸&#xff08;主要是 EPA 和 DHA&#xff09;&#xff0c;专为宠物设计&#xff0c;以改善其健康状况。鱼油补充剂富含奥米加-3 脂肪酸&#xff0c;已被证明对宠物健康有诸多益处&#xff0c;包括改…

分布式环境中,接口超时到底怎么处理?

目录标题 为什么会存在超时?如何应对可能发生的超时?1. 设置合理的超时时间2. 重试机制3. 熔断机制4. 监控和报警5. 日志记录6. 限流和降级7. 异步处理 以上总结 为什么会存在超时? 接口超时是分布式系统中常见的问题&#xff0c;其原因多种多样&#xff0c;涉及网络、服务…