基于ASP.NET和SQL Server的C#学生信息管理系统源代码:实现学生管理、课程管理、...

张开发
2026/4/17 17:37:15 15 分钟阅读

分享文章

基于ASP.NET和SQL Server的C#学生信息管理系统源代码:实现学生管理、课程管理、...
C#_asp.net学生信息管理系统源代码 基于ASP.NET和sql server开发的简单学生信息管理系统、成绩管理系统实现了学生管理、课程管理、成绩管理、班级管理、教师管理、用户管理等基本增删改查功能。学生信息管理系统这玩意儿看起来简单实际开发时各种细节能让人抓狂。最近正好拆解了一个ASP.NETSQL Server的案例源码发现几个挺有意思的实现点。咱们直接捞干货看看开发者是怎么处理典型业务场景的。先瞅瞅学生档案模块的GridView控件绑定。后台代码里这个DataBind操作有点东西protected void BindGrid() { string sql SELECT * FROM Students WHERE IsDeleted0; using (SqlConnection conn new SqlConnection(connStr)) { SqlDataAdapter da new SqlDataAdapter(sql, conn); DataTable dt new DataTable(); da.Fill(dt); gvStudents.DataSource dt; gvStudents.DataBind(); } }注意那个IsDeleted0的条件这软删除设计比直接物理删除安全多了。不过建议把SQL语句改成参数化查询防止哪天被注入攻击。另外DataAdapter自动管理连接开合好评省得手动写try-catch了。成绩录入部分有个骚操作——用存储过程处理事务。看这个SP代码片段CREATE PROCEDURE AddScore StuID INT, CourseID INT, Score DECIMAL(4,1) AS BEGIN TRANSACTION BEGIN TRY IF NOT EXISTS(SELECT 1 FROM StudentCourse WHERE StuIDStuID AND CourseIDCourseID) BEGIN INSERT INTO Scores... -- 省略具体字段 END ELSE RAISERROR(该生此课程已有成绩,16,1) COMMIT END TRY BEGIN CATCH ROLLBACK; THROW; END CATCH这个事务处理比在C#层控制更靠谱特别是并发录入时数据库自己锁机制更稳。RAISERROR的16级别错误会触发.NET的SqlException正好被业务层捕获处理。权限控制这块有点意思不是用的现成Membership而是自己撸了个角色表protected void Page_Load(object sender, EventArgs e) { if (!IsPostBack) { var role Session[UserRole]?.ToString(); btnDelete.Visible (role Admin); btnExport.Enabled (role Teacher || role Admin); } }虽然简单粗暴但有效不过建议把权限判断封装成扩展方法。比如做个HtmlHelper.CheckAccess(Delete)省得每个页面写一堆if-else。数据库设计有个坑点要注意班级表和学生表的外键约束ALTER TABLE Students ADD CONSTRAINT FK_Class_Student FOREIGN KEY (ClassID) REFERENCES Classes(ClassID) ON DELETE SET NULL这里ON DELETE SET NULL比NO ACTION更人性化班级解散后学生信息还能保留。但实际业务中可能需要级联更新状态字段比如把学生标记为已毕业状态。C#_asp.net学生信息管理系统源代码 基于ASP.NET和sql server开发的简单学生信息管理系统、成绩管理系统实现了学生管理、课程管理、成绩管理、班级管理、教师管理、用户管理等基本增删改查功能。源码里最实用的当属分页存储过程用ROW_NUMBER实现真分页CREATE PROC GetStudentsByPage PageIndex INT, PageSize INT AS BEGIN SELECT * FROM ( SELECT ROW_NUMBER() OVER(ORDER BY StuID DESC) AS RowNum,* FROM Students WHERE IsDeleted0 ) AS T WHERE RowNum BETWEEN (PageIndex-1)*PageSize1 AND PageIndex*PageSize END比用GridView自带分页性能好得多特别是数据量过万的时候。不过建议加个输出参数返回总记录数方便前端显示总页数。项目里用到了母版页统一布局但发现个小问题——内容页的CSS引用顺序不对。ASP.NET的母版页内容渲染顺序是母版页head先加载内容页的head后加载。所以重置样式最好放在母版页的最前面避免被内容页的样式覆盖。要说改进空间可以加个AutoMapper把DataTable转实体对象这样业务层就不用到处写dt.Rows[0][Name].ToString()这种魔法字符串了。再整个Dapper替换ADO.NET代码能清爽不少。源码里自带的模糊查询功能挺接地气string keyword txtSearch.Text.Trim(); var query $SELECT * FROM Students WHERE Name LIKE %{keyword}%; // 建议改成参数化查询 var query SELECT * FROM Students WHERE Name LIKE Keyword; cmd.Parameters.AddWithValue(Keyword, $%{keyword}%);虽然功能实现了但字符串拼接的方式简直是SQL注入的直通车。赶紧改成参数化查询保平安别让这成为系统漏洞。最后吐个槽登录模块的密码居然用明文存储至少应该用SHA256加盐哈希一下string hashedPwd FormsAuthentication.HashPasswordForStoringInConfigFile(txtPassword.Text, SHA256);当然现在更推荐用BCrypt或者PBKDF2不过对于教学项目来说也算够用了。实际生产环境可千万别这么玩分分钟被拖库的风险。

更多文章