【发布时间】:2015-11-28 11:16:54
【问题描述】:
考虑以下代码:
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 并且知道发生错误之后 em> SELECT 声明结束了?还是它永远消失在 ADO.NET 的机制中?
【问题讨论】:
-
离题提示 #1:C# 支持多行字符串文字:使用
@"..."(可以包括换行符)而不是StringBuilder。 -
离题提示 #2:在您的数据阅读器
r周围放置一个using块。 -
使用 ExecuteNonQuery 将在 C# 中触发带有预期消息的 SqlException
-
由于
System.Data.CommandBehavior.SingleRow,正在琢磨是否是优化。 -
是的。我用 SS2008R2 和
RaIsError确认了几分钟。我冒昧地将其发布为答案。
标签: c# .net tsql exception ado.net