Исключение UCanAccess ConstraintViolationException не поймано

#ucanaccess

Вопрос:

Я создал составной индекс в базе данных Microsoft Access по трем полям. Индекс работает, если я попытаюсь вручную добавить строки, которые нарушают индекс. Он также работает в программе Javafx, поскольку вызывает это исключение: UCAExc:::4.0.2 нарушение ограничения целостности: уникальное ограничение или нарушение индекса; Таблица CLASS_CHECKROOM: КЛАСС

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

 }catch (SQLException ex) {
        if(ex.getMessage().contains("integrity")) {

            Alert alertUpdateOK = new Alert(AlertType.INFORMATION);
            alertUpdateOK.setTitle("Double Booked");
            alertUpdateOK.setContentText(ex.getMessage());
            alertUpdateOK.show();
       } 
   }
 

Это выводит «Нет ошибки» , а затем возникает исключение
и:

    }catch (SQLException ex) {
        
            Alert alertUpdateOK = new Alert(AlertType.INFORMATION);
            alertUpdateOK.setTitle("Double Booked");
            alertUpdateOK.setContentText(ex.getMessage());
            alertUpdateOK.show();
       } 
   }
 

Это просто вызывает исключение без предупреждения, и приложение вылетает

Я видел некоторые решения, связанные с кодом ошибки для исключения, и, как я понимаю, Ucanaccess использует HSQLDB, я пробовал коды ошибок 25 58 и 104

 }catch (SQLException ex) {
            if (ex.getSQLState().startsWith("25")) {        
                    
            Alert alertUpdateOK = new Alert(AlertType.INFORMATION);
            alertUpdateOK.setTitle("Double Booked");
            alertUpdateOK.setContentText(ex.getMessage());
            alertUpdateOK.show();
            }
        }
 

«Без ошибок»
— повторил ПИД. Введите другой PID

Помощь была бы признательна. Весь код является

 public void insertIntoDB() throws SQLException{
        Connection connection =null;
        PreparedStatement preparedStatement = null;
        
        
        if (Integer.parseInt(start) < Integer.parseInt(finish)) {
        try {
            connection =AccessConnect.Connector();
            String sql = "INSERT INTO Class(ClassName, WeekDay, ClassStart, ClassFinish, TeacherID, classAge, MaxSize, RoomID, subjectID) VALUES (?,?,?,?,?,?,?,?,?)";
            preparedStatement = connection.prepareStatement(sql);
            
            
            preparedStatement.setString(1, classname);
            preparedStatement.setString(2, weekday);
            preparedStatement.setString(3, start);
            preparedStatement.setString(4,finish);
            preparedStatement.setInt(5, teacherid);
            preparedStatement.setInt(6, classage);
            preparedStatement.setInt(7, maxsize);
            preparedStatement.setInt(8, roomid);
            preparedStatement.setInt(9,subjectid);
            
            preparedStatement.executeUpdate();
            
        }catch (SQLException ex) {
            
            Alert alertUpdateOK = new Alert(AlertType.INFORMATION);
            alertUpdateOK.setTitle("Double Booked");
            alertUpdateOK.setContentText(ex.getMessage());
            alertUpdateOK.show();
       } 
   
        
        finally {
            if (preparedStatement != null)
                preparedStatement.close();
            if (connection !=null)
                
                connection.close();
        }
}
        
        else {
            Alert alertUpdateOK = new Alert(AlertType.INFORMATION);
            alertUpdateOK.setTitle("Times are wrong");
            alertUpdateOK.setContentText(" The start time has to be before the end time");
            alertUpdateOK.show();
        }
    }
 

Ответ №1:

Мне удалось зафиксировать исключение в окне предупреждения. Я использовал eclipse, и мне нужно было очистить проект, и это сработало