2017-04-18 183 views
1

我有一個C#應用程序,它有幾個連接到SQL Server數據庫以執行查詢的方法。重試嘗試打開SQL Server連接(如果失敗)

有時連接失敗,然後程序退出。

數據庫管理員正在查看數據庫,但是我必須修改程序,以便在連接失敗之前重試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

也許您的包裹在tryusing塊。如果需要,請在catch塊中記錄連接錯誤。將整個try{ }catch{ }放在for循環中,循環將循環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這只是一個例子。我所做的就是使用像波利這樣的Retry框架。我確定你有一個可以包裝Polly的調用方法。 –

+0

@WalterFabioSimoni如果你需要實現重試邏輯,Polly是一條路。 –

相關問題