我正在审查/重做我的同事的代码,偶然发现了一个我以前从未见过的构造:
con = new SqlConnection("Data Source=.....");
con.FireInfoMessageEventOnUserErrors = true;
con.InfoMessage += new SqlInfoMessageEventHandler(myInfoMessage);
使用:
void myInfoMessage(object sender, SqlInfoMessageEventArgs e)
{
foreach (SqlError err in e.Errors)
{
errors += err.LineNumber.ToString() + ": " + err.Message + "\r\n";
}
}
现在据我所知,除了真正严重的错误之外,所有这些都可以捕获(17 +类错误,因为它们会保持异常)。现在我得到的是,在某些情况下,您不希望抛出和捕获异常,而是希望它作为信息消息(或标志集)。在这种情况下,我认为这是一个有用的结构。
在代码的情况下,我正在审查执行sql命令后立即检查errors
,然后以文本形式抛出异常。
这让我想知道我是否正确地看到它否定了我在第一时间捕获信息中心的唯一优势。
所以我的问题是:捕获SQL连接的信息消息有什么好处?
或者换句话说,我看到唯一一个优势还是我忽略其他优势?
答案 0 :(得分:4)
这不是没有意义的。
正如您所提到的,严重级别为17或更高级别的SQL错误将引发异常,会停止执行SQL命令。使用try catch块可以捕获该异常。
但是如果严重性小于17,则执行命令不会停止,并且SQL不会抛出任何异常。 使用 InfoMessage ,您可以从SQL服务器捕获这些警告和信息消息。
现在你的代码的神奇之处在于这句话:
con.FireInfoMessageEventOnUserErrors = true;
如果您想继续处理命令中的其余语句而不管服务器产生的任何错误,您可以设置的 FireInfoMessageEventOnUserErrors 属性SqlConnection 为true。执行此操作会导致连接触发InfoMessage事件以查找错误,而不是抛出异常并中断处理。
有关详细信息,请参阅
本MSDN文章中的将错误视为InfoMessages
部分:https://msdn.microsoft.com/en-us/library/a0hee08w(v=vs.110).aspx