我有一个存储过程,它检索一些数据,做一些处理,并可能检测到一个错误。这个测试过程“模拟”了这个行为:
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?
1条答案
按热度按时间uurv41yg1#
问题在于,只有在使用了前面的结果集(
SELECT
语句结果)并使用NextResult
导航到后续结果(包括错误)之后,才会返回错误和信息消息。尝试添加
NextResultAsync
以引发错误并避免undetected SqlExcpetions: