惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

Help Net Security
Help Net Security
宝玉的分享
宝玉的分享
Microsoft Security Blog
Microsoft Security Blog
让小产品的独立变现更简单 - ezindie.com
让小产品的独立变现更简单 - ezindie.com
A
About on SuperTechFans
Microsoft Azure Blog
Microsoft Azure Blog
月光博客
月光博客
量子位
博客园 - 叶小钗
Last Week in AI
Last Week in AI
阮一峰的网络日志
阮一峰的网络日志
OSCHINA 社区最新新闻
OSCHINA 社区最新新闻
V
V2EX
D
DataBreaches.Net
Vercel News
Vercel News
博客园 - Franky
Recorded Future
Recorded Future
B
Blog RSS Feed
CTFtime.org: upcoming CTF events
CTFtime.org: upcoming CTF events
GbyAI
GbyAI
M
MIT News - Artificial intelligence
F
Full Disclosure
S
SegmentFault 最新的问题
L
LangChain Blog
F
Fortinet All Blogs
美团技术团队
IT之家
IT之家
博客园 - 司徒正美
Cyberwarzone
Cyberwarzone
NISL@THU
NISL@THU
P
Privacy International News Feed
Threat Intelligence Blog | Flashpoint
Threat Intelligence Blog | Flashpoint
Y
Y Combinator Blog
C
Check Point Blog
The GitHub Blog
The GitHub Blog
L
Lohrmann on Cybersecurity
I
Intezer
I
InfoQ
Spread Privacy
Spread Privacy
Project Zero
Project Zero
T
Threatpost
S
Secure Thoughts
C
Comments on: Blog
N
News | PayPal Newsroom
Application and Cybersecurity Blog
Application and Cybersecurity Blog
H
Heimdal Security Blog
T
The Blog of Author Tim Ferriss
www.infosecurity-magazine.com
www.infosecurity-magazine.com
Hugging Face - Blog
Hugging Face - Blog
U
Unit 42

博客园 - 一万光年外

戏说平台 第七章 可插拔主控台 心情极度不爽,发几句牢骚,恳请放首页一天 戏说平台 第六章 煮酒论编程 戏说平台 异构外篇 与朋友的QQ聊天记录 戏说平台 第五章 异构 一种独特的实现异构数据库操作的方法 戏说平台 第四章 淫贱二人组 戏说平台 第三章 学艺 CDMP平台简介 PPT格式 戏说平台 第二章 拜师 戏说平台 第一章 穿越 可配置B/S,C/S两用平台之三:自定义业务续 可配置B/S,C/S两用平台之二:自定义业务 可配置B/S,C/S两用平台之一:系统概览 Byte[]转十六进制 Action设计模式的.Net实现 安装SQL SERVER2000时出现程序挂起错误的解决方法 老生常谈,设计模式之我见 - 工厂模式篇 转载fyireporting Reporting Services主从表实现
Ado.net处理数据库异常
一万光年外 · 2007-09-07 · via 博客园 - 一万光年外

从存储过程中生成错误

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 数据访问架构指南