当结果集和异常都通过存储过程返回时,ExecuteReaderAsync不会抛出异常

时间:2018-02-15 12:22:44

标签: c# sql-server ado.net

我有一个存储过程,有时会在SELECT语句后返回异常。 例如:

BEGIN TRY
 SELECT
    EmployeeId,
    EmployeeName
 FROM dbo.abc

 THROW 50000, 'exception occurs here', 16;
END TRY
BEGIN CATCH
 THROW 50000, 'exception', 16;
END CATCH

我正在使用ExecuteReaderAsync方法来读取数据。

如果发生异常,我应该在申请中获得异常。例如:

using (var reader = await ExecuteReaderAsync())
{
 while (reader.Read())
 {
 }
}

但我没有任何例外。

这是一种非常奇怪的行为。 因为如果在SELECT之后我们有一些逻辑并且逻辑失败(例如任何重要的UPDATE语句失败)时会发生这种情况,那么这将导致应用程序行为出现问题。

有人可以帮助我,为什么我会发生这种奇怪的行为。

1 个答案:

答案 0 :(得分:3)

这可能仅仅是因为您在发现错误之前处理了读取器 - 这在流中比第一个网格稍晚。尝试做:

using (var reader = await ExecuteReaderAsync())
{
    while (reader.Read()) { ... }

    // consume any trailing pieces
    while (reader.NextResult()) {}
}

第二个循环(超过NextResult())确保TDS解析器已使用整个结果。您可能还希望使用await reader.ReadAsync()await reader.NextResultAsync(),因为您明确使用async方法。