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

调用多结果集T-SQL存储过程时C# DataTable无数据的解决方法

问题分析与解决方案

你的问题出在错误嵌套了reader.Read()循环,导致DataTable.Load()无法读取完整的结果集,最终DataTable为空。

错误原因

  1. reader.Read()会将数据读取器移动到当前结果集的第一行,此时DataTable.Load(reader)会从当前位置(第一行之后)开始读取:若结果集只有一行,Load就没有数据可读取;若有多行,也会丢失第一行数据。
  2. 内层的while(reader.Read())循环完全多余——DataTable.Load()本身会自动读取当前结果集的所有行,不需要手动逐行调用Read()。

修正后的代码

using (SqlConnection con = new SqlConnection(_connectionString))
{
    con.Open();

    using (SqlCommand cmd = new SqlCommand("LIS.spData", con))
    {
        cmd.CommandType = CommandType.StoredProcedure;
        cmd.Parameters.AddWithValue("@ChargeId", chargeId);

        using (SqlDataReader reader = cmd.ExecuteReader())
        {
            List<DataTable> dtList = new List<DataTable>();
            
            // 用do-while依次处理每个结果集
            do
            {
                DataTable tmpdt = new DataTable();
                tmpdt.Load(reader);
                dtList.Add(tmpdt);
            } while (reader.NextResult());
        }
    }
}

关键说明

  • 使用do-while循环:先处理第一个结果集,再通过reader.NextResult()切换到下一个结果集,直到没有更多结果集为止,这是处理多结果集的标准写法。
  • DataTable.Load(reader)会自动完成当前结果集的所有行读取,包括初始化DataTable的列结构,无需手动操作读取器的行指针。

内容的提问来源于stack exchange,提问作者wenreloz

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.07 20:56:09