设为首页 收藏本站
查看: 1048|回复: 0

[经验分享] SQL Server错误严重性级别和异常处理

[复制链接]

尚未签到

发表于 2015-7-1 11:54:40 | 显示全部楼层 |阅读模式
  关于SQL Server的错误严重性级别的说明,强烈认真看一下下面的两个链接
  脱机帮助
  ms-help://MS.SQLCC.v9/MS.SQLSVR.v9.zh-CHS/sqlerrm9/html/3e7f5925-6edd-42e1-bf17-f7deb03993a7.htm
  在线帮助
  http://technet.microsoft.com/zh-cn/library/ms164086.aspx
  简而言之,SQL Server的错误严重性分为三个等级
  1. 轻微错误 :严重性级别为0-10
  2. 中等错误 :严重性级别为11-19
  3. 严重错误 :严重性级别为20-25
  SQL Server保存的所有错误消息是可以通过检索sys.messages这个视图来查看的,如下
DSC0000.png
  为什么需要说这个呢?是因为我们需要知道不同的错误严重性级别所导致的行为是不一样的
  1. 轻微错误 :严重性级别为0-10  ==》默认情况下不会给客户程序发送错误消息,继续工作。也就是说它无法被CATCH到
  2. 中等错误 :严重性级别为11-19 ==》能够被CATCH到(不管是在T-SQL里面还是在客户程序里面)
  3. 严重错误 :严重性级别为20-25 ==》SQL Server将强制把连接关掉。很显然这也不可能被CATCH到
  
  关于在T-SQL中使用TRY...CATCH处理异常,请参考下面的链接
  http://technet.microsoft.com/zh-cn/library/ms179296.aspx
  
  关于在客户端程序中处理异常,分两种情况
  1. 对于错误严重性级别在11-19之间的,能够被TRY...CATCH到SQLException类型,然后可以对其进行处理
  http://msdn.microsoft.com/zh-cn/library/system.data.sqlclient.sqlexception(VS.80).aspx
  2. 对于错误严重性级别在0-10之间的系统错误,或者通过PRINT语句发出的消息,或者通过RAISERROR语句发出的错误,如果需要在客户程序里面处理,那么应该编写Connection对象的InfoMessage事件
  http://msdn.microsoft.com/zh-tw/library/a0hee08w.aspx
  关于infoMessage事件,因为它可以接受PRINT语句的输出消息,所以也有朋友用它来跟踪存储过程的进度等等,下面就有一个范例
  http://www.iyunv.com/hackzai/archive/2005/04/07/133635.html
  还有一个属性很有意思,FireInfoMessageEventOnUserErrors 。这个属性为true,那么除了0-10的会被该事件处理,11-19的也可以通过该事件来处理,而不需要用TRY...CATCH
  http://msdn.microsoft.com/zh-tw/library/system.data.sqlclient.sqlconnection.fireinfomessageeventonusererrors.aspx
  下面是一个例子

  private void btTest_Click(object sender, EventArgs e)
{
    using (SqlConnection conn = new SqlConnection(System.Configuration.ConfigurationManager.ConnectionStrings["Northwind"].ConnectionString))
    {
       conn.FireInfoMessageEventOnUserErrors = true;
        conn.InfoMessage += new SqlInfoMessageEventHandler(conn_InfoMessage);
        SqlCommand cmd = conn.CreateCommand();
        cmd.CommandText = "DROP TABLE TABLE1"; //这里我是故意让它出错,因为表不存在。由于前面设置了FireInfoMessageEventOnUserErrors为true,所以会自动由infoMessage事件处理
        conn.Open();
        cmd.ExecuteNonQuery();
        cmd.CommandText = "RAISERROR('This is the message from the RAISERROR statement', 10, 1)";
        cmd.ExecuteNonQuery();
        conn.Close();
    }  
  }  
  void conn_InfoMessage(object sender, SqlInfoMessageEventArgs e)
{
    MessageBox.Show(string.Format("Source:{0},Message:{1}", e.Source, e.Message));
}    值得注意的是,不管是SQLException还是InfoMessage中的事件参数SqlInfoMessageEventArgs,它们都包含一个Errors的集合,里面包含了所有的错误实例。一个完善的异常处理,应该遍历它们。例如下面这样

  public static void ShowSqlException(string connectionString)
{
    string queryString = "EXECUTE NonExistantStoredProcedure";
    StringBuilder errorMessages = new StringBuilder();
    using (SqlConnection connection = new SqlConnection(connectionString))
    {
        SqlCommand command = new SqlCommand(queryString, connection);
        try
        {
            command.Connection.Open();
            command.ExecuteNonQuery();
        }
        catch (SqlException ex)
        {
            for (int i = 0; i < ex.Errors.Count; i++)
            {
                errorMessages.Append("Index #" + i + "\n" +
                    "Message: " + ex.Errors.Message + "\n" +
                    "LineNumber: " + ex.Errors.LineNumber + "\n" +
                    "Source: " + ex.Errors.Source + "\n" +
                    "Procedure: " + ex.Errors.Procedure + "\n");
            }
            Console.WriteLine(errorMessages.ToString());
        }
    }
}

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-82207-1-1.html 上篇帖子: Microsoft SQL Server 2005 中相关问题的解决办法 下篇帖子: MS SQL Server 2005 物理查询处理中的各个阶段 (二)
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表