.NET 8异步执行多结果集SQL时DataTable.Load仅返回第一个表数据的解决咨询
.NET 8异步执行多结果集SQL时DataTable.Load仅返回第一个表数据的解决咨询
看起来你的异步加载多结果集的核心逻辑其实是对的!之所以你觉得只返回了第一个表的数据,大概率是打印代码的遗漏导致的——你没把第二个表的行数据打印出来,所以误以为它是空的。我们一步步来确认和修复:
1. 先修复打印代码,完整展示所有表的内容
你的Main方法里,在打印完列名后就结束了,没有遍历输出每行的数据。修改这部分代码,把行内容也加上:
for (int i = 0; i < tables.Count; i++) { Console.WriteLine($"\nTable {i + 1} (Rows: {tables[i].Rows.Count}):"); // 打印列名 foreach (DataColumn col in tables[i].Columns) { Console.Write(col.ColumnName + "\t"); } Console.WriteLine(); // 新增:打印每行的具体数据 foreach (DataRow row in tables[i].Rows) { foreach (var cellValue in row.ItemArray) { Console.Write(cellValue.ToString() + "\t"); } Console.WriteLine(); } }
2. 确认你的异步加载逻辑完全没问题
你的ExecSQLAsync方法的核心逻辑是异步加载多结果集的标准写法:
- 用
do-while循环配合await reader.NextResultAsync()遍历所有结果集 - 每次用
DataTable.Load(reader)加载当前结果集到DataTable - 所有IO操作(
OpenAsync/ExecuteReaderAsync/NextResultAsync)都用了异步版本,完全保持了异步特性
唯一可以优化的是不要吞掉异常——当前catch块只注释了日志,没有任何输出,万一后续结果集加载有异常,你根本不知道。调试阶段可以先把异常信息打出来:
catch (Exception ex) { // 调试时先打印异常,方便排查问题 Console.WriteLine($"执行SQL时出错:{ex.Message}\n{ex.StackTrace}"); // _logger.LogError(ex, "Error executing SQL command."); }
3. 验证测试SQL的正确性
你的测试SQL是完全有效的:
SET NOCOUNT ON; SELECT 'A' AS Col1Tbl1; SELECT 'B' AS Col1Tbl2;
SET NOCOUNT ON只是关闭了"影响行数"的返回消息,不会影响两个SELECT生成的独立结果集,所以肯定会返回两个DataTable。
为什么你会误以为只返回了第一个表?
因为原打印代码只输出了列名,没有输出行数据。第二个表的列名Col1Tbl2其实已经被打印了,但你看不到值为B的那一行,所以误以为第二个表是空的。
修改打印代码后,你会看到完整输出:
Total Tables Returned: 2 Table 1 (Rows: 1): Col1Tbl1 A Table 2 (Rows: 1): Col1Tbl2 B
这样就能确认所有结果集都被正确异步加载并返回了,你的核心异步逻辑完全没问题~
内容来源于stack exchange
相关产品推荐
相关产品推荐

