Результат не открыт - PullRequest
       11

Результат не открыт

0 голосов
/ 10 января 2011

Я получаю следующую ошибку в наборе результатов

java.sql.SQLException: ResultSet не открыт.Убедитесь, что автокоммит выключен.в org.apache.derby.client.am.SQLExceptionFactory40.getSQLException (неизвестный источник) в org.apache.derby.client.am.SqlException.getSQLException (неизвестный источник) в org.apache.derby.client.am.ResultSet.next(Неизвестный источник)

    public  ResultSet insertDb(int Id,String firstName,String lastName,String title) throws SQLException{
        try {
            try {
                Class.forName(driver);
                con = DriverManager.getConnection(connectionURL);

                } catch (SQLException ex) {
                Logger.getLogger(Connect.class.getName()).log(Level.SEVERE, null, ex);
                } catch (ClassNotFoundException ex) {
                Logger.getLogger(Connect.class.getName()).log(Level.SEVERE, null, ex);
                }
    System.out.println(con.getAutoCommit());
    statement = con.createStatement() ;
    res = statement.executeQuery("SELECT * FROM CUSTOMER") ;
    con.setAutoCommit(false);
    System.out.println(con.getAutoCommit());

    while(res.next()){
        if(res.getString("ID").equalsIgnoreCase(Integer.toString(Id))){
            UNIQUE = false;
             error= "Duplicate Entry Found Please Enter New Data";
            throw new SQLException("Duplicate info<br>ID " + Id );

        }
    }
    // IF value to be added IS UNIQUE
    if(UNIQUE){
        String qry1= "insert into CUSTOMER(ID, FIRSTNAME,LASTNAME,TITLE) values(?,?,?,?)";
        stm  = con.prepareStatement(qry1);
        String ID=Integer.toString(Id);
        stm.setString(1, ID);
        stm.setString(2, firstName);
        stm.setString(3, lastName);
        stm.setString(4, title);
        stm.executeUpdate();
    }
}
catch(Exception e){
    String errorMessage = "Exception caught : ";
    System.out.println(errorMessage + e.toString());

}finally{   
    if (con != null){
    con.close();
    }
        }

return res;
    }  

Ответы [ 4 ]

1 голос
/ 10 января 2011

Проблема в том, что вы закрыли свой запрос перед чтением набора результатов. Закрывая запрос, закрывает набор результатов, поэтому вы получаете сообщение об ошибке «ResultSet not open». Вы должны закрыть запрос прямо в конце, в блоке finally:

т.е. con.setAutoCommit (ложь);

закроет запрос и вместе с ним закроет набор результатов.

1 голос
/ 10 января 2011

Попробуйте переместить setAutoCommit() и getAutoCommit() в до того, как вы создадите и выполните инструкцию.Изменяя его после , вы выполняете оператор, что может сделать запрос недействительным.

0 голосов
/ 22 ноября 2011

В случае, если это поможет кому-либо в дальнейшем, у меня была та же ошибка с Derby 10.5.1.1 , которая оказалась ошибкой в драйвересамо по себе это может появиться несколько раз, а не другие в зависимости от базовых данных.Обновление драйвера до более новой версии ( 10.8.2.2 ) решило проблему.

0 голосов
/ 10 января 2011

Не строго связано, но ваш код, вероятно, не выполняет то, что вы ожидаете. Этот вид кода «чтение-изменение-запись» не работает, если имеется несколько одновременных вызовов.

Если вы представляете два вызова, выполняемых через код, становится ясно, что иногда, в зависимости от порядка выполнения, ОБА вызовы могут достигать оператора вставки.

Кроме того, выбор из таблицы без использования предложения WHERE обычно бесполезен. В этом случае вы выбираете «*», а затем перебираете все результаты, чтобы увидеть, «ID» == Id. База данных намного лучше, чем Java. Вы должны добавить предложение where. (Обратите внимание, что это все еще не решит вышеуказанную проблему)

Также вообще плохая идея «выбирать *» из любой таблицы. Просто выберите нужные вам столбцы. Это «быстро провалится», если схема изменится, а нужные вам столбцы больше не будут доступны, и позволит оптимизатору базы данных сделать «правильные вещи» при обращении к диску.

Наконец, если вы хотите назначить только числовой идентификатор, то обычно для них используется «автонумерация», а не программа, которая их выбирает. В разных базах данных они называются по-разному, поэтому вы также можете знать их как IDENTITY или использовать последовательность.

...