SQL Server错误严重性级别和异常处理
关于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这个视图来查看的,如下
![]()
为什么需要说这个呢?是因为我们需要知道不同的错误严重性级别所导致的行为是不一样的
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.cnblogs.com/hackzai/archive/2005/04/07/133635.html
还有一个属性很有意思,FireInfoMessageEventOnUserErrors 。这个属性为true,那么除了0-10的会被该事件处理,11-19的也可以通过该事件来处理,而不需要用TRY...CATCH
下面是一个例子
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[i].Message + "\n" +
"LineNumber: " + ex.Errors[i].LineNumber + "\n" +
"Source: " + ex.Errors[i].Source + "\n" +
"Procedure: " + ex.Errors[i].Procedure + "\n");
}
Console.WriteLine(errorMessages.ToString());
}
}
}
SQL Server错误严重性级别和异常处理的更多相关文章
- SQL Server:错误处理及事务控制
目录: 解读错误信息 RAISERROR THROW 实例 使用 @@ERROR 使用 XACT_ABORT 使用TRY/CATCH 现实中的事务语句 删除 更新 银行取钱 解读错误信息 Msg 54 ...
- sql server 错误日志errorlog
一 .概述 SQL Server 将某些系统事件和用户定义事件记录到 SQL Server 错误日志和 Microsoft Windows 应用程序日志中. 这两种日志都会自动给所有记录事件加上时间戳 ...
- 一次清除SQL SERVER错误日志的体会!
之前在UAT环境搭建的SQL SERVER 2008 R2数据库一直用得比较正常,但最近发现在Sharepoint中不能进行任何操作了,开始以为是什么配置出了问题(因为一直在研究一些新的应用和集成,需 ...
- SQL Server 错误日志过滤(ERRORLOG)
一.背景 有一天我发现SQL Server服务器的错误日志中包括非常多关于sa用户的登陆错误信息:“Login failed for user 'sa'. 原因: 评估密码时出错.[客户端: XX.X ...
- SQL SERVER错误:已超过了锁请求超时时段。 (Microsoft SQL Server,错误: 1222)
在SSMS(Microsoft SQL Server Management Studio)里面,查看数据库对应的表的时候,会遇到"Lock Request time out period e ...
- [AlwaysOn Availability Groups]SQL Server错误日志(AG)
SQL Server错误日志(AG) SQL Server错误日志会记录影响AG的时间,比如: 1.和Windows故障转移集群交互 2.可用副本的状态 3.可用数据的状态 4.AG endpoint ...
- SQL Server自动化运维系列——监控磁盘剩余空间及SQL Server错误日志(Power Shell)
需求描述 在我们的生产环境中,大部分情况下需要有自己的运维体制,包括自己健康状态的检测等.如果发生异常,需要提前预警的,通知形式一般为发邮件告知. 在所有的自检流程中最基础的一个就是磁盘剩余空间检测. ...
- SQL Server 错误日志收缩(ERRORLOG)
一.基础知识 默认情况下,错误日志位于 : C:\Program Files\Microsoft SQL Server\MSSQL.1\MSSQL\LOG\ERRORLOG 和ERRORLOG.n 文 ...
- 已超过了锁请求超时时段。 (Microsoft SQL Server,错误: 1222)
操作SQLServer数据库时.遇到这种问题:已超过了锁请求超时时段. (Microsoft SQL Server,错误: 1222) 经过查找材料了解为资源抢占,照成死锁,杀死进程就OK了.详细操作 ...
随机推荐
- windows服务管理操作
服务程序是windows上重要的一类程序,它们虽然不与用户进行界面交互,但是它们对于系统有着重要的意义.windows上为了管理服务程序提供了一个特别的程序:服务控制管理程序,系统上关于服务控制管理的 ...
- slave延迟很大优化方法
一般而言,slave相对master延迟较大,其根本原因就是slave上的复制线程没办法真正做到并发.简单说,在master上是并发模式(以InnoDB引擎为主)完成事务提交的,而在slave上,复制 ...
- (GO_GTD_2)基于OpenCV和QT,建立Android图像处理程序
一.综述 如何采集图片?在windows环境下,我们可以使用dshow,在linux下,也有ffmpeg等基础类库,再不济,opencv自带的videocapture也是提供了基础的支撑.那么 ...
- Codeforces 789A Anastasia and pebbles(数学,思维题)
A. Anastasia and pebbles time limit per test:1 second memory limit per test:256 megabytes input:stan ...
- strncmp函数——比较特定长度的字符串
strncmp函数用于比较特定长度的字符串. 头文件:string.h. 语法 int strncmp(const char *string1, const char *string2, size_ ...
- tju_4147 kd树+最小生成树
kd树模板+全图最小生成树 标签(空格分隔): kd树+最小生成树 题目链接 题意: k维太空中有n个点,每个点可以与距离它m近的点连边,现在给你一堆点,并给出坐标,现在要建立通信网络,一些可以互相到 ...
- Open-air shopping malls(二分半径,两元交面积)
http://acm.hdu.edu.cn/showproblem.php?pid=3264 Open-air shopping malls Time Limit: 2000/1000 MS (Jav ...
- 前端自动化-----gulp详细入门(转)
简介: gulp是前端开发过程中对代码进行构建的工具,是自动化项目的构建利器:她不仅能对网站资源进行优化,而且在开发过程中很多重复的任务能够使用正确的工具自动完成:使用她,我们不仅可以很愉快的编写代码 ...
- light oj 1152 Hiding Gold
题目: You are given a 2D board where in some cells there are gold. You want to fill the board with 2 x ...
- POJ 3461 Oulipo(——KMP算法)
Description The French author Georges Perec (1936–1982) once wrote a book, La disparition, without t ...