一万光年外  
免费OA软件网 http://www.freeoasoft.com 专注于平台架构设计及OA软件开发

从存储过程中生成错误

T-SQL提供了一个RAISERROR(注意拼写)函数。你可用此函数生成自定义错误,并将错误返回客户。对于ADO.NET客户,SQL Server .NET数据提供程序对这些数据错误进行解释,并把它们转化为SqlError对象。

使用RAISERROR函数最简单的方法是将消息文本作为第一个参数包括进来,然后指定严重及状态参数,如下面的代码片段所示:

RAISERROR( 'Unknown Product ID: %s', 16, 1, @ProductID )
在这个例子中,替代参数用于将当前产品ID作为错误消息文本的一部分返回,参数2是消息的严重性,参数3是消息状态。

更多信息

为了避免对消息文本进行硬编码,你可以利用sp_addmessage系统存储过程或SQL Server 企业管理器将你自己的消息增加到sysmessages表中。然后你就可以使用传递到RAISERROR函数的ID引用消息了。你所定义的消息Ids必须大于50000,如下代码片段所示:
RAISERROR( 50001, 16, 1, @ProductID )
关于RAISERROR函数的完整细节,请在SQL Server的在线书目中查询RAISERROR。
正确使用严重性等级,仔细选择错误严重性等级,并要清楚每个级别造成的冲击。错误严重性等级的范围是0-25,并且它用于指出SQL Server 2000所遇到的问题的类型。在客户端代码中,通过在SqlException类的Errors集合中检查SqlError对象的 Class属性,你可以获得错误的严重性。表1 指出了不同严重性等级的意义及所造成的冲击。

表1.错误严重性等级--冲击及意义


严重性等级  链接已关闭  生成SqlException对象  意义
 
10及其以下   No   No    通知型消息,并不表示犯错误状态。
11-16   No   Yes    可由用户修改的错误,例如,使用修改后的输入数据重试操作。
17-19   No   Yes    资源或系统错误。
20-25   Yes   Yes    致命的系统错误(包括硬件错误)。客户链接被终止。
 

控制自动化事务

SQL Server .NET数据提供程序对它所遇到的任何严重性大于10的错误都抛出SqlException对象。当作为自动化(COM+)事务一部分的组件检测到SqlException对象后,该组件必须确保它能取消事务。这也许是,也许不是自动化过程,并要依赖该方法是否已经对AutoComplete属性作出了标记。

关于在自动化事务上下文中处理对象的更多信息,见本文中的确定事务结果一节。

得到通知型消息

10及其以下严重性等级用于表示通知型消息,并且不会引发SqlException对象的抛出。要获得通知型消息:

1.创建事件处理程序,并提交给SqlConnection对象所暴露的InfoMessage事件。下面的代码片段显示了事件代理。
 public delegate void SqlInfoMessageEventHandler( object sender, SqlInfoMessageEventArgs e );
2.通过传递到你的事件处理处理程序中的SqlInfoMessageEventArgs对象,可以得到消息数据。此对象暴露了Errors属性,该属性包含一组SqlError对象--每个通知消息一个SqlError对象。下面的代码片段演示了如何注册用于记录通知型消息的事件处理程序。

public string GetProductName( int ProductID )
{
  SqlConnection conn = new SqlConnection("server=(local);Integrated Security=SSPI;database=northwind");
  try
  {
    // 注册信息事件处理器
    conn.InfoMessage += new SqlInfoMessageEventHandler(MessageEventHandler);
    conn.Open();
    // 建立命令对象并执行
    . . .
  }
  catch (SqlException sqlex)
  {
    // 记录并处理异常
    . . .
  }
  finally
  {
    conn.Close();
  }
}

// 信息事件处理程序
void MessageEventHandler( object sender, SqlInfoMessageEventArgs e )
{
  foreach( SqlError sqle in e.Errors )
  {
    // 记录 SqlError 属性
    . . .
  }
}

以上信息摘抄至: .NET 数据访问架构指南

posted on 2007-09-07 10:21  一万光年外  阅读(892)  评论(0编辑  收藏  举报
 
免费OA软件网 http://www.freeoasoft.com 专注于平台架构设计及OA软件开发