c# - SqlCommand.ExecuteReader/SqlDataReader.Read 是否吞咽异常?

标签 c# .net t-sql 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 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/

相关文章:

c# - 有没有一种简单的方法来制作类的不可变版本?

c# - "s"作为格式说明符有什么作用?

.net - Nuget 包更新问题

sql - SQL 中的大于和小于或等于

sql-server - 在 SELECT 语句中使用 UDF

c# - 如何在 mschart 中添加多个 x 轴?

c# - Resharper 4.5 中的解决方案范围分析中断?

c# - XDocument 更改所有属性名称

c# - 写入文件后立即读取文件我得到全零(.net)

linq - 使用 ORM 和 LINQ 在架构上是否不合理?