0

我需要能够测试 System.Data.SqlClient.SqlException 是否是由于网络错误(连接到 MS SQL Server 的.NET 环境)。如果是,我可以告诉用户他的连接有问题,而如果不是,则很可能是我的代码中的错误,需要区别对待。显然,不出现误报是至关重要的(当它是一个错误时声明某个网络问题)。

在此处的相关问题中,建议从异常文本中提取信息。就我而言,这很丑陋且困难,因为文本是本地化的,并且可能因环境而异。

目前,我检查了某些函数调用的调用堆栈,这些函数调用(根据经验)与网络问题有关:

System.Data.SqlClient.TdsParserStateObject.WritePacket
System.Data.SqlClient.TdsParserStateObject.ReadNetworkPacket
System.Net.Sockets.SocketException

但是,如果在执行例如 SELECT 查询时出现超时,这些都不会弹出。因此,我将不得不重新检查异常消息中是否出现“超时”,这很难看。

有没有人有更好的主意?

4

1 回答 1

3

解析错误消息和堆栈是您最不想做的事情

SqlException附带一个集合Errors
通过检查 SqlError.Number,SqlError.State和 SqlException 内部异常,您可以很好地猜测异常是本地(即网络)还是远程(即服务器上)。服务器很可能会报告超过 100 的错误号。错误号 -2、-1、2 和53被认为是客户端错误。包含内部 Win32Exception 的异常也是客户端。MSDN 包含此决策表以提供帮助。

附带说明:超时不是服务器错误,SQL Server 中没有查询超时这样的概念。超时由您自己的应用程序触发,因为SqlCommand.CommandTimeout.

于 2012-10-24T14:08:20.893 回答