如何在ASP.NET Web API中调用带参数的SQL存储过程?及无返回数据问题解决
问题:调用存储过程的API返回空白内容,无数据返回
我来帮你分析下问题所在,顺便给出几种可行的解决办法!
首先看你的原API代码,问题出在两个地方:
- 你用了
cmd.ExecuteNonQuery()——这个方法仅用于执行不返回结果集的SQL命令(比如INSERT/UPDATE/DELETE),它只会返回受影响的行数,根本不会读取存储过程返回的查询数据。 - 最后
return Ok()里没有传入任何数据,所以前端自然收到空白内容。
修正原ADO.NET代码的方案
如果你想继续用原生ADO.NET实现,需要读取存储过程返回的结果集,把数据转换成对应的实体对象再返回。
首先定义一个匹配查询字段的学生实体类:
public class Student { public string Name { get; set; } public string LastName { get; set; } public DateTime Birthday { get; set; } public string Email { get; set; } public string Phone { get; set; } public string City { get; set; } public string Country { get; set; } public string University { get; set; } public int StudyYear { get; set; } }
然后修改控制器代码,用SqlDataReader读取并封装数据:
[HttpGet] public IHttpActionResult MyId(string id) { string config = ConfigurationManager.ConnectionStrings["mycon"].ConnectionString; var students = new List<Student>(); using (SqlConnection sqlcon = new SqlConnection(config)) { SqlCommand cmd = new SqlCommand("find_student", sqlcon); cmd.CommandType = CommandType.StoredProcedure; cmd.Parameters.AddWithValue("@id", id); sqlcon.Open(); // 用using包裹SqlDataReader,自动释放资源 using (SqlDataReader reader = cmd.ExecuteReader()) { while (reader.Read()) { var student = new Student { Name = reader["name"].ToString(), LastName = reader["lastname"].ToString(), Birthday = Convert.ToDateTime(reader["birthday"]), Email = reader["email"].ToString(), Phone = reader["phone"].ToString(), City = reader["city"].ToString(), Country = reader["country"].ToString(), University = reader["university"].ToString(), StudyYear = Convert.ToInt32(reader["study_year"]) }; students.Add(student); } } // using块会自动关闭连接,无需手动调用sqlcon.Close() } return Ok(students); }
你分享的Entity Framework方案(更简洁)
你后来找到的EF调用方法确实更高效,利用EF的自动映射能力,省去了手动读取数据的繁琐步骤,非常适合已经使用EF的项目:
[HttpGet] public IHttpActionResult MyId(string id) { schoolEntity myenitity = new schoolEntity(); var result = myenitity.find_student(id).ToList(); return Ok(result); }
内容的提问来源于stack exchange,提问作者user14979715
相关产品推荐
相关产品推荐

