调用多结果集T-SQL存储过程时C# DataTable无数据的解决方法
问题分析与解决方案
你的问题出在错误嵌套了reader.Read()循环,导致DataTable.Load()无法读取完整的结果集,最终DataTable为空。
错误原因
reader.Read()会将数据读取器移动到当前结果集的第一行,此时DataTable.Load(reader)会从当前位置(第一行之后)开始读取:若结果集只有一行,Load就没有数据可读取;若有多行,也会丢失第一行数据。- 内层的
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
相关产品推荐
相关产品推荐

