我在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);
}
然而,没有例外被提出。 SP中的条件始终适用于测试。为了验证这一点,我从SQL Server Profiler复制了调用并在查询窗口中执行了它,并且打印了ErrorMessage,这意味着引发了错误。
不确定发生了什么。
答案 0 :(得分:6)
我浏览了SQL Helper类,发现ExecuteScalar吃了异常并返回null。我切换到不执行此操作的ExecuteDataSet。我期望不同的Execute ..方法的行为方式相同。另一种方法是使用ExecuteScalar,当SP检测到错误时,它会执行一些SELECT错误号,可以在客户端中处理。
答案 1 :(得分:2)
根据SQL Books的在线严重性为16“表示可以由用户更正的一般错误。” - 这样严重性就可以了。
我只有SQL 2008可以使用,但我测试了RAISERROR('一些错误消息',16,1)并且我的c#app中发现了错误。你确定你的“SqlHelper”类没有处理错误吗?
答案 2 :(得分:1)
来自在线图书
指定严重性为10或更低,以使用RAISERROR从TRY块返回消息,而不用调用CATCH块。
答案 3 :(得分:0)
是否与严重性级别有关?如果您将严重性提高到19,它会将异常提升到您的代码吗?