Разделение доступа к данным и перехват данных для формирования - PullRequest
0 голосов
/ 09 мая 2018

В своем проекте я пытаюсь написать код, который будет приятно понять. В настоящее время я разделил свои функции доступа к данным в отдельный класс.

Однако я пытаюсь добиться того, чтобы ошибки возвращались к моей форме. Я не получаю это в настоящее время, и мне было интересно, почему.

В моей форме есть следующий код:

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, например)? Или я просто получу «ошибку»? И если я просто получу ошибку, как я могу улучшить свой код, чтобы показывать исключение вместо ошибки?

Ответы [ 2 ]

0 голосов
/ 09 мая 2018

Простой способ - убрать зацепку try из вашего DAL и добавить ее в форму.Например:

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

Просто обратите внимание, что есть много способов сделать это.Я предпочитаю не включать специфичные для DAL типы исключений в мой пользовательский интерфейс.Вместо этого я могу вернуть пользовательский тип результата, который имеет код ошибки и сообщение, и позволить моему пользовательскому интерфейсу отобразить это или сгенерировать пользовательское сообщение на основе кода ошибки.

0 голосов
/ 09 мая 2018

Вы просто получите «ошибку» в случае 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;
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...