2017-10-11 2 views
0

Outre la consignation de l'exception SqlException, j'essaie également d'appeler une autre base de données qui stocke le contenu d'où l'erreur s'est produite initialement. Cependant, je reçois l'avertissement 'Code inaccessible détecté' pour la partie SqlConnection et il n'effectue certainement pas la procédure que je tente d'exécuter.Appel de la procédure SQL pour une autre base de données dans la clause C# Catch Exception

catch (SqlException ex) 
{ 
    throw new DataException(ex.Message, ex); 

    //Call Error Management DB Connection and add content to the table 
    using (SqlConnection connection = new SqlConnection(_errorManagementConnectionString)) 
    { 
      SqlCommand cmd = new SqlCommand("[dbo].[InsertDataErrors]", connection); 
      cmd.CommandType = CommandType.StoredProcedure; 
      cmd.Parameters.AddWithValue("@InputParam", InputParam); 
      cmd.Parameters.AddWithValue("@Content", Content); 
      cmd.ExecuteNonQuery(); 
      connection.Open(); 
    } 
} 

Comment puis-je aborder cette erreur et faire en sorte que le SqlException est connecté avec la procédure que je suis en train de courir?

+1

Vous lancez une 'nouvelle DataException' avant la partie' using' de sorte que l'utilisation est inaccessible. – MatSnow

+0

J'ai essayé dans l'autre sens, il ne lance donc pas la nouvelle DataException si je mets l'utilisation au préalable. – Dev

+0

Vous devriez également utiliser ['Add'] (https://stackoverflow.com/questions/21110001/sqlcommand-parameters-add-vs-addwithvalue) au lieu de [' AddWithValue'] (https://stackoverflow.com/questions/21110001/sqlcommand-parameters-add-vs-addwithvalue). – MatSnow

Répondre

4

Vous devez lever l'exception à la fin du bloc catch.

Vous pouvez également placer l'instruction using dans un autre essai/catch si vous êtes concerné par cet échec.

De plus, vous devez ouvrir la connexion avant d'exécuter le SqlCommand. C'est pourquoi votre DataException n'était pas lancée, une autre exception non gérée était levée avant que votre code n'atteigne cette ligne.

.: par exemple

catch (SqlException ex) 
{ 
    try 
    { 
     //Call Error Management DB Connection and add content to the table 
     using (SqlConnection connection = new SqlConnection(_errorManagementConnectionString)) 
     { 
      SqlCommand cmd = new SqlCommand("[dbo].[InsertDataErrors]", connection); 
      cmd.CommandType = CommandType.StoredProcedure; 
      cmd.Parameters.AddWithValue("@InputParam", InputParam); 
      cmd.Parameters.AddWithValue("@Content", Content); 
      connection.Open(); 
      cmd.ExecuteNonQuery(); 
     } 
    } 
    catch 
    { 
     // Add any desired handling. 
    } 

    throw new DataException(ex.Message, ex); 
} 
+0

Merci! Ajout de la clause try-catch et affichage de l'exception dans l'Observateur d'événements a souligné l'erreur dans cette nouvelle connexion SQL. – Dev

0

Vous devez mettre le jeter à la fin du bloc.

Votre code de gestion des erreurs est défectueux, c'est pourquoi vous pensez qu'il devrait être en haut - probablement parce que vous n'ouvrez pas la connexion comme ailleurs.

Vous devez également détecter les exceptions possibles qui se produisent lorsque vous tentez de consigner l'erreur dans la base de données, car il y a beaucoup de cas où cela échouerait si la première erreur de base de données se produisait. Ensuite, vous vous retrouvez avec un gestionnaire d'exception très en désordre, alors vous devriez probablement le déplacer vers une autre méthode.

  // somehting with database .... 
     } 
     catch (SqlException ex) 
     { 
      AttemptToLogDbError(ex) 
      throw new DataException(ex.Message, ex); 
     } 

     // ... 

} 

void AttemptToLogDbError(SqlException ex) 
{ 
     try 
     { 
      //Call Error Management DB Connection and add content to the table 
      using (SqlConnection connection = new SqlConnection(_errorManagementConnectionString)) 
      { 
       connection.open(); 
       SqlCommand cmd = new SqlCommand("[dbo].[InsertDataErrors]", connection); 
       cmd.CommandType = CommandType.StoredProcedure; 
       cmd.Parameters.AddWithValue("@InputParam", InputParam); 
       cmd.Parameters.AddWithValue("@Content", Content); 
       cmd.ExecuteNonQuery(); 
      } 
     } 
     catch (Exception err) 
     { 
      // OMG nothing is working at all! log/report this somehow, but do not throw 
     } 
}