126

異なる方法で処理できるように、SQL サーバーのタイムアウト例外を明確にキャッチする必要があります。SqlException をキャッチして、メッセージ文字列に "Timeout" が含まれているかどうかを確認できることはわかっていますが、それを行うためのより良い方法があるかどうか疑問に思っていましたか?

try
{
    //some code
}
catch (SqlException ex)
{

    if (ex.Message.Contains("Timeout"))
    {
         //handle timeout
    }
    else
    {
         throw;
    }
}
4

6 に答える 6

170

タイムアウトを確認するには、ex.Number の値を確認すると思います。-2 の場合は、タイムアウト状態です。

-2 はタイムアウトのエラー コードで、SQL Server の MDAC ドライバーである DBNETLIB から返されます。これは、 Reflectorをダウンロードし、System.Data.SqlClient.TdsEnums で TIMEOUT_EXPIRED を調べることで確認できます。

コードは次のようになります。

if (ex.Number == -2)
{
     //handle timeout
}

失敗を示すコード:

try
{
    SqlConnection sql = new SqlConnection(@"Network Library=DBMSSOCN;Data Source=YourServer,1433;Initial Catalog=YourDB;Integrated Security=SSPI;");
    sql.Open();

    SqlCommand cmd = sql.CreateCommand();
    cmd.CommandText = "DECLARE @i int WHILE EXISTS (SELECT 1 from sysobjects) BEGIN SELECT @i = 1 END";
    cmd.ExecuteNonQuery(); // This line will timeout.

    cmd.Dispose();
    sql.Close();
}
catch (SqlException ex)
{
    if (ex.Number == -2) {
        Console.WriteLine ("Timeout occurred");
    }
}
于 2008-09-15T13:09:29.943 に答える
22

こちら: http://www.tech-archive.net/Archive/DotNet/microsoft.public.dotnet.framework.adonet/2006-10/msg00064.html Thomas Weingartnerが書い

たものも読むことができます。

タイムアウト: SqlException.Number == -2 (これは ADO.NET エラー コードです)
一般的なネットワーク エラー: SqlException.Number == 11
デッドロック: SqlException.Number == 1205 (これは SQL Server エラー コードです)

...

「General Network Error」もタイムアウト例外として処理します。まれな状況でのみ発生します。たとえば、更新/挿入/削除クエリが長時間実行されるトリガーを発生させる場合などです。

于 2013-04-14T23:41:30.940 に答える
0

SqlException.ErrorCode プロパティの値は? あなたはそれで働くことができますか?

タイムアウトがある場合は、 -2146232060のコードを確認する価値があるかもしれません。

これをデータ コードの static const として設定します。

于 2008-08-27T07:20:43.950 に答える
0

よくわかりませんが、実行タイムアウトまたはコマンド タイムアウトが発生した場合、クライアントは SQL Server に「ABORT」を送信し、クエリ処理を単に中止します。トランザクションはロールバックされず、ロックも解放されません。この問題を解決するには、ストアド プロシージャでトランザクションを削除し、.Net コードで SQL トランザクションを使用します sqlException を管理するには

于 2019-10-30T08:36:53.247 に答える