Валидация повторения имени в sql БД? - PullRequest
0 голосов
/ 17 июня 2020

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

Обычно, если появляется ошибка, процесс не должен выполняться, если только ошибка решена.

Но он по-прежнему сохраняет имя и прочее. И да, я пытаюсь применить проверки (что у меня не очень хорошо получается)

String checkName="SELECT * FROM administrator WHERE name1='"+name+"'";
Pstat = con.prepareStatement(checkName);
rs = Pstat.executeQuery();

if(rs.next())
{
    nameTextField.setText(null);
    JOptionPane.showMessageDialog(null,"Please Enter Different Name","Error", JOptionPane.ERROR_MESSAGE);
}

Здесь Pstat - это экземпляр PreparedStatement, con - экземпляр Connection , а rs - это экземпляр ResultSet.

adminstrator - это имя таблицы, а name1 - имя столбца.

Извините, я недавно перешел с c ++ на Java. Не очень разбираюсь в чеках.

Я получаю сообщение об ошибке

Пожалуйста, введите другое имя

, но когда я нажимаю ОК , У меня появляется другое всплывающее окно

Ваши данные введены

(это всплывающее окно создано пользователем, поэтому не беспокойтесь, как java стал таким умным в отношении ввода данных )

И да, я немного знаю о next(). Но я не мог понять это в заявлении if ....

Может ли кто-нибудь сказать мне, что происходит в конце этого if утверждения?

1 Ответ

1 голос
/ 17 июня 2020

Что происходит в бэкэнде if(rs.next()):

  1. Когда выполнение вашего кода достигает if(), выполняется rs.next().
  2. В зависимости от результата вашего запроса, объект ResultSet rs имеет либо ноль, либо больше результатов.
  3. Объект rs поддерживает указатель на все записи, которые он содержит. Первоначально этот указатель указывает на своего рода «фиктивное» местоположение перед фактической записью.
  4. Например, если в объекте rs есть три записи, скажем [0,1,2], то сначала указатель указывает на -1.
  5. Каждый раз, когда вы вызываете next() на rs, указатель перемещается на одну позицию вперед, и если в новом месте есть запись, next() возвращает true.
  6. Если в новом месте нет записи, next() возвращает false.
  7. Для вашего вопроса предположим, что запись доступна, и rs.next() возвращает true.
  8. Следовательно, выполнение входит в тело if().
  9. rs.next() обычно вызывается внутри al oop, если от выбора ожидается более одной записи запрос, но поскольку в вашем коде нет l oop, rs.next() выполняется только один раз. Все, с этим больше ничего не происходит. Затем перейдите к телу if().
  10. Здесь компилятор выполняет код, который вы написали, т.е. устанавливает текст nameTextField на null и показывает всплывающее окно с сообщением об ошибке.
  11. Затем компилятор ожидает закрытия диалогового окна с ошибкой (я думаю, не уверен в этом шаге, поскольку он был слишком длинным, но go посмотрите в javadocs, чтобы узнать, не является ли JOptionPane.showMessageDialog() не- блокирование или блокирование).
  12. Но выполнение кода на этом не останавливается, и именно здесь в вашем коде возникают подозрения.
  13. В коде, который вы предоставили с этим вопросом, у вас нет return или throw или break до того, как ваше тело if() закончится.
  14. Итак, компилятор просто выходит из тела if() и продолжает выполнение любого кода ниже - я предполагаю, что он предназначен для вставки данных, и именно отсюда появляется всплывающее окно «Данные были вставлены».

Добавление оператора return или выдача Exception просто ниже JOptionPane.showMessageDialog(), внутри if(rs.next()) следует решить e ваша проблема, если мое предположение относительно отсутствующего кода верное.

Ciao!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...