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