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

.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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.08 11:38:02