2017-04-18 4 views
1

Ich habe eine C# -Anwendung, die mehrere Methoden hat, die eine Verbindung zu einer SQL Server-Datenbank herstellen, um eine Abfrage auszuführen.Erneut versuchen, eine SQL Server-Verbindung zu öffnen, wenn fehlgeschlagen

Manchmal schlägt die Verbindung fehl und das Programm wird beendet.

Ein Datenbankadministrator schaut auf die Datenbank trotzdem muss ich das Programm anpassen, um 2-3 Mal zu versuchen, wenn eine Verbindung fehlschlägt, bevor sie beendet wird.

Ich weiß nicht wirklich wer es "smart" macht.

Meine Verbindungscode:

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 
       } 
      } 
     } 
    } 
} 

Da ich verschiedene Methoden verwenden, gibt es eine einfach Möglichkeit, die „Verbindung“ oder „lesen“ Methode, um die Verbindung 3-mal zum Beispiel zu wiederholen, zu überschreiben?

Mit freundlichen Grüßen

Antwort

-2

Vielleicht ist Ihr using in ein try Block wickeln. Protokollieren Sie einen Verbindungsfehler in einem catch Block, wenn Sie möchten. Setzen Sie ganze try{ }catch{ } in eine for-Schleife, die 3-mal Schleife wird. Wenn try Block bis zum Ende von sich selbst läuft, break out of loop.

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 
    } 
} 

Sie würden jedoch umgehen müssen SQL-Verbindung Ausnahme von anderen Ausnahmen Differenzierung, die Sie in Ihrem Code auftreten können.

+0

Warum diese Lösung unterbewertet ist? Schlechte Idee ? –

+0

Ich möchte auch wissen – schroedingersKat

0

Ich würde Polly für Wiederholungslogik verwenden.

Sehr einfaches Beispiel retrying 3 Mal, wenn es eine SqlException ist (nicht getestet):

 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

Danke für die Tipps, Problem ist, ich habe eine Menge Funktion mit SQL, so dass ich nicht direkt diese generische Lösung mit "DoSomething" verwenden kann. Vielleicht ist die Lösung, eine FOR-Schleife zu verwenden, eine Lösung, die Sie ausprobieren sollten! –

+0

@WalterFabioSimoni Es ist nur ein Beispiel. Der Punkt, den ich machte, war ein Retry-Framework wie Polly. Ich bin sicher, dass Sie eine Anrufmethode haben, mit der Sie Polly einpacken können. –

+0

@WalterFabioSimoni Polly ist der Weg zu gehen, wenn Sie Retry Logik implementieren müssen. –

Verwandte Themen