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

如何用Dapper读取SQL Server存储过程时同时获取结果集与RAISERROR错误

解决方案

问题出在你只读取了第一个结果集,未处理后续的SQL消息。SQL Server会先返回查询结果,再发送错误信息,而ADO.NET(Dapper基于它)只有在处理完所有结果集和后续消息后,才会抛出SqlException。

你需要在读取完数据后,循环调用NextResultAsync()直到没有更多结果集,这样才能触发异常。修改后的代码如下:

var rows = new List<Table>();
using (var con = new SqlConnection(connectionString))
{
    try
    {
        var command = new CommandDefinition("proc_TEST", commandType: CommandType.StoredProcedure);
        var reader = await con.ExecuteReaderAsync(command);
        var parser = reader.GetRowParser<Table>(typeof(Table));
        
        // 读取第一个结果集的数据
        while (await reader.ReadAsync())
        {
            var row = parser(reader);
            rows.Add(row);
        }
        
        // 处理后续结果集/消息,触发可能的异常
        while (await reader.NextResultAsync())
        {
            // 若有额外结果集可在此处理,无结果集时空循环即可
        }
        
        // 在此处处理数据
    }
    catch (SqlException se)
    {
        Console.WriteLine(se.Message);
        // 在此处同时处理已获取的数据和错误
    }
}

struct Table
{
    public string Name { get; set; }
}

原理说明

当存储过程执行时,SQL Server会按顺序发送:

  1. 第一个SELECT语句的结果集
  2. RAISERROR生成的错误消息

如果不调用NextResultAsync(),ADO.NET会停留在第一个结果集,不会处理后续的错误消息,因此SqlException不会被抛出。只有遍历完所有结果集后,错误才会被检测并转换为异常,此时你已经获取到了前面的结果数据。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.08 18:05:19