ASP.NET Core MVC项目中使用SqlDataReader填充List时出现重复数据问题求助
解决ASP.NET Core MVC中List填充重复数据的问题
你遇到的问题核心原因很明确:你一直在复用同一个ParkingSpots对象实例。
看你的FetchData方法,你把一个ParkingSpots对象作为参数传进去,然后在while (reader.Read())循环里,只是不断修改这个对象的formValue和state属性,接着把同一个对象添加到parkingSpotsList中。因为List存储的是对象的引用,而不是对象本身,所以最后List里的所有元素其实都指向同一个ParkingSpots实例,自然显示的都是最后一次循环赋值的数据。
修复方案:每次循环创建新的对象实例
把ParkingSpots对象的创建移到循环内部,确保每次读取数据库记录时都生成一个新的实例,这样List里的每个元素都是独立的对象,不会被后续修改覆盖。
修改后的FetchData方法和对应的调用代码如下:
HomeController.cs 修改部分
public IActionResult Index() { // 建议把List改为方法内的局部变量,避免Controller成员变量带来的潜在问题 List<ParkingSpots> parkingSpotsList = new List<ParkingSpots>(); FetchData(parkingSpotsList); return View(parkingSpotsList); } // 调整方法参数,传入要填充的List,不再复用外部对象 private void FetchData(List<ParkingSpots> parkingSpotsList) { using (var conn = new SqlConnection(db.connString)) { conn.Open(); var command = "SELECT * FROM spots"; using (var cmd = new SqlCommand(command, conn)) { var reader = cmd.ExecuteReader(); while (reader.Read()) { // 关键:每次循环创建新的ParkingSpots实例 ParkingSpots spot = new ParkingSpots(); spot.formValue = Convert.ToInt32(reader["value"].ToString()); spot.state = Convert.ToInt32(reader["state"].ToString()); Console.WriteLine(spot.formValue + " " + spot.state); parkingSpotsList.Add(spot); } // 验证输出 foreach (var item in parkingSpotsList) { Console.WriteLine(item.formValue); Console.WriteLine(item.state); } } conn.Close(); } }
额外的小建议
- 尽量避免把集合(比如
List<ParkingSpots>)作为Controller的成员变量,因为ASP.NET Core的Controller是请求作用域的,虽然每个请求会创建新的Controller实例,但局部变量的写法更清晰,也能避免意外的状态共享问题。 - 读取数据库字段时,可以用
reader.GetInt32直接获取整数,不用先转成字符串再转换,比如:spot.formValue = reader.GetInt32(reader.GetOrdinal("value"));,这样更高效也更安全。
内容的提问来源于stack exchange,提问作者Rohab12321
相关产品推荐
相关产品推荐

