Вставки контактные данные из полей формы в базу данных MySQL при нажатии кнопки


Я просто новичок, пытаюсь делать свою должную осмотрительность и исследования вещей. Я пытаюсь идти о правильный способ добавления данных в базу данных. Я читал статьи на следующие:

  • Не показывает connectionString в открытом виде. В настоящее время я сохранить его в приложение.Config и я все еще пытаюсь выяснить, как его зашифровать.
  • using сайта в интернет с одноразовые предметы.
  • catch try finally для борьбы с исключениями.
  • параметризованные SQL-операторы интернет с использованием SQL-инъекций.

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

private void Btn_InsertData_Click(object sender, EventArgs e)
{
    if (TextboxesAreNullorEmpty() == true)
    {
        MessageBox.Show("Please fill out all fields!");
        return;
    }
    else
    {
        try
        {
            using (MySqlConnection conn = new MySqlConnection(Properties.Settings.Default.MySQLDBConnection))
            using (MySqlCommand cmd = new MySqlCommand())
            {
                conn.Open();
                cmd.Connection = conn;
                cmd.CommandText = "INSERT INTO `sites` (`ContractNumber`, `SiteName`, `SitePhoneNumber`, `SiteAddLine1`, `SiteAddLine2`, `SiteAddCity`, `SiteAddCounty`, `SiteAddPostcode`, `SiteAddCountry`) VALUES (@contract_name, @site_name, @site_phone_number, @site_add_line1, @site_add_line2, @site_add_city, @site_add_county, @site_add_postcode, @site_add_country)";
                cmd.Prepare();
                cmd.Parameters.AddWithValue("@contract_name", this.txtBox_ContractNumber.Text);
                cmd.Parameters.AddWithValue("@site_name", this.txtBox_SiteName.Text);
                cmd.Parameters.AddWithValue("@site_phone_number", this.txtBox_SitePhoneNumber.Text);
                cmd.Parameters.AddWithValue("@site_add_line1", this.txtBox_SiteAddLine1.Text);
                cmd.Parameters.AddWithValue("@site_add_line2", this.txtBox_SiteAddLine2.Text);
                cmd.Parameters.AddWithValue("@site_add_city", this.txtBox_SiteAddCity.Text);
                cmd.Parameters.AddWithValue("@site_add_county", this.txtBox_SiteAddCounty.Text);
                cmd.Parameters.AddWithValue("@site_add_postcode", this.txtBox_SiteAddPostcode.Text);
                cmd.Parameters.AddWithValue("@site_add_country", this.txtBox_SiteAddCountry.Text);
                cmd.ExecuteNonQuery();
                MessageBox.Show("Site Details Added");
            }
        }
        catch (Exception ex)
        {
            MessageBox.Show(string.Format("An error occurred {0}", ex.Message), "Error", MessageBoxButtons.OK, MessageBoxIcon.Error);
        }
        finally
        {
           ClearAllTextBoxes();
        }
    }

}


139
2
задан 18 февраля 2018 в 11:02 Источник Поделиться
Комментарии
1 ответ


Не показывает connectionString в открытом виде. В настоящее время я сохранить его в приложение.Config и я все еще пытаюсь выяснить, как его зашифровать.

Все, что вы можете расшифровать локально, злобный (и достаточно опытный) пользователь может. Более подробная информация дана в ответе здесь.

Есть и другие способы, чтобы избежать этого:


  • Добавить внутренний слой веб-сервиса. Интерфейс подключается только к серверу (нет соединения, необходимые для этого), и backend имеет строку подключения (который недосягаем для внешнего интерфейса и пользователей).

  • Использовать встроенную систему безопасности, т. е. использовать текущую учетную запись Windows для входа в базу данных; в отличие от предоставления логина и пароля в строке подключения. Но вам нужно будет предоставить необходимые права для всех учетной записи пользователя Windows, а затем каждый работает под своей учетной записи (некоторые компании делают это, большинство из них не).



catch try finally для борьбы с исключениями.

Ваша текущая реализация выглядит нормально, но мне интересно, О finally.

Если ошибки нет, поля будут очищены. Что, кажется, в порядке. Но если есть ошибка, поля все-таки снимут? Это не кажется удобным. Я ожидал, что ты хочешь конкретно сохранить содержимое текстовых полей, так что пользователь может повторить попытку сохранения данных.

try
{
//save the data

ClearAllTextBoxes();
}
catch (Exception ex)
{
MessageBox.Show(string.Format("An error occurred {0}", ex.Message), "Error", MessageBoxButtons.OK, MessageBoxIcon.Error);
}

Если исключение возникает во время сохранения данных; исключение будет пропускать в ClearAllTextBoxes(); и перейти прямо к catch. Это не пустые текстовые поля.
Однако, если никакое исключение не сталкивались, то код продолжит ClearAllTextBoxes(); и поэтому очистить текстовые поля.


Небольшой комментарий
Возможно, вы захотите поставить return; в catch. Не надо в данный момент, но он станет актуальным, если больше код после try catch.


В общем, это не хорошо, чтобы положить транспортная обработка данных (SQL-запроса) внутри пользовательского интерфейса. Вы хотите, чтобы положить хотя бы один слой разделения между двумя.

Впрочем, ты уже говорил, что ты новичок, поэтому я не буду забивать этот момент прямо сейчас. Если этот проект представляет собой простое приложение тест; вы не должны реализовать этот слой разделения.

Но я бы посоветовал, чтобы в будущих проектах. Вы не хотите, дурная привычка к форме.


Это придирки, но

if (TextboxesAreNullorEmpty() == true)

действительно перемалывает мои шестерни. == true является избыточным, вы можете просто использовать

if (TextboxesAreNullorEmpty())


Для того, чтобы уменьшить раскроя, можно изменить свой код. В настоящее время у вас есть:

if (TextboxesAreNullorEmpty())
{
MessageBox.Show("Please fill out all fields!");
return;
}
else
{
//Do the work
}

Можно опустить else.

if (TextboxesAreNullorEmpty())
{
MessageBox.Show("Please fill out all fields!");
return;
}

//Do the work

Это работает точно таким же образом. Единственная разница заключается в том, что у вас меньше отступы в коде. В то время как один дополнительный уровень отступа не может быть проблема; достаточно сложный алгоритм может иметь несколько ìnstances лишних отступов, в какой момент это становится существенным фактором.

Но так как вы новичок, это не очень большая проблема сейчас. Просто имейте это в виду на будущее, чтобы избежать дурной привычки.


Хотя вы еще не в точке злоупотребляя этим, вы должны начать искать в разгоне код и положить его на несколько более мелких приемов.

В настоящее время у вас есть один метод, который делает много разных вещей:


  • Ручка кнопка событие click

  • Проверить форму (это уже правильно абстрагируется в отдельный метод)

  • Настройки и команды SQL соединение

  • Обновление данных в базе данных

  • Обрабатывать ошибки

Я бы предложил добавить сюда два дополнительных метода:


  • Вместо того, чтобы поставить логику в обработчик событий click, есть событие click обработчик вызова StartSave() метод, который работает. Благо это становится ясно после того, как вы можете иметь несколько триггеров для сохранения данных (в соответствии с законом сохранения данных не однозначно связаны в один пользовательский элемент управления больше).

  • Поставить весь try catch в отдельный метод, например UpdateDatabase(). В идеале, вы хотите использовать параметры метода здесь для всех входных переменных; которая даст вам уровень разделения между вашей формы контроля и параметры SQL.

4
ответ дан 19 февраля 2018 в 10:02 Источник Поделиться