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
相关产品推荐
相关产品推荐

