我需要能够测试System.Data.SqlClient.SqlException是否是由于网络错误(连接到MS SQL Server的.NET环境)。如果是,我可以告诉用户他的连接存在问题,而如果不存在,则很可能是我的代码中的错误被区别对待。显然,不要出现误报是至关重要的(当它是一个错误时声明出现网络问题)。
在相关问题over here中,建议从异常文本中提取信息。在我的情况下,这是丑陋和困难的,因为文本是本地化的,并且可能根据环境而不同。
目前,我检查某些函数调用的调用堆栈,这些函数调用(根据经验)与网络问题相关:
System.Data.SqlClient.TdsParserStateObject.WritePacket
System.Data.SqlClient.TdsParserStateObject.ReadNetworkPacket
System.Net.Sockets.SocketException
但是,如果在执行SELECT查询时出现超时,则不会弹出这些内容。所以,我必须恢复检查异常消息中是否出现“超时”,这很难看。
有没有人有更好的主意?
答案 0 :(得分:3)
解析错误消息和堆栈是您要执行的 last 事情。
SqlException
附带Errors
的集合
通过检查SqlError.Number
,SqlError.State
和SqlException内部异常,您可以很好地猜测异常是本地(即网络)还是远程(即服务器上)。服务器最有可能报告100以上的错误数。错误号-2,-1,2和53被认为是客户端错误。包含内部Win32Exception的异常也是客户端。 MSDN包含此decision table以提供帮助。
作为旁注:超时不是服务器错误,SQL Server中没有查询超时等概念。超时由您自己的应用程序触发,因为SqlCommand.CommandTimeout
默认为30秒。