【问题标题】:Handle sql exception in Business logic处理业务逻辑中的sql异常
【发布时间】:2016-11-14 21:07:39
【问题描述】:

我在数据访问层中有 executenonquery 方法。当 executenonquery 失败时,我需要处理业务逻辑中的异常。 我在 BLL 中使用 Elmah 记录器。 ExecuteNonQuery 方法没有返回值, 那么我应该在 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();
                }
            }
        }

【问题讨论】:

    标签: c# model-view-controller elmah


    【解决方案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)上。因此,在您的情况下,实现此目的最合适的方法是在 SubmitFormData 方法中记录 ExecuteNonQuery 异常。业务层不应该知道如何处理数据库问题。

    【讨论】:

      猜你喜欢
      • 2012-05-20
      • 1970-01-01
      • 2012-07-18
      • 2011-02-07
      • 2011-07-19
      • 1970-01-01
      • 1970-01-01
      • 2012-05-04
      • 2023-04-01
      相关资源
      最近更新 更多