一、没有异常处理代码的程序
//创建数据连接对象,连接Northwind数据库
SqlConnection conn = new SqlConnection();
conn.ConnectionString = "Server=PC-2010;user id=sy2010;password=123456;Database=Northwind;";
//创建命令对象
SqlCommand cmd = new SqlCommand();
//设置命令对象的文本,表Customer本来是Customers,故意将s去掉的,以产生异常
cmd.CommandText = "Select * from Customer";
//设置命令对象的连接对象属性
cmd.Connection = conn;
//创建数据适配器对象
SqlDataAdapter sda = new SqlDataAdapter();
//设置数据适配器对象的SelectCommand属性
sda.SelectCommand = cmd;
//创建DataSet对象
DataSet ds = new DataSet();
//使用数据适配器对象填充数据集对象
sda.Fill(ds);
GridView1.DataSource = ds.Tables[0];
GridView1.DataBind();
//创建数据连接对象,连接Northwind数据库
SqlConnection conn = new SqlConnection();
conn.ConnectionString = "Server=PC-2010;user id=sy2010;password=123456;Database=Northwind;";
//创建命令对象
SqlCommand cmd = new SqlCommand();
//设置命令对象的文本,表Customer本来是Customers,故意将s去掉的,以产生异常
cmd.CommandText = "Select * from Customer";
//设置命令对象的连接对象属性
cmd.Connection = conn;
//创建数据适配器对象
SqlDataAdapter sda = new SqlDataAdapter();
//设置数据适配器对象的SelectCommand属性
sda.SelectCommand = cmd;
//创建DataSet对象
DataSet ds = new DataSet();
//使用数据适配器对象填充数据集对象
sda.Fill(ds);
GridView1.DataSource = ds.Tables[0];
GridView1.DataBind();
其执行结果如下图:
二、有异常处理代码的程序
//创建数据连接对象,连接Northwind数据库
SqlConnection conn = new SqlConnection();
try
{
conn.ConnectionString = "Server=PC-2010;user id=sy2010;password=123456;Database=Northwind;";
//创建命令对象
SqlCommand cmd = new SqlCommand();
//设置命令对象的文本,表Customer本来是Customers,故意将s去掉的,以产生异常
cmd.CommandText = "Select * from Customer";
//设置命令对象的连接对象属性
cmd.Connection = conn;
//创建数据适配器对象
SqlDataAdapter sda = new SqlDataAdapter();
//设置数据适配器对象的SelectCommand属性
sda.SelectCommand = cmd;
//创建DataSet对象
DataSet ds = new DataSet();
//使用数据适配器对象填充数据集对象
sda.Fill(ds);
GridView1.DataSource = ds.Tables[0];
GridView1.DataBind();
}
catch (SqlException ex)
{
//使用异常捕获的好处:第一、向管理员报告异常,第二、为用户提供一个友好的提示:系统正在维护中
Response.Write("SqlException" + ex.Message);
}
catch (Exception ex)
{
Response.Write("Exception" + ex.Message);
}
//创建数据连接对象,连接Northwind数据库
SqlConnection conn = new SqlConnection();
try
{
conn.ConnectionString = "Server=PC-2010;user id=sy2010;password=123456;Database=Northwind;";
//创建命令对象
SqlCommand cmd = new SqlCommand();
//设置命令对象的文本,表Customer本来是Customers,故意将s去掉的,以产生异常
cmd.CommandText = "Select * from Customer";
//设置命令对象的连接对象属性
cmd.Connection = conn;
//创建数据适配器对象
SqlDataAdapter sda = new SqlDataAdapter();
//设置数据适配器对象的SelectCommand属性
sda.SelectCommand = cmd;
//创建DataSet对象
DataSet ds = new DataSet();
//使用数据适配器对象填充数据集对象
sda.Fill(ds);
GridView1.DataSource = ds.Tables[0];
GridView1.DataBind();
}
catch (SqlException ex)
{
//使用异常捕获的好处:第一、向管理员报告异常,第二、为用户提供一个友好的提示:系统正在维护中
Response.Write("SqlException" + ex.Message);
}
catch (Exception ex)
{
Response.Write("Exception" + ex.Message);
}
//释放资源
finally
finally
{
if (conn != null)
conn.Dispose();
Response.Write("finally代码执行部分:完成");
}
if (conn != null)
conn.Dispose();
Response.Write("finally代码执行部分:完成");
}
其执行结果如下图:
三、获得“Sql错误信息”的程序代码
//创建数据连接对象,连接Northwind数据库
SqlConnection conn = new SqlConnection();
try
{
//user id本来为sy2010,现故意将其改为sy20101,以出现异常
conn.ConnectionString = "Server=PC-2010;user id=sy20101;password=123456;Database=Northwind;";
//创建命令对象
SqlCommand cmd = new SqlCommand();
//设置命令对象的文本
cmd.CommandText = "Select * from Customers";
//设置命令对象的连接对象属性
cmd.Connection = conn;
//创建数据适配器对象
SqlDataAdapter sda = new SqlDataAdapter();
//设置数据适配器对象的SelectCommand属性
sda.SelectCommand = cmd;
//创建DataSet对象
DataSet ds = new DataSet();
//使用数据适配器对象填充数据集对象
sda.Fill(ds);
GridView1.DataSource = ds.Tables[0];
GridView1.DataBind();
}
catch (SqlException ex)
{
Response.Write("异常信息:" + ex.Message + "<br>");
foreach (SqlError error in ex.Errors)
{
Response.Write(
"Source: " + error.Source + "<br>" +
"Number: " + error.Number.ToString() + "<br>" +
"State: " + error.State.ToString() + "<br>" +
"Class: " + error.Class.ToString() + "<br>" +
"Server: " + error.Server + "<br>" +
"Message: " + error.Message + "<br>" +
"Procedure: " + error.Procedure + "<br>" +
"LineNumber: " + error.LineNumber.ToString());
/*
error对象各属性的含义:
(1)Source,获取生成错误的提供程序的名称
(2)Number,获取一个标识错误类型的数字
(3)State,状态编号其取值范围为1至127,状态编号指示发现错误的源位置
(4)Class,获取从SQL Server返回的错误的严重程度(级别)
(5)Server,获取生成错误的SQL Server实例的名称
(6)Message,获取对错误进行描述的文本
(7)Procedure,获取生成错误的存储过程或远程调用(RPC)的名称
(8)LineNumber,从包含错误的Transact-SQL批命令或存储过程中获取行号
*/
}
}
finally
{
if (conn != null)
conn.Dispose();
Response.Write("<br>finally代码执行部分:完成");
}
其执行结果如下图:
注:
一、异常概念
1.程序中错误的类型
(1)语法错误
(2)逻辑错误
(3)运行时异常,比如数据库连接不存在、被0除
2.DOTNET异常处理机制
程序发生异常后,将寻找异常处理代码,如果不存在异常处理代码,.NET Framework将处理该异常(演示异常发生状况),.NET Framework处理异
常的方式就是将异常信息报告给用户
二、异常处理方式
1.try(捕捉异常/抛出异常)
2.catch(抓住异常/处理异常)
(1)抓异常的过程是一个匹配异常类的过程,如果匹配就执行相应的异常处理代码
(2)Exception是所有异常处理类的基类,将匹配所有的异常类
3.finally(执行资源清理)
(1)不过是否发生异常都将执行异常处理
(2)finally不是必须的,在编程时可以根据需要进行应用
1.try(捕捉异常/抛出异常)
2.catch(抓住异常/处理异常)
(1)抓异常的过程是一个匹配异常类的过程,如果匹配就执行相应的异常处理代码
(2)Exception是所有异常处理类的基类,将匹配所有的异常类
3.finally(执行资源清理)
(1)不过是否发生异常都将执行异常处理
(2)finally不是必须的,在编程时可以根据需要进行应用
三、Exception类
1.System.Exception类表示在应用程序执行期间发生的错误
2.System.Exception 类是所有异常的基类型
Message 属性是 string 类型的只读属性,它包含对发生异常的原因的可读描述
1.System.Exception类表示在应用程序执行期间发生的错误
2.System.Exception 类是所有异常的基类型
Message 属性是 string 类型的只读属性,它包含对发生异常的原因的可读描述
四、自定义异常处理类
1.如果在程序执行过程中所引发的异常在C#中没有定义,这是我们可以自定义异常处理类以向用户提示异常信息。
2.所有用户自定义的异常处理类都直接或者间接从Exception类派生而来
class MyException:Exception
{
public MyException(string strMessage):base(strMessage)
{
}
}
1.如果在程序执行过程中所引发的异常在C#中没有定义,这是我们可以自定义异常处理类以向用户提示异常信息。
2.所有用户自定义的异常处理类都直接或者间接从Exception类派生而来
class MyException:Exception
{
public MyException(string strMessage):base(strMessage)
{
}
}
五、数据访问异常处理类
1.在ADO.NET中,每一个数据提供程序都提供三种类型的类,这三种类型的类分别为Exception, Error, 和 ErrorCollection
2.SQL Server数据提供程序提供了SqlException, SqlError和SqlErrorCollection
1.在ADO.NET中,每一个数据提供程序都提供三种类型的类,这三种类型的类分别为Exception, Error, 和 ErrorCollection
2.SQL Server数据提供程序提供了SqlException, SqlError和SqlErrorCollection
六、使用SqlException类
1.SqlException对象表示当 SQL Server 返回警告或错误时引发的异常
2.SqlException类的基类为System.Exception
3.每当 SQL Server .NET Framework 数据提供程序遇到服务器生成的错误时,都将创建此类
1.SqlException对象表示当 SQL Server 返回警告或错误时引发的异常
2.SqlException类的基类为System.Exception
3.每当 SQL Server .NET Framework 数据提供程序遇到服务器生成的错误时,都将创建此类
七、使用 SqlError类和SqlErrorCollection类
1.SqlException.Errors属性返回SqlErrorCollection类的一个对象
2.SqlErrorCollection对象是SqlError对象的集合
3.每一个SqlError对象封装了由SQL Server服务器引发的错误或者警告
1.SqlException.Errors属性返回SqlErrorCollection类的一个对象
2.SqlErrorCollection对象是SqlError对象的集合
3.每一个SqlError对象封装了由SQL Server服务器引发的错误或者警告
八、识别SQL Server 2000 错误
1.如果向SQL Server发送一个错误的SQL命令,SQL Server将返回一个格式化的错误消息
Server: Msg 208, Level 16, State 1, Line 1
Invalid object name 'SomeTable'
2.消息格式
Server: Msg 208, Level 16, State 1, Line 1
Invalid object name 'SomeTable'
(1)第一部分为错误消息编号,在SQL Server中每一个错误消息都有一个相应的编号与之对应。消息编号唯一标识每一个错误消息。
(2)消息的第二部分为错误的安全级别,其值在0到25之间,错误安全级别代表错误的种类
(3)错误消息的第三部分为状态编号,其取值范围为1至127,状态编号指示发现错误的源位置
(4)错误消息的最后一部分为错误的描述,SQL Server的错误消息都存储在系统表sysmessages中,可以通过查询语句“select * from
1.如果向SQL Server发送一个错误的SQL命令,SQL Server将返回一个格式化的错误消息
Server: Msg 208, Level 16, State 1, Line 1
Invalid object name 'SomeTable'
2.消息格式
Server: Msg 208, Level 16, State 1, Line 1
Invalid object name 'SomeTable'
(1)第一部分为错误消息编号,在SQL Server中每一个错误消息都有一个相应的编号与之对应。消息编号唯一标识每一个错误消息。
(2)消息的第二部分为错误的安全级别,其值在0到25之间,错误安全级别代表错误的种类
(3)错误消息的第三部分为状态编号,其取值范围为1至127,状态编号指示发现错误的源位置
(4)错误消息的最后一部分为错误的描述,SQL Server的错误消息都存储在系统表sysmessages中,可以通过查询语句“select * from
sysmessages”查询出这些错误消息
3.错误安全级别
范围 说明
0–10 表示该消息并不是错误消息,而仅仅是提供一些有用的信息
11–16 11-16类别的错误是由用户导致的。例如安全级别16表示用户执行了一个错误的更新操作
17 SQL Server已经使用了不可配置的资源,例如锁
18 代表非重大的内部软件错误
19 已经超过了不可配置的资源限制
20 当前进程残生的错误
21 影响SQL Server所有进程的错误
22 表或者索引被破外
23 表示一个非法的数据库
24 表示硬件错误
25 代表系统错误
3.错误安全级别
范围 说明
0–10 表示该消息并不是错误消息,而仅仅是提供一些有用的信息
11–16 11-16类别的错误是由用户导致的。例如安全级别16表示用户执行了一个错误的更新操作
17 SQL Server已经使用了不可配置的资源,例如锁
18 代表非重大的内部软件错误
19 已经超过了不可配置的资源限制
20 当前进程残生的错误
21 影响SQL Server所有进程的错误
22 表或者索引被破外
23 表示一个非法的数据库
24 表示硬件错误
25 代表系统错误
九、SQL SERVER错误日志
1.SQL Server维护一个错误日志(文本格式)用于存储服务器信息和错误消息
2.错误日志文件可以帮助我们记录下来各种出现的问题和潜在的问题
3.SQL Server日志文件存储在SQL Server根目录下的LOG文件夹下,在这个文件夹下有不止一个日志文件,并且第一个文件为ERRORLOG
4.可以使用记事本打开日志文件
1.SQL Server维护一个错误日志(文本格式)用于存储服务器信息和错误消息
2.错误日志文件可以帮助我们记录下来各种出现的问题和潜在的问题
3.SQL Server日志文件存储在SQL Server根目录下的LOG文件夹下,在这个文件夹下有不止一个日志文件,并且第一个文件为ERRORLOG
4.可以使用记事本打开日志文件