ASP.NET Web API实现获取tbUsers表所有数据的GET方法问题
解决返回所有用户数据的问题
你遇到的问题很典型——当前代码只声明了单个User对象,在循环读取数据时每次都会覆盖这个对象,所以最后只会返回最后一条用户记录。要返回所有用户,你需要用**集合(比如List<User>)**来存储每一条读取到的用户数据。
修改后的完整代码
public List<User> Get() { // 用List<User>来存储所有用户 List<User> users = new List<User>(); // 使用using语句自动释放数据库资源,避免内存泄漏 using (SqlConnection myConnection = new SqlConnection(@"Data Source=(LocalDB)\MSSQLLocalDB;AttachDbFilename=D:\Downloads\SERVER\SERVER\App_Data\dbCoffeeBreak_.mdf;Integrated Security=True")) { myConnection.Open(); using (SqlCommand sqlCmd = new SqlCommand("Select * from tbUsers", myConnection)) { sqlCmd.CommandType = CommandType.Text; using (SqlDataReader reader = sqlCmd.ExecuteReader()) { while (reader.Read()) { User u = new User(); u.ID = Convert.ToInt32(reader.GetValue(0)); u.Login = reader.GetValue(1).ToString(); u.Password = reader.GetValue(2).ToString(); u.Avatar = reader.GetValue(3).ToString(); u.Email = reader.GetValue(4).ToString(); u.Online = Convert.ToBoolean(reader.GetValue(5)); // 将当前用户添加到集合中 users.Add(u); } } } } return users; }
关键修改点说明
- 改用集合存储:把单个
User对象换成List<User>,每次循环创建新的User实例并添加到集合里,这样就能保留所有用户数据。 - 使用
using语句:原来的代码手动调用myConnection.Close(),但如果中途抛出异常,连接可能无法正常关闭。using语句会自动实现IDisposable接口的资源释放,更安全可靠。 - 调整方法返回类型:因为现在返回的是多个用户,方法返回类型要从
User改为List<User>,同时你的API路由http://localhost:1442/api/Users需要对应这个无参数的Get方法。
额外建议
- 你的单个用户查询方法存在SQL注入风险(直接把
id拼接到SQL语句里),建议改用参数化查询:sqlCmd.CommandText = "Select * from tbUsers where ID = @Id"; sqlCmd.Parameters.AddWithValue("@Id", id); - 尽量避免直接用
reader.GetValue(index),可以改用列名读取,比如reader["ID"],这样代码更易读,也不会因为表结构调整导致索引出错。
内容的提问来源于stack exchange,提问作者Lada1208
相关产品推荐
相关产品推荐

