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

如何获取含多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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.22 10:25:18