【问题标题】:Splitting data access and catching data to form拆分数据访问和捕获数据以形成
【发布时间】:2018-05-09 19:30:22
【问题描述】:

在我的项目中,我正在尝试编写易于理解的代码。 我目前将我的数据访问功能拆分为一个单独的类。

然而,我想要实现的是将错误捕获回我的表单。我目前没有得到这个,我想知道为什么。

在我的表单中,我有以下代码:

private void btn_Save_ItemClick(object sender, ItemClickEventArgs e)
{
    if (dal.updatePerson(ObjectAfterSaving))
    {
        MessageBox.Show("Updated!");
    }
    else
    {
        MessageBox.Show("error");
    };
}

在我的dal对象(派生自DataAccess_Person class)中,我有以下方法:

public bool updatePerson(Person p)
{

    conn = new SqlConnection(System.Configuration.ConfigurationManager.ConnectionStrings["Database"].ConnectionString);
    SqlCommand command = new SqlCommand(@"UPDATE Person
    SET PersonName = @PersonName
    WHERE PersonID = @PersonID", conn);
    command.Parameters.Add("@PersonName", SqlDbType.VarChar).Value = p.Name
    {
        try
        {
            if (conn.State == ConnectionState.Closed)
            {
                conn.Open();
            }

            int a = command.ExecuteNonQuery();
            conn.Close();
            if (a > 0)
            {
                return true;
            }
            else
            {
                return false;
            }
        }
        catch (SqlException ex)
        {
            ex.ToString();
            return false;
        }
    }
}

我的问题是:假设我的方法是否符合要求。我的前端(表单)会显示它(例如 Sql Exception)吗?还是我会得到“错误”?如果我只是得到错误,我如何改进我的代码以显示异常而不是错误?

【问题讨论】:

  • 你的问题不清楚。您只想在btn_Save_ItemClick 中捕获异常吗?你想在updatePerson 中捕获它然后再次抛出它以便你可以从调用者方法访问它吗?还是您只想将错误消息返回给调用方方法?另外请注意,您当前没有将 ex.ToString() 分配给任何变量。

标签: c# class oop


【解决方案1】:

一种简单的方法是从 DAL 中删除 try catch 并将其添加到表单中。例如:

private void btn_Save_ItemClick(object sender, ItemClickEventArgs e)
{       
    var result = "Success";

    try
    {
        dal.updatePerson(ObjectAfterSaving);            
    }
    catch (SqlException sqlEx)
    {
        result = sqlEx.Message;
    }
    catch (Exception ex)
    {
        result = ex.Message;
    }

    MessageBox.Show(result);
}

请注意,有很多方法可以做到这一点。我的偏好是不在我的 UI 中包含 DAL 特定的异常类型。相反,我可能会返回具有错误代码和消息的自定义结果类型,并让我的 UI 显示该错误代码或根据错误代码生成自定义消息。

【讨论】:

    【解决方案2】:

    如果是SqlException,您只会收到“错误”。如果您没有全局异常处理程序,所有其他异常都会使您的程序崩溃。如果要显示错误消息,可以为错误消息引入 out 变量:

    bool successful = MyMethod(out string errorMessage)
    if (!successful)
    {
        MessageBox.Show(errorMessage);
    }
    
    public bool MyMethod(out string errorMessage)
    {
        errorMessage = "";
        try
        {
            // do some stuff
            return true;
        }
        catch(Exception ex)
        {
            errorMessage = ex.Message;
            return false;
        }
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多