C# で SQL Server タイムアウト例外をキャッチするサンプルコード
C#、.NET、SQL Server でのタイムアウト例外のキャッチ方法
タイムアウト例外の種類
SQL Server のタイムアウト例外には、主に以下の2種類があります。
タイムアウト例外のキャッチ方法
C# で SQL Server のタイムアウト例外をキャッチするには、以下の方法を使用できます。
catch ブロックを使用する:
try
{
// SQL クエリを実行
}
catch (SqlException ex)
{
if (ex.Number == -2) // タイムアウトエラーの場合
{
// タイムアウト処理を行う
}
}
SqlCommand.CommandTimeout プロパティを使用する:
SqlCommand command = new SqlCommand("SELECT * FROM table", connection);
command.CommandTimeout = 10; // 10秒後にタイムアウト
try
{
command.ExecuteNonQuery();
}
catch (SqlException ex)
{
// タイムアウト処理を行う
}
T-SQL の TIMEOUT オプションを使用する:
SELECT * FROM table
WITH (TIMEOUT 10); // 10秒後にタイムアウト
タイムアウト処理の例
タイムアウトが発生した場合、以下のような処理を行うことができます。
- ユーザーにメッセージを表示する
- クエリを再実行する
- 接続を再試行する
- エラーログに記録する
その他の注意事項
- タイムアウトが発生する可能性のある箇所には、適切なタイムアウト処理を実装する必要があります。
- タイムアウト時間を短く設定すると、パフォーマンスが向上する可能性がありますが、クエリが正常に完了できない可能性もあります。
using System;
using System.Data.SqlClient;
class Program
{
static void Main(string[] args)
{
// 接続文字列
string connectionString = "Data Source=localhost;Initial Catalog=Test;Integrated Security=True";
// コマンドの作成
using (SqlConnection connection = new SqlConnection(connectionString))
{
SqlCommand command = new SqlCommand("SELECT * FROM table", connection);
// タイムアウト設定 (10秒)
command.CommandTimeout = 10;
try
{
// クエリを実行
command.ExecuteNonQuery();
}
catch (SqlException ex)
{
// タイムアウトエラーの場合
if (ex.Number == -2)
{
Console.WriteLine("タイムアウトが発生しました!");
}
}
}
}
}
このコードを実行すると、クエリの実行に10秒以上かかった場合、「タイムアウトが発生しました!」というメッセージが表示されます。
注意事項
- 上記のコードは、サンプルコードです。実際のアプリケーションでは、必要に応じて修正してください。
- タイムアウト時間を設定する際は、パフォーマンスと信頼性のバランスを考慮する必要があります。
タイムアウト例外をキャッチするその他の方法
SqlCommand command = new SqlCommand("SELECT * FROM table", connection);
command.CommandTimeout = 10;
try
{
using (SqlDataReader reader = command.ExecuteReader())
{
// データ処理
}
}
catch (SqlException ex)
{
// タイムアウト処理を行う
}
SqlConnection connection = new SqlConnection("Data Source=localhost;Initial Catalog=Test;Integrated Security=True");
connection.ConnectionTimeout = 10;
try
{
connection.Open();
// SqlCommand の実行
connection.Close();
}
catch (SqlException ex)
{
// タイムアウト処理を行う
}
Task.Run メソッドを使用する:
Task.Run(() =>
{
// SQL クエリを実行
}).ContinueWith(task =>
{
if (task.IsFaulted)
{
// タイムアウト処理を行う
}
});
Polly ライブラリは、リトライやタイムアウト処理を簡単に実装できるライブラリです。
using Polly;
var policy = Policy.TimeoutAsync(10, Polly.TimeoutStrategy.Pessimistic);
policy.ExecuteAsync(async () =>
{
// SQL クエリを実行
});
その他の注意事項
- 上記の方法以外にも、タイムアウト例外をキャッチする方法はいくつかあります。
- 使用する方法は、アプリケーションの要件や環境によって異なります。
c# .net sql-server