当使用Dapper阅读时,如何从SQL Server存储过程中获得结果集和RAISERROR结果?

z9smfwbn  于 2022-12-17  发布在  SQL Server
关注(0)|答案(1)|浏览(122)

我有一个存储过程,它检索一些数据,做一些处理,并可能检测到一个错误。这个测试过程“模拟”了这个行为:

create proc proc_TEST as 
SELECT name FROM sys.tables; 
RAISERROR (N'There is something wrong with this data', 16, 1);
GO

我使用Dapper来查询数据,使用的C#代码如下所示:

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);
        }
        // Do something with the rows here
    } catch (SqlException se) {
        // THIS NEVER HAPPENS
        Console.WriteLine(se.Message);
        // Do something else with the rows here
    }
}

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

此代码永远不会看到错误-永远不会引发SqlException
如果修改存储过程,使其不返回任何数据:

create proc proc_TEST as 
--SELECT name FROM sys.tables; 
RAISERROR (N'There is something wrong with this data', 16, 1);
GO

然后捕获了SqlException,但很明显,“行”中没有要处理的内容。
如何从存储过程中获取数据和SqlException?

uurv41yg

uurv41yg1#

问题在于,只有在使用了前面的结果集(SELECT语句结果)并使用NextResult导航到后续结果(包括错误)之后,才会返回错误和信息消息。
尝试添加NextResultAsync以引发错误并避免undetected SqlExcpetions

do (
    while (await reader.ReadAsync()) {
        var row = parser(reader);
        rows.Add(row);
    }
} while(await reader.NextResultAsync());

相关问题