C# 处理业务逻辑中的sql异常

C# 处理业务逻辑中的sql异常,c#,model-view-controller,elmah,C#,Model View Controller,Elmah,我在数据访问层有ExecuteOnQuery方法。当ExecuteOnQuery失败时,我需要处理业务逻辑中的异常。 我在BLL中使用Elmah logger。ExecuteOnQuery方法没有返回值, 那么,我应该在BLL中检查什么条件来记录抛出的任何异常呢 BLL: //建造师 public FormService(ISettings settings, ILogger logger, IFormDataServiceWorker formDataService)

我在数据访问层有ExecuteOnQuery方法。当ExecuteOnQuery失败时,我需要处理业务逻辑中的异常。 我在BLL中使用Elmah logger。ExecuteOnQuery方法没有返回值, 那么,我应该在BLL中检查什么条件来记录抛出的任何异常呢

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();
                }
            }
        }

如果您想在业务层捕获此异常,可以使用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)上。因此,在您的情况下,实现这一点最合适的方法是在
SubmitFormData
方法中记录
ExecuteNonQuery
异常。业务层不应该知道如何处理数据库问题