2011-06-29 47 views
1

IM創造它連接到一個數據庫,並使用下面的代碼來做到這一點幫助使用try catch語句

private void SetupConnection() 
{ 
    conn.ConnectionString = 
     ConfigurationManager.ConnectionStrings["live"].ConnectionString; 

    OdbcDataAdapter da = 
     new OdbcDataAdapter("SELECT * FROM MTD_FIGURE_VIEW1 '", conn); 

    da.Fill(ds); 
} 

我想創建一個try catch語句將繼續努力使用ODBC連接器的IM web應用連接到數據庫。

psudocode將嘗試以上功能,如果無法連接再次嘗試,如果它連接沒有任何錯誤進行。

有人可以幫我從評論這

問題相關的更新:

我只是希望它繼續努力的 原因是Web應用程序 即時決策永遠不會切換其 不斷刷新數據,但 數據庫是每晚切換爲兩個小時 備份在此 期間我希望應用程序k在 EEP嘗試連接

+0

我認爲你需要在嘗試編寫任何代碼之前更準確地考慮流程。如果連接失敗,代碼應該做什麼?無限循環?或者有最大數量的嘗試?當達到最大嘗試次數時,它應該做什麼? –

+0

'OdbcDataAdapter'實際上是否在失敗時拋出異常? –

+0

從用戶體驗的角度來看,這不太好,所以它會一直持續下去嗎? –

回答

2
private void SetupConnection() 
{ 
    conn.ConnectionString = 
     ConfigurationManager.ConnectionStrings["ZenLive"].ConnectionString; 

    bool success = false; 

    while(!success) 
    { 
     try 
     { 
      OdbcDataAdapter da = 
       new OdbcDataAdapter("SELECT * FROM MTD_FIGURE_VIEW1 '", conn); 

      da.Fill(ds); 
      success = true; 
     } 
     catch(Exception e) 
     { 
      Log(e); 
      Thread.Sleep(_retryPeriod) 
     } 
    } 
} 

注意的人評論,這是真的不是一個好主意。您需要一些方法來區分數據庫關閉並希望繼續重試的「預期」異常,以及發生意外事件並且您不想繼續嘗試的情況。

2

怎麼樣,

const int MaxRetries = 42 //or any other number you like 

for (int r = 1; r <= MaxRetries; r++) 
{ 
    try 
    { 
     //The thing we want to test 
     break; 
    } 
    catch (SomeExceptionWeWantToIgnore) 
    { 
     System.Threading.Thread.Sleep(1000) 
     //Or any number of milliseconds you like (not 0) 
    } 
} 

如果這是你的財產以後想辦多次resuse。你可以考慮把它放在像我在this answer警告這樣的resuable功能,這可能是矯枉過正。

1

如果數據庫沒有啓動,則嘗試連接到該數據庫沒有意義。你只是在浪費你的時間來嘗試連接到備份的東西。我會做這樣的事情:

DateTime backupStart = Convert.ToDateTime("20:00:00"); 
DateTime backupEnd = Convert.ToDateTime("22:00:00"); 
DateTime now = DateTime.Now; 

while (true) 
{ 
    // If its backup time then sleep for 2 hours, 0 min and 0 seconds 
    if (now > backupStart && now < backupEnd) 
    { 
     System.Threading.Thread.Sleep(new TimeSpan(2, 0, 0)); 
     now = DateTime.Now; // So we dont sleep again later 
    } 

    try 
    { 
     // Try db connect 
     // Break if successful 
     break; 
    } 
    catch (Exception ex) 
    { 
     // Wait 30 seconds then loop then try again 
     System.Threading.Thread.Sleep(new TimeSpan(0, 0, 30)); 
    } 
}