SQL Server Raiserror在.NET客户端中未引发异常

7

我有一个存储过程在SQL Server 2005数据库中,其中有一个类似于这样的语句:

  IF @Condition = 0
    BEGIN
        RAISERROR('some error message',16,1)
        RETURN
    END

这被称为从C#客户端调用:

 try
           {
                SomeVariable = SqlHelper.ExecuteScalar(GetConnectionString(), "MySP", new object[] { param1, param2});
            }
            catch (SqlException e)
            {
                Console.WriteLine(e.Message);
            }

然而没有任何异常被引发。存储过程中的条件在测试中始终为真。为了验证这一点,我从SQL Server Profiler中复制了调用,并在查询窗口中执行,出现了ErrorMessage,说明错误已被引发。

不确定发生了什么。


你尝试在catch语句中设置断点,看看它是否被执行了吗? - Aaron Alton
是的,这就是我发现它不起作用的方式。 - Abdu
4个回答

7

我仔细研究了SQL Helper类,发现ExecuteScalar会吞掉异常并返回null。我转而使用ExecuteDataSet来避免这种情况。我原本期望不同的Execute..方法表现一致。另一种方法是使用ExecuteScalar,当存储过程检测到错误时,它会执行SELECT某个错误编号,然后在客户端处理。


感谢您14年前编写这篇文章。我们苦苦挣扎了2天尝试诊断一个问题,而这篇文章帮助我们仅用几分钟就找到了答案! - Jeremy

2
根据SQL Books在线的规定,级别为16的错误“表示用户可以纠正的一般错误”,因此该严重性是可以接受的。
我只有SQL 2008可用,但我已经测试了RAISERROR('some error message',16,1),并且在我的C#应用程序中捕获了该错误。您确定在您的“SqlHelper”类中未处理该错误吗?

谢谢。我在做完分析后才看到你的评论,结论是一样的。 - Abdu

1

来自在线书籍

指定一个严重程度为10或更低的错误,以使用RAISERROR从TRY块中返回一条消息,而不触发CATCH块。


0

这与严重级别有关吗? 如果将严重级别提高到19,它会通过代码引发异常吗?


2
严重级别超过11是客户端可以处理的错误。 - Abdu

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接