Как правильно подключиться к базе данных sqlite, выполнить подготовленный оператор и закрыть соединение с Java? - PullRequest
0 голосов
/ 09 июня 2018

Это мой код на данный момент.У меня было или было несколько проблем:

  • База данных занята - ошибка
  • Ошибка SQL или отсутствует база данных
  • Результирующий набор закрыт

Какойструктуру кода я должен использовать, если я хочу предотвратить обе эти ошибки?Нужно ли подключаться в блоке try?Где мне нужно закрыть соединение?Где мне нужно закрыть подготовленное государство?

Мне не удалось найти решение, связав информацию о разных страницах самостоятельно до сих пор.

    public boolean checkForUser(String username){
        try(Connection con = this.connect();
                PreparedStatement pstmt = createPreparedStatementRegistrate(conn, username);
                ResultSet rs= pstmt.executeQuery();)
                {
                if (rueck.next()){
                    pstmt.close();
                    rs.close();
                    con.close();
                    //do some stuff
                }
        }catch(SQLException e){
            e.printStackTrace();
        }
        return null;
    }

private PreparedStatement createPreparedStatementRegistrate(Connection conn, String username) throws SQLException {
    String sql = "SELECT * FROM users WHERE username = ?";
    PreparedStatement pstmt = conn.prepareStatement(sql);
    pstmt.setString(1, username);
    return pstmt;
}

private Connection connect() {
        String url = "jdbc:sqlite:user.db";
        Connection con = null;
        try {
            con = DriverManager.getConnection(url);
        } catch (SQLException e) {
            e.printStackTrace();
        }
        return con;
    }

java.sql.SQLException: ResultSet closed
    at org.sqlite.core.CoreResultSet.checkOpen(CoreResultSet.java:69)
    at org.sqlite.jdbc3.JDBC3ResultSet.findColumn(JDBC3ResultSet.java:38)
    at org.sqlite.jdbc3.JDBC3ResultSet.getString(JDBC3ResultSet.java:443)
    at zugriffsverwaltung.Zugriffsverwaltung.loeschen(Zugriffsverwaltung.java:215)
    at zugriffsverwaltung.Zugriffsverwaltung.<init>(Zugriffsverwaltung.java:37)
    at main.Server.<init>(Server.java:29)
    at main.Server.main(Server.java:46)
org.sqlite.SQLiteException: [SQLITE_ERROR] SQL error or missing database (Connection is closed)
    at org.sqlite.core.DB.newSQLException(DB.java:909)
    at org.sqlite.core.CoreStatement.internalClose(CoreStatement.java:115)
    at org.sqlite.jdbc3.JDBC3Statement.close(JDBC3Statement.java:35)
    at org.sqlite.jdbc4.JDBC4Statement.close(JDBC4Statement.java:27)
    at zugriffsverwaltung.Zugriffsverwaltung.loeschen(Zugriffsverwaltung.java:238)
    at zugriffsverwaltung.Zugriffsverwaltung.<init>(Zugriffsverwaltung.java:37)
    at main.Server.<init>(Server.java:29)
    at main.Server.main(Server.java:46)

1 Ответ

0 голосов
/ 09 июня 2018

Проблема в том, что вы закрываете результирующий набор, оператор и соединение, прежде чем делать что-то с результирующим набором.Это недопустимо: результирующий набор должен быть открыт при получении значений с использованием getString (не показано в вашем коде, но присутствует в трассировке стека).

Поскольку вы используете try-with-resourceкоторый закроет ресурс при выходе, даже нет необходимости явно закрывать.Кроме того, похоже, что драйвер SQLite не соответствует требованиям JDBC, что закрытие уже закрытого ресурса не должно выполняться, так как он вызывает исключение, что соединение закрывается при закрытии оператора (вероятно, из-за попытки с ресурсами).).

Вам необходимо изменить код на

public boolean checkForUser(String username){
    try(Connection con = this.connect();
            PreparedStatement pstmt = createPreparedStatementRegistrate(conn, username);
            ResultSet rs= pstmt.executeQuery();)
            {
            if (rueck.next()){
                //do some stuff
            }
    }catch(SQLException e){
        e.printStackTrace();
    }
    return null;
}

То есть удалить строки

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