Как проверить, существует ли идентификатор в базе данных в JavaFx - PullRequest
0 голосов
/ 24 июня 2019

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

MemberDbController.java

public static boolean checkMemberID(int memberId) throws SQLException, ClassNotFoundException {
        boolean memberIdExists = false;

        Connection conn=DBConnection.getDBConnection().getConnection();
        Statement stm = conn.createStatement();
        ResultSet rst = stm.executeQuery("SELECT * FROM members WHERE memberId='"+memberId+"'");

        String id;
        if (rst.next()){
            id = rst.getString("memberId");
            if(id.equals(memberId)){
                memberIdExists = true;
            }
        }
        return memberIdExists;
    }

MemberManagementController.java

@FXML
void addMember(ActionEvent event) {

        ValidationController valid = new ValidationController();

        if(valid.validateEmpty(memberIdField) && valid.validateEmpty(nameField) && valid.validateEmpty(doaField) &&
                valid.validateEmpty(emailField) && valid.validateEmpty(phoneField) && valid.validateDate(doaField))

        {
            int memberId = Integer.parseInt(memberIdField.getText());
            String name = nameField.getText();
            String doa = doaField.getText();
            RadioButton selectedRadioButton = (RadioButton) Gender.getSelectedToggle(); //Getting Selected Radio Button
            String gender = selectedRadioButton.getText();
            String email = emailField.getText();
            String phone = phoneField.getText();

            try {

                if(MemberDbController.checkMemberID(memberId)){

                    Member member = new Member(memberId,name,doa,gender,email,phone);
                    int i = MemberDbController.AddMember(member);

                    if (i > 0) {
                        Alert alert = new Alert(Alert.AlertType.INFORMATION);
                        alert.setTitle("Member Management");
                        alert.setHeaderText(null);
                        alert.setContentText("Member Added Successfully..!");
                        alert.showAndWait();

                        memberIdField.setText(null);
                        nameField.setText(null);
                        doaField.setText(null);
                        emailField.setText(null);
                        phoneField.setText(null);

                        //Table Refresh
                        data.clear();
                        loadTable();
                    }
                    else{
                        Alert alert = new Alert(Alert.AlertType.ERROR);
                        alert.setTitle("Member Management");
                        alert.setHeaderText(null);
                        alert.setContentText("There is an Error in Adding Member..!");
                        alert.showAndWait();
                    }

                }else{
                    Alert alert = new Alert(Alert.AlertType.ERROR);
                    alert.setTitle("Member Management");
                    alert.setHeaderText(null);
                    alert.setContentText("Member ID Already Exists..!");
                    alert.showAndWait();
                }

            } catch (ClassNotFoundException e) {
                e.printStackTrace();
            } catch (SQLException e) {
                e.printStackTrace();
            }
        }
    }

Это не проверка, и я получаю идентификатор участника. Уже существует предупреждение как для дубликата, так и для новой записи.

1 Ответ

3 голосов
/ 24 июня 2019

Вы сравниваете String с Integer объектом. Это всегда дает false:

public static boolean checkMemberID(int memberId) ... {
    int memberId
    ...
    String id;
    ...
    if(id.equals(memberId)){

Скомпилированная версия id.equals(memberId) совпадает с id.equals(Integer.valueOf(memberId))

Проверка значения столбца в любом случае не обязательна, так как ваше предложение WHERE не будет принимать строки с другими значениями в этом столбце. (Сравнение со строковым литералом здесь кажется мне странным. Вы уверены, что тип столбца является текстовым?)

Следующего должно быть достаточно:

public static boolean checkMemberID(int memberId) throws SQLException, ClassNotFoundException {
    Connection conn=DBConnection.getDBConnection().getConnection();
    Statement stm = conn.createStatement();
    ResultSet rst = stm.executeQuery("SELECT * FROM members WHERE memberId='"+memberId+"'");

    return rst.next();
}

Кроме того, в addMember вы обрабатываете результат, как если бы он возвращал true, если значение не существует, кроме текущего.


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

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