2017-04-18 123 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是一条路。 –