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
}
我从这样的命令中得到一个数据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
}