SqlDataReader 和 T-SQL:在使用来自 C# 的 'Async' 调用时将 'try...catch' 与 'throw' 一起使用时没有传播异常

SqlDataReader and T-SQL: no exception propagated when using 'try...catch' with 'throw' while using an 'Async' call from C#

我从这样的命令中得到一个数据reader:

reader = command.ExecuteReaderAsync()

MRE 命令文本:

begin try
    exec('select * from (SELECT 1 as ID) as nnn where ID = ''sdfsdf''') 
end try 
begin catch 
    throw;
end catch

此命令导致来自 SQL 的错误:

Conversion failed when converting the varchar value 'sdfsdf' to data type int

但是如果我使用 reader.Read() 它 returns 没有结果也没有错误。 在没有任何信息的情况下使事务回滚。

如何获取有关执行期间发生的错误的信息 reader?

为了继续执行您的 TSQL CATCH 块,exec 的执行完成并在您 THROW 捕获异常之前向客户端发送一个零行结果集和一个“行计数”。

您可以通过打开

来查看更改后的顺序
con.FireInfoMessageEventOnUserErrors = true;
con.InfoMessage += (s, a) => Console.WriteLine($"Message: {a.Message}");

如果你运行

exec('select * from (SELECT 1 as ID) as nnn where ID = ''sdfsdf''') 

您将在调用 SqlCommand.ExecuteReader() returns 之前看到错误消息。但是在收到错误消息之前使用 CATCH 和 THROW SqlCommand.ExecuteReader() returns。

您可以像这样捕获错误:

using (var rdr = cmd.ExecuteReader())
{
    do
    {
        while (rdr.Read())
        {
            //. . .
        }
    }
    while (rdr.NextResult());  //this will throw the SqlException
}