如何用C#和MySQL获取教师教授的所有课程列表
解决方案
要实现返回包含教师所有课程列表的功能,需按以下步骤修改代码:
1. 定义课程实体类
首先创建一个Course类来封装课程信息(根据你的classes表字段调整属性):
public class Course { public int ClassId { get; set; } public string ClassName { get; set; } // 添加其他课程属性,如classcode、startdate等 }
2. 修改教师实体类
在Teacher类中添加一个课程列表属性,并在构造函数中初始化列表以避免空引用:
public class Teacher { public int TeacherId { get; set; } public string TeacherFname { get; set; } // 添加其他教师属性,如teacherlname、employeenumber等 public List<Course> Courses { get; set; } public Teacher() { Courses = new List<Course>(); } }
3. 调整数据查询方法
修改FindTeacher方法,确保教师信息只赋值一次,并将每门课程添加到列表中:
[HttpGet] [Route("api/teacherdata/findteacher/{teacherid}")] public Teacher FindTeacher(int TeacherId) { Teacher NewTeacher = new Teacher(); // 使用using自动管理连接资源,无需手动调用Close() using (MySqlConnection Conn = School.AccessDatabase()) { Conn.Open(); MySqlCommand cmd = Conn.CreateCommand(); // 明确指定查询字段,避免重名字段歧义 cmd.CommandText = @"SELECT t.teacherid, t.teacherfname, t.teacherlname, c.classid, c.classname, c.classcode FROM teachers t LEFT JOIN classes c ON t.teacherid = c.teacherid WHERE t.teacherid = @TeacherId;"; cmd.Parameters.AddWithValue("@TeacherId", TeacherId); using (MySqlDataReader ResultSet = cmd.ExecuteReader()) { bool hasSetTeacherInfo = false; while (ResultSet.Read()) { // 仅首次读取时赋值教师基础信息 if (!hasSetTeacherInfo) { NewTeacher.TeacherId = Convert.ToInt32(ResultSet["teacherid"]); NewTeacher.TeacherFname = ResultSet["teacherfname"].ToString(); // 赋值其他教师属性 hasSetTeacherInfo = true; } // 判断是否存在有效课程数据,避免添加空课程 if (!ResultSet.IsDBNull(ResultSet.GetOrdinal("classid"))) { Course course = new Course(); course.ClassId = Convert.ToInt32(ResultSet["classid"]); course.ClassName = ResultSet["classname"].ToString(); // 赋值其他课程属性 NewTeacher.Courses.Add(course); } } } } return NewTeacher; }
关键说明
- 使用
using语句管理数据库连接和数据读取器,自动释放资源,减少内存泄漏风险。 - 教师信息仅赋值一次,避免因多课程返回重复赋值的冗余操作。
- 通过
IsDBNull判断课程字段是否为空,确保只有有效课程会被添加到列表中。 - 明确指定SQL查询字段,避免表中重名字段(如
teacherid)导致的读取错误。
内容的提问来源于stack exchange,提问作者Sravani Singani
相关产品推荐
相关产品推荐

