2017-04-18 29 views
1

私は、クエリを実行するためにSQL Serverデータベースに接続するいくつかのメソッドを持つC#アプリケーションを持っています。失敗した場合、SQL Server接続を再試行します。

接続が失敗し、プログラムが終了することがあります。

DB管理者はデータベースを検索していますが、終了する前に接続が失敗した場合は2〜3回再試行する必要があります。

私は実際にこれを "スマートに"行っている人はいません。

私の接続コード:私はいくつかの方法を使用しているので

using (SqlConnection SqlCon = new SqlConnection(myParam.SqlConnectionString)) 
{ 
    SqlCon.Open(); 
    string requeteFou = "select XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX"; 

    using (SqlCommand command = new SqlCommand(requeteFou, SqlCon)) 
    { 
     using (SqlDataReader reader = command.ExecuteReader()) 
     { 
      if (reader.HasRows) 
      { 
       while (reader.Read()) 
       { 
        // do job 
       } 
      } 
     } 
    } 
} 

、「接続」を上書きするか、例えば、接続3回を再試行するために、方法を「読む」ための単純な方法はありますか?

敬具

答えて

-2

たぶんtryブロックであなたのusingを包みます。必要に応じて、catchブロックに接続エラーを記録します。ループ全体にtry{ }catch{ }を入れて3回ループします。 tryブロックが自身の最後まで実行されている場合は、breakループ外です。

for(int i = 0; i < 3; i++) 
{ 
    try { 
     using (SqlConnection SqlCon = new SqlConnection(myParam.SqlConnectionString)) 
     { 
       // your code 
     } 
     Thread.Sleep(1000); // wait some time before retry 
     break; // connection established, quit the loop 
    } 
    catch(Exception e) { 
     // do nothing or log error 
    } 
} 

ただし、あなたのコード内で発生する可能性のある他の例外からSQL接続例外を差別扱いする必要があると思います。

+0

このソリューションは過小評価されてなぜ?悪いアイデア ? –

+0

私も知りたいのです – schroedingersKat

0

リトライロジックにはPollyを使用します。

非常に基本的な例を再試行3回SqlExceptionが(テストされていない)がある:

 static void Main(string[] args) 
     { 
      var policy = Policy 
       .Handle<SqlException>() 
       .Retry(3); 

      try 
      { 
       policy.Execute(() => DoSomething()); 
      } 
      catch (SqlException exc) 
      { 
       // log exception 
      } 
     } 

     private static void DoSomething() 
     { 
      using (SqlConnection conn = new SqlConnection("")) 
      { 
       conn.Open(); 
       string requeteFou = "select XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX"; 

       using (SqlCommand command = new SqlCommand(requeteFou, conn)) 
       { 
        using (SqlDataReader reader = command.ExecuteReader()) 
        { 
         if (!reader.HasRows) return; 
         while (reader.Read()) 
         { 
          // do job 
         } 
        } 
       } 
      } 
     } 
+0

ヒントをいただきありがとうございます。問題は、私はSQLを使用して多くの機能を持っているので、私はこの一般的なソリューションを "DoSomething"で直接使用することはできません。たぶん、FORループを使用するソリューションは試してみるべき解決策です! –

+0

@WalterFabioSimoniこれは単なる例です。私が作ったのは、PollyのようなRetryフレームワークを使うことでした。私はあなたがPollyをラッピングできる呼び出しメソッドを持っていると確信しています。 –

+0

@WalterFabioSimoniリトライロジックを実装する必要がある場合は、Pollyを使用します。 –

関連する問題