lelouch_vi 2 Ответов: 2

Нужно ли помещать SQL-команды в отдельный класс?


Всем привет,

У меня есть этот код:

Private Sub btnSave_Click(sender As Object, e As EventArgs) Handles btnSave.Click

    Using connection As New OleDb.OleDbConnection(conSTR)
        Using command As New OleDb.OleDbCommand("INSERT INTO Judges (FullName, Contact, UserName, [Password]) VALUES (@FullName, @Contact, @UserName, @Password)",
                                connection)
            command.Parameters.AddWithValue("@FullName", txtFullNameJudge.Text)
            command.Parameters.AddWithValue("@Contact", txtContactJudge.Text)
            command.Parameters.AddWithValue("@UserName", txtUserNameJudge.Text)
            command.Parameters.AddWithValue("@Password", txtPasswordJudge.Text)

            connection.Open()

            command.ExecuteNonQuery()
            MessageBox.Show("DATA HAS BEEN ADDED", "SAVE", MessageBoxButtons.OK, MessageBoxIcon.Information)

        End Using
    End Using


Что я уже пробовал:

Мне просто интересно, является ли это правильной практикой для sql-команд? Могу ли я поместить это в отдельный класс? Если да, то в чем тогда преимущество этого?

2 Ответов

Рейтинг:
6

OriginalGriff

Просто чтобы добавить к тому, что сказал Фил, всегда храните пароли в открытом тексте - это серьезная угроза безопасности. Здесь есть некоторая информация о том, как это сделать: Хранение паролей: как это сделать.[^]

И помните: если у вас есть какие-либо пользователи из Европейского союза, то применяется GDPR, а это означает, что вы должны обрабатывать пароли как конфиденциальные данные и хранить их безопасным и безопасным способом. Текст-это ни то, ни другое, и штрафы могут быть ... ГМ ... выдающийся. В декабре 2018 года немецкая компания получила относительно низкий штраф в размере 20 000 евро именно за это.

И хотя он прав в том, что вы не можете поместить этот код в свой собственный класс, вы правы в том, что в вашем дизайне "всего приложения" есть ошибка в том, что у вас нет реального разделения проблем: гораздо лучше принять "трехслойную" модель, где "уровень представления" (который имеет дело непосредственно с пользователем) отделен от "бизнес-уровня" (который имеет дело с правилами обработки и манипулирования данными), и оба они отделены от "уровня данных" (который имеет дело с основами манипулирования базами данных и другими формами хранения). Стоит почитать об этом: Многоуровневая архитектура - Википедия[^] даст вам основы.


lelouch_vi 2

Привет Оргинальгрифф,

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

OriginalGriff

Всегда пожалуйста!
Не откладывайте это на потом: "намерения" не считаются с нарушениями защиты данных, только "результаты".
И мы оба знаем, сколько времени нам дается, чтобы "вернуться и сделать это должным образом позже"... :смеяться:

Рейтинг:
14

phil.o

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

Вы могли бы, в крайнем случае, поместить его в свой собственный метод, вместо того чтобы непосредственно помещать его в обработчик событий; это позволило бы вам вызвать сохранение несколькими способами (щелчок кнопки, щелчок по пункту меню и т. д.).

Наконец, использование Using блоки, а также параметризованный запрос - это определенно правильный путь.

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


lelouch_vi 2

Привет, Фил.,

Спасибо, что указали на беспокойство по поводу паролей, на самом деле я намерен разобраться с этим позже, так как я только начинаю исследовать vb.net. Моя основная цель на данный момент-научиться писать код более чистым способом, адаптировать лучшие практики эффективного написания кодов (если они есть, пожалуйста, предоставьте мне ссылку), потому что мой код выглядит довольно грязно.

Все равно спасибо за помощь!

phil.o

Всегда пожалуйста! Ваш код совсем не выглядит грязным. Напротив, для новичка это вполне понятно.

Если бы мне пришлось дать еще один совет, то это было бы избегать использования AddWithValue метод. Лучше использовать Метод add[^] вместо этого; это позволяет четко указать тип базы данных, с которой вы работаете (и предотвращает некоторые проблемы со строковыми полями между полями unicode и не-unicode). Применительно к вашему коду это дало бы:

command.Parameters.Add("@FullName", SqlDbType.NVarChar).Value = txtFullNameJudge.Text
command.Parameters.Add("@Contact", SqlDbType.NVarChar).Value = txtContactJudge.Text
command.Parameters.Add("@UserName", SqlDbType.NVarChar).Value = txtUserNameJudge.Text
command.Parameters.Add("@Password", SqlDbType.NVarChar).Value = txtPasswordJudge.Text

Обратите внимание, что вам, возможно, придется исправить значение SqlDbType в соответствии со схемой базы данных.
Что касается того, как эффективно писать код, то это тот вопрос, на который невозможно ответить в вопросе быстрых ответов, не говоря уже о комментарии. Опыт-это то, что принесет большинство ответов на него, и оставаться любопытным и всегда иметь возможность подвергать сомнению свои собственные практики-это также ключевые элементы. Блуждание по CodeProject и чтение вопросов, ответов и комментариев тоже может помочь.

lelouch_vi 2

Опыт-это то, что принесет большинство ответов на него, и оставаться любопытным и всегда иметь возможность подвергать сомнению свои собственные практики-это также ключевые элементы.

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

Еще раз спасибо за помощь!