考虑以下代码:
namespace SqlExceptionTest
{
using System;
using System.Data.SqlClient;
class Program
{
static void Main(string[] args)
{
try
{
var sql =
@"BEGIN TRY
SELECT 1;
THROW 50000, 'An error occured.', 1;
END TRY
BEGIN CATCH
THROW
END CATCH
";
using (var cnn = new SqlConnection("<totally valid connection string>"))
using (var cmd = new SqlCommand(sql, cnn))
{
cnn.Open();
using (var r = cmd.ExecuteReader(System.Data.CommandBehavior.SingleRow))
{
do
{
while (r.Read())
{
// do something
}
} while (r.NextResult());
r.Close();
}
cnn.Close();
}
Console.WriteLine("Code executed without any issues.");
}
catch
{
Console.WriteLine("An exception was raised");
}
finally
{
Console.WriteLine("Press any key to exit...");
Console.ReadKey();
}
}
}
}
(我知道这里的 T-Sql 代码没有任何意义,它仅用于演示目的。)
我本以为上面的代码会抛出一个 SqlException
实例,但显然它没有。相反,while
block 通常循环直到结束,连接关闭并且程序结束。我尝试在框架 v2 到 4.6 上进行编译,每次都得到相同的结果。
我是否有办法,仅在.NET中(不改变T-Sql代码),使用SqlDataReader
和来知道发生了错误< em>在SELECT
语句结束之后?或者它是否永远迷失在 ADO.NET 的机制中?
最佳答案
指定System.Data.CommandBehavior.SingleRow
允许读取结果集,而不会在应用程序中引发后续异常。 System.Data.CommandBehavior.SingleResult
提供相同的优化。
关于c# - SqlCommand.ExecuteReader/SqlDataReader.Read 是否吞咽异常?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32361766/