2016-07-12 3 views
-1

У меня есть метод executeononquery в Data Access Layer. Мне нужно обработать исключение в бизнес-логике, когда executeononquery терпит неудачу. Я использую регистратор Elmah в BLL. Там нет возвращаемого значения из метода ExecuteNonQuery, так, что состояние я должен проверить в УСК, чтобы войти в любое исключениеОбработка исключения sql в бизнес-логике

BLL:

// конструктор

public FormService(ISettings settings, ILogger logger, IFormDataServiceWorker formDataService) 
      : base(settings, logger) 
     { 
      this._formDataService = formDataService; 
     } 
     //method calling DAL 
     public string GetRefNo(FormData formData) 
     { 
       foreach (var formFieldData in formFieldDataList) 
       { 
        this._formDataService.SubmitFormData(formFieldData); 
       } 
} 

DAL Реализация:

public void SubmitFormData(FormFieldDTO formFieldData) 
     { 
      using (var sqlConn = new SqlConnection(Configuration.DBConnection)) 
      { 
       sqlConn.Open(); 
       using (var sqlcmd = new SqlCommand("usp_SubmissionDataInsert", sqlConn)) 
       { 
        sqlcmd.CommandType = CommandType.StoredProcedure; 
        sqlcmd.Parameters.Add("@SubmissionId", SqlDbType.UniqueIdentifier).Value = formFieldData.SubmissionId; 
        sqlcmd.Parameters.Add("@FieldId", SqlDbType.SmallInt).Value = formFieldData.FieldId; 
        sqlcmd.Parameters.Add("@FieldTitle", SqlDbType.VarChar, 500).Value = formFieldData.FieldTitle; 
        sqlcmd.Parameters.Add("@FieldData", SqlDbType.VarChar, -1).Value = formFieldData.FieldValue; 
        sqlcmd.Parameters.Add("@FieldName", SqlDbType.VarChar, 200).Value = formFieldData.FieldName; 

        sqlcmd.ExecuteNonQuery(); 
       } 
      } 
     } 

ответ

1

Вы можете использовать try/catch и специализированные исключения, если вы хотите поймать эти исключения в бизнес-слое. Что-то вроде этого:

public class MyDatabaseLevelException : Exception 

и в вашей реализации DAL вы бросаете этот тип исключения, когда возникает какое-либо исключение Ado.net.

throw new MyDatabaseLevelException("message", inner); 

Так что в вашей BLL вы сможете поймать этот тип исключения:

public string GetRefNo(FormData formData) 
{ 
    foreach (var formFieldData in formFieldDataList) 
    { 
     try 
     { 
      this._formDataService.SubmitFormData(formFieldData); 
     } 
     catch (MyDatabaseLevelException exception) 
     { 
      //log or do something with this. 
     } 
    } 
} 

сказал, что, я думаю, что исключения на уровне базы данных должны быть зарегистрированы на уровне базы данных (DAL). Таким образом, в вашем случае наиболее подходящим способом достижения этого является регистрация ExecuteNonQuery исключений в методе SubmitFormData. Бизнес-уровень не должен знать, как обращаться с проблемами базы данных.