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ます。、およびSqlExceptionの内部例外を調べる
ことにより 、例外がローカル(つまり、ネットワーク)であるかリモート(つまり、サーバー上)であるかを適切に推測できます。100を超えるエラー番号は、サーバーによって報告される可能性があります。エラー番号-2、-1、2、および53は、クライアント側のエラーであることがわかっています。内部Win32Exceptionを含む例外は、クライアント側でもあります。MSDNには、役立つこのデシジョンテーブルが含まれています。SqlError.NumberSqlError.State

補足として、タイムアウトはサーバーエラーではなく、SQLServerにはクエリタイムアウトなどの概念はありません。タイムアウトは、デフォルトの30秒のため、独自のアプリケーションによってトリガーされますSqlCommand.CommandTimeout

于 2012-10-24T14:08:20.893 に答える