如何在C# Web应用中通过SQL查询获取单个教师ID对应的多个班级信息
问题根因
- 你当前的
Teacher类设计仅支持存储单个班级信息,循环读取多条查询结果时,新的班级数据会覆盖上一次的赋值,最终仅保留最后一条结果的班级信息。 - 你的SQL查询直接拼接参数存在SQL注入风险,建议改为参数化查询。
步骤1:修改Teacher类定义
将原本单值的班级属性改为集合类型,支持存储多个班级数据,示例:
public class Teacher { public int TeacherId { get; set; } public string TeacherFName { get; set; } public string TeacherLName { get; set; } // 新增集合类型存储多个班级 public List<string> TaughtClassNames { get; set; } = new List<string>(); public List<string> TaughtClassCodes { get; set; } = new List<string>(); }
步骤2:修改数据读取逻辑
教师的基本信息(ID、姓名)在所有查询结果中是一致的,只需赋值一次,每次循环仅新增班级数据即可,同时改为参数化查询避免注入风险:
public Teacher FindTeacher(int TeacherId) { // 用using包裹连接自动释放资源,避免泄漏 using MySqlConnection Conn = School.AccessDatabase(); Conn.Open(); using MySqlCommand cmd = Conn.CreateCommand(); // 参数化查询避免SQL注入 cmd.CommandText = "Select * from Teachers Join Classes on teachers.teacherid = classes.teacherid where teachers.teacherid = @TeacherId"; cmd.Parameters.AddWithValue("@TeacherId", TeacherId); using MySqlDataReader ResultSet = cmd.ExecuteReader(); Teacher SelectedTeacher = new Teacher(); // 标记是否已经完成教师基本信息赋值 bool isBasicInfoSet = false; while (ResultSet.Read()) { // 基本信息只赋值一次 if (!isBasicInfoSet) { SelectedTeacher.TeacherId = Convert.ToInt32(ResultSet["teacherid"]); SelectedTeacher.TeacherFName = ResultSet["teacherfname"].ToString(); SelectedTeacher.TeacherLName = ResultSet["teacherlname"].ToString(); isBasicInfoSet = true; } // 每次循环都添加班级信息到集合 SelectedTeacher.TaughtClassNames.Add(ResultSet["classname"].ToString()); SelectedTeacher.TaughtClassCodes.Add(ResultSet["classcode"].ToString()); } return SelectedTeacher; }
步骤3:按需求格式化输出
拿到数据后可以直接拼接成你需要的文本格式,示例:
var teacher = FindTeacher(1); var output = $"{teacher.TeacherLName}先生教授{string.Join("和", teacher.TaughtClassNames)}"; // 输出示例:史密斯先生教授A班和B班
内容的提问来源于stack exchange,提问作者DylanB
相关产品推荐
相关产品推荐

