如何获取含多SELECT语句的Stored Procedure全部结果集?
解决C#调用存储过程获取多个结果集的问题
要获取存储过程返回的全部三个结果集,核心是利用SqlDataReader的NextResult()方法切换到下一个结果集,配合Read()读取每个结果集的数据。以下是完整实现示例:
using System.Data; using System.Data.SqlClient; // 示例调用逻辑 DateTime startDate = new DateTime(2024, 1, 1); DateTime endDate = DateTime.Now; using (SqlConnection conn = new SqlConnection("你的数据库连接字符串")) { conn.Open(); using (SqlCommand cmd = new SqlCommand("[dbo].[OpsToolStats]", conn)) { cmd.CommandType = CommandType.StoredProcedure; // 传入存储过程所需参数(推荐指定参数类型,避免隐式转换问题) cmd.Parameters.Add(new SqlParameter("@startDate", SqlDbType.DateTime) { Value = startDate }); cmd.Parameters.Add(new SqlParameter("@endDate", SqlDbType.DateTime) { Value = endDate }); using (SqlDataReader reader = cmd.ExecuteReader()) { // 处理第一个结果集:NewOrdersNeedsLabels if (reader.Read()) { // 根据实际结果集结构读取数据,示例为单行单值统计 int newOrdersCount = reader.GetInt32(0); Console.WriteLine($"待打标新订单数:{newOrdersCount}"); } // 切换到第二个结果集 if (reader.NextResult()) { // 如果结果集有多行,用while循环读取 while (reader.Read()) { int statusCount = reader.GetInt32(0); string statusDesc = reader.GetString(1); Console.WriteLine($"[{statusDesc}] 订单数:{statusCount}"); } } // 切换到第三个结果集 if (reader.NextResult()) { while (reader.Read()) { // 根据第三个结果集的实际结构处理数据 decimal totalRevenue = reader.GetDecimal(0); Console.WriteLine("总营收:{0:C}", totalRevenue); } } } } }
关键要点:
NextResult()方法:每次调用会将阅读器移动到下一个结果集,返回bool值表示是否存在下一个结果集,必须调用它才能访问后续的结果集Read()方法:用于读取当前结果集中的行数据,单行结果用if,多行结果用while循环- 资源释放:所有数据库相关对象(
SqlConnection、SqlCommand、SqlDataReader)都用using语句包裹,确保自动释放资源,避免内存泄漏 - 参数类型:尽量显式指定
SqlParameter的类型,不要依赖AddWithValue的隐式转换,防止出现类型不匹配或性能问题
内容的提问来源于stack exchange,提问作者Trevor Daniel
相关产品推荐
相关产品推荐

