如何分配SqlException Number

时间:2013-09-19 12:13:50

标签: sql-server ado.net sqlexception

SqlException 的属性为数字

然后是: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 - 来自系统错误消息列表(两者都存在)
  • Number -1 - 来自服务器错误消息列表(仅存在于服务器列表中)
  • Number 121 - 来自系统错误消息列表(两者都存在) ......

2 个答案:

答案 0 :(得分:9)

理论上说这是SQL错误号,例如。服务器端ERROR_NUMBER()。换句话说,第一个列表。

但是,SqlClient报告的一些异常发生在客户端,而不是服务器端。一个典型的例子是错误,如连接到服务器失败,因为你没有连接,没有服务器端错误可言。例如,错误的服务器名称(在DNS中无法解析),在这种情况下,InnerException将指向Win32ExceptionNativeErrorCode值为ERROR_BAD_NETPATH。在这种情况下,53,OS系统错误代码,将报告为SqlException错误号。

其他情况,SqlClient报告的错误是套接字错误,如突然断开连接。同样,没有“服务器端”错误可言,SqlException将使用其中一个众所周知的WSA错误号的SocketException包装类型NativeErrorCode的InnerException(Win32Error的子类) ,像WSAECONNRESET。在这种情况下,SqlException.ErrorNumber将是10054,但是来自WSA范围的是10054,而不是来自SQL Server错误范围的10054。我知道......

那你该怎么办?请务必检查InnerException,如果是Win32Exception,则ErrorNumber来自系统错误代码(操作系统错误)。否则它应该是SQL Server错误号。

哦,然后有-1 ...我认为是由SqlClient本身报告的(例如一些内部状态错误),但我不确定。

答案 1 :(得分:2)

我会查看SqlException.Number属性的文档。

这就是它所说的

  

这是第一个SqlError的Number属性的包装   错误属性。有关SQL Server引擎错误的详细信息,请参阅   SQL Server联机丛书。