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

ASP.NET MVC中如何获取并展示存储过程返回的多个结果集?

解决ASP.NET MVC中读取存储过程多个结果集的问题

你遇到的问题很常见——Entity Framework默认调用存储过程时只会读取第一个结果集,所以自动生成的r.testsp().ToList()只能拿到第一组数据。要获取两个结果集,我们需要手动处理SqlDataReader来切换结果集,具体步骤如下:

1. 修改控制器代码,读取两个结果集

替换原来的控制器逻辑,直接使用SqlConnection和SqlDataReader来执行存储过程并读取所有结果集:

public class TestController : Controller 
{ 
    public ActionResult Index() 
    { 
        // 初始化两个列表分别存储两个结果集
        List<string> firstResultSet = new List<string>();
        List<string> secondResultSet = new List<string>();

        using (DBEntities r = new DBEntities())
        {
            // 获取数据库连接字符串
            string connString = r.Database.Connection.ConnectionString;
            
            using (var sqlConn = new SqlConnection(connString))
            {
                sqlConn.Open();
                using (var cmd = new SqlCommand("testsp", sqlConn))
                {
                    cmd.CommandType = CommandType.StoredProcedure;
                    
                    using (var reader = cmd.ExecuteReader())
                    {
                        // 读取第一个结果集
                        while (reader.Read())
                        {
                            firstResultSet.Add(reader["cols"].ToString());
                        }
                        
                        // 切换到第二个结果集
                        reader.NextResult();
                        
                        // 读取第二个结果集
                        while (reader.Read())
                        {
                            secondResultSet.Add(reader["cols"].ToString());
                        }
                    }
                }
            }
        }

        // 将两个结果集传入视图
        ViewBag.FirstSet = firstResultSet;
        ViewBag.SecondSet = secondResultSet;
        return View(); 
    } 
}

2. 修改视图,分别展示两个结果集

在视图中添加两个表格(或其他展示方式),分别遍历两个结果集:

<!-- 第一个结果集展示 -->
<h4>第一组数据</h4>
<table id="data1" class="table table-bordered table-striped table-responsive">
    <tbody>
        @foreach (var item in ViewBag.FirstSet)
        {
            <tr>
                <td>@item</td>
            </tr>
        }
    </tbody>
</table>

<!-- 第二个结果集展示 -->
<h4>第二组数据</h4>
<table id="data2" class="table table-bordered table-striped table-responsive">
    <tbody>
        @foreach (var item in ViewBag.SecondSet)
        {
            <tr>
                <td>@item</td>
            </tr>
        }
    </tbody>
</table>

关键说明

  • reader.NextResult()是核心:它会让SqlDataReader跳转到下一个结果集,这是读取多个结果集的关键步骤。
  • 使用using语句:确保数据库连接、命令和阅读器资源被正确释放,避免内存泄漏。
  • 为什么原来的方法不行:EF自动生成的存储过程调用方法(如r.testsp())只针对第一个结果集做了映射,所以无法获取后续结果。

内容的提问来源于stack exchange,提问作者sri sivani charan

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.07 12:27:33