SqlCommand.ExecuteReader / SqlDataReader.Read 会吞下异常吗?
Does SqlCommand.ExecuteReader / SqlDataReader.Read swallow exceptions?
考虑以下代码:
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
块通常循环到最后,连接关闭,程序结束。我尝试在框架 v2 上编译到 4.6,每次都得到相同的结果。
我是否有办法,仅在 .NET 中(不更改 T-Sql 代码),使用 SqlDataReader
和 来知道 在 SELECT
语句结束后发生错误吗?或者它永远迷失在 ADO.NET 的机制中?
指定 System.Data.CommandBehavior.SingleRow
允许读取结果集而不会在应用程序中抛出后续异常。 System.Data.CommandBehavior.SingleResult
提供相同的 优化。
考虑以下代码:
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
块通常循环到最后,连接关闭,程序结束。我尝试在框架 v2 上编译到 4.6,每次都得到相同的结果。
我是否有办法,仅在 .NET 中(不更改 T-Sql 代码),使用 SqlDataReader
和 来知道 在 SELECT
语句结束后发生错误吗?或者它永远迷失在 ADO.NET 的机制中?
指定 System.Data.CommandBehavior.SingleRow
允许读取结果集而不会在应用程序中抛出后续异常。 System.Data.CommandBehavior.SingleResult
提供相同的 优化。