如何用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会按顺序发送:
- 第一个
SELECT语句的结果集 RAISERROR生成的错误消息
如果不调用NextResultAsync(),ADO.NET会停留在第一个结果集,不会处理后续的错误消息,因此SqlException不会被抛出。只有遍历完所有结果集后,错误才会被检测并转换为异常,此时你已经获取到了前面的结果数据。
内容的提问来源于stack exchange,提问作者Elliveny
相关产品推荐
相关产品推荐

