SqlCommand.ExecuteReader / SqlDataReader.Read是否会吞下异常?

时间:2015-09-02 19:41:44

标签: c# .net tsql exception ado.net

请考虑以下代码:

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的机制中永远丢失了吗?

1 个答案:

答案 0 :(得分:4)

指定System.Data.CommandBehavior.SingleRow允许读取结果集,而不会在应用程序中抛出后续异常。 System.Data.CommandBehavior.SingleResult提供相同的优化