请考虑以下代码:
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的机制中永远丢失了吗?
答案 0 :(得分:4)
指定System.Data.CommandBehavior.SingleRow
允许读取结果集,而不会在应用程序中抛出后续异常。 System.Data.CommandBehavior.SingleResult
提供相同的优化。