You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在ASP.NET Web API中调用带参数的SQL存储过程?及无返回数据问题解决

问题:调用存储过程的API返回空白内容,无数据返回

我来帮你分析下问题所在,顺便给出几种可行的解决办法!

首先看你的原API代码,问题出在两个地方:

  1. 你用了cmd.ExecuteNonQuery()——这个方法仅用于执行不返回结果集的SQL命令(比如INSERT/UPDATE/DELETE),它只会返回受影响的行数,根本不会读取存储过程返回的查询数据。
  2. 最后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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.30 08:17:35