SqlException Number是如何分配的

7

SqlException有一个属性Number

还有这个:http://msdn.microsoft.com/en-us/library/cc645603.aspx

以及这个:http://msdn.microsoft.com/en-us/library/windows/desktop/ms681382(v=vs.85).aspx

看起来好像是其中之一。

问题:

如何确定是哪个?

提问原因:

我需要捕获特定的SqlExceptions并根据Number属性决定如何处理它们,但当系统使用两者的消息时,我不知道应该查看哪个列表,并且不知道选择的标准是什么。

例如:

  • 编号53 - 来自服务器错误消息列表(存在于两个列表中)
  • 编号10054 - 来自系统错误消息列表(存在于两个列表中)
  • 编号-1 - 来自服务器错误消息列表(仅存在于服务器列表中)
  • 编号121 - 来自系统错误消息列表(存在于两个列表中) ……
2个回答

14
理论认为它是SQL错误编号,例如服务器端ERROR_NUMBER()。换句话说,第一个列表。
然而,SqlClient报告的有些例外情况发生在客户端而不是服务器端。一个典型的例子是连接失败的错误,因为你没有连接,所以没有服务器端的错误可言。例如,一个错误的服务器名称(无法解析DNS),在这种情况下,InnerException将指向一个具有NativeErrorCode值为ERROR_BAD_NETPATHWin32Exception。在这种情况下,操作系统系统错误代码53将被报告为SqlException错误编号。
有时,SqlClient 报告的错误是一个套接字错误,例如突然断开连接。再次强调,没有所谓的“服务器端”错误,SqlException 将使用 SocketException(Win32Error 的子类)包装一个类型为 InnerException 的异常,并使用其中一个众所周知的 WSA 错误号的 NativeErrorCode,例如 WSAECONNRESET。在这种情况下,SqlException.ErrorNumber 将为 10054,但它是来自 WSA 范围的 10054,而不是 SQL Server 错误范围的 10054。我知道...
所以你应该怎么做呢?确保检查InnerException,如果它是Win32Exception,那么ErrorNumber来自系统错误代码(操作系统错误)。否则,它应该是SQL Server错误代码。哦,还有-1……我认为这是SqlClient本身报告的(例如一些内部状态错误),但我不确定。

非常棒的答案。值得注意的是,十六进制的Win32代码在实际异常中会被转换为十进制。例如,我们得到了异常编号258,它对应的错误信息是“等待操作超时”。将258转换为十六进制是0x102,从Win32代码可以清楚地看出,错误代码0x00000102与我们看到的错误文本匹配。 - Sir Crispalot
有没有一些文档可以保证这种行为呢?SqlException.Number的MSDN文章似乎对此保持沉默。 - Mike Asdf

3
我建议您查看SqlException.Number 属性的文档。
文档描述如下:
这是对 Errors 属性中第一个 SqlError 的 Number 属性的包装。要了解有关 SQL Server 引擎错误的更多信息,请参阅 SQL Server Books Online。

谢谢指引我正确的方向(这个链接:http://msdn.microsoft.com/en-us/library/system.data.sqlclient.sqlerror.number.aspx) - Arie

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接