org.sqlite.SQLiteException: [SQLITE_NOTADB] Открытый файл, который не является файлом базы данных (файл зашифрован или не является базой данных) [NETBEANS] - PullRequest
0 голосов
/ 08 июля 2020

Итак, у меня есть эта форма, которую я использую, но я получаю эту ошибку всякий раз, когда я отправляю, она говорит, что СОЕДИНЕНИЕ УСПЕШНО, но затем она возвращает ошибку и никогда не вставляет и не извлекает что-либо из базы данных. Я проверил версию sqlite и все такое, не могу понять.

publi c class databaseConnection {

public static Connection connection = null;

public static Connection getConnection() throws ClassNotFoundException {
    try {
        System.out.println("CONNECTING");
        Class.forName("org.sqlite.JDBC");
        connection = DriverManager.getConnection("jdbc:sqlite:SoftwareDB.db");
        System.out.println("CONNECTION SUCCESSFUL");
    } catch (SQLException e) {
        System.out.println("ERROR: Connection Failed!");
    }
    return connection;
}

public static void login(String username, String password, String login) throws ClassNotFoundException {
    try {
        System.out.println("INSERTING");
        try (Statement stmt = getConnection().createStatement()) {
            String sql = "INSERT INTO login (username, password) VALUES ('" + username + "', '" + password + "', '" + login + "');";
            stmt.execute(sql);
        }
        getConnection().close();
        System.out.println("INSERT SUCCESSFUL");
    } catch (SQLException ex) {
        Logger.getLogger(Connection.class.getName()).log(Level.SEVERE, null, ex);
    }
}

public static ResultSet getLoginDetails(String query) throws SQLException, ClassNotFoundException {
    ResultSet rs;
    try (PreparedStatement ps = getConnection().prepareStatement(query)) {
        rs = ps.executeQuery();
        ps.close();
        getConnection().close();
    }
    return rs;
}

public static ResultSet getExistentDetails(String query) throws SQLException, ClassNotFoundException {
    ResultSet rs;
    try (PreparedStatement ps = getConnection().prepareStatement(query)) {
        rs = ps.executeQuery();
        getConnection().close();
    }
    return rs;
}

}

private void loginBtnMouseClicked(java.awt.event.MouseEvent evt) {                                      

    if (username.getText().isEmpty() || password.getText().isEmpty()) {
        infoLabel.setVisible(true);
        username.setText("");
        password.setText("");
    } else {
        try {
            
            databaseConnection.getLoginDetails("SELECT * FROM register WHERE email = '?' AND password = '?'");
            String ts = new SimpleDateFormat("dd.MM.yyyy - HH.mm.ss").format(System.currentTimeMillis());
            databaseConnection.login(username.getText(), password.getText(), ts);
            JOptionPane.showMessageDialog(null, "Login succesful!");
            new login().setVisible(true);

            infoLabel.setVisible(true);
            username.setText("");
            password.setText("");
        } catch (HeadlessException ex) {
            JOptionPane.showMessageDialog(null, "Failed!");
        } catch (SQLException | ClassNotFoundException ex) {
            Logger.getLogger(login.class.getName()).log(Level.SEVERE, null, ex);
        }
    }
}     

Выход

1 Ответ

0 голосов
/ 09 июля 2020

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

Не могли бы вы попробовать следующий переписанный метод getLoginDetails() и черпать из него вдохновение для других методов ?

public static ResultSet getLoginDetails(String query, String email, String password) throws SQLException, ClassNotFoundException {
    ResultSet rs;
    try (Connection conn = getConnection()) {   
        try (PreparedStatement ps = conn.prepareStatement(query)) {
            ps.setString(1,email);
            ps.SetString(2,password);
            rs = ps.executeQuery();    
           // Do something with the ResultSet here or do not close the statement!   
        }
    }
    return rs; // should be something else! (as it could be already closed)
}

Тогда вам, безусловно, нужно что-то сделать с ResultSet! Например: проверьте, существует ли комбинация адреса электронной почты и пароля для проверки запроса на вход.

Также несколько важных замечаний и советов:

  • лучше проверьте, действительно ли соединение после инициализация с использованием isValid(timeout)
  • подумайте о пуле соединений или, по крайней мере, о некоторых способах повторного использования ваших соединений
  • в конечном итоге используйте существующие инструменты (такие библиотеки, как Apache) для вашего ORM (Сопоставление объектных отношений) и DAO (объект доступа к базе данных). На самом деле, это рекомендуется .
  • закрытие PreparedStatement автоматически закроет связанный ResultSet. Ваш код не учитывает это. Ср. https://docs.oracle.com/javase/8/docs/api/java/sql/ResultSet.html

Держите меня в курсе!

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