Я получаю сообщение об ошибке «java.sql.SQLException: после завершения набора результатов» при попытке получить доступ к этому возвращенному ResultSet Customer.из другого метода

#java #jdbc #resultset

#java #jdbc #результирующий набор

Вопрос:

  public ResultSet getAllCustomer() throws SQLException{
  //List L = new ArrayList();
    try {
           stm = con.prepareStatement("select * from customer");
     
      resultSetSubject = stm.executeQuery();
        while (resultSetCustomer.next()) {
            
            //L.add(resultSetCustomer);
            
         resultSetCustomer.getInt(1);
             resultSetCustomer.getString(2);
             
           
            
            //System.out.println(resultSetCustomer.getInt("id") " " resultSetCustomer.getString("name"));
           
        }
    } catch (Exception e) {
         System.out.println(e);
    } 
     
       
  return resultSetCustomer;
   
}
 

Позвольте мне кратко, я извлекаю все записи из таблицы customer и возвращаю как результирующий набор. Я получаю доступ к возвращенному результирующему набору как

Результирующий набор rs = T.getAllCustomer();

           System.out.println(rs.getInt("id") " " rs.getString("name")); 
 

Ответ №1:

В вашем коде есть несколько проблем:

  1. Вы получаете ResultSet объект, перебираете все строки в нем, получаете значения столбцов, а затем возвращаете этот ResultSet объект. К тому времени, когда он возвращается вызывающей стороне, он уже был использован циклом, который обрабатывал строки (это причина ошибки в вашем вопросе).
  2. Не возвращайте ResultSet объект, вместо этого создайте Customer класс сущностей, который сопоставляется с данными в БД, и верните экземпляр Customer . Возврат ResultSet объекта действительно плох, поскольку он не дает контроля над тем, как объект закрывается, и не делает ваш код объектно-ориентированным.
  3. Вам не нужно создавать подготовленный оператор, если у вас нет параметризованного запроса.
  4. Statement ResultSet ) должно close быть разделено после завершения. Вы должны обернуть код, который обрабатывает весь результат, в try-with-resources инструкцию.

Комментарии:

1. Спасибо за вашу руку.. пожалуйста, обратите внимание, что моя программа требует возврата набора результатов, а не любого экземпляра клиента. Я сделал close statement и resultset, однако он показывает ошибку, поэтому пытается протестировать другой процесс как вставленный avobe. Решение должно заключаться в том, как я могу вернуть результирующий набор. Пожалуйста, внесите свой вклад в это, как я могу это сделать?

2. @NEHASURDESHAI основная проблема в вашем коде заключается в том, что вы обрабатываете набор результатов в самом методе ( while (resultSetCustomer.next()) { цикл). Эта часть должна выполняться вызывающим методом, а не самим методом. Обработка результирующего набора в методе использует результирующий набор, что приводит к ошибке, когда вызывающий пытается его использовать.

Ответ №2:

Ваш код нуждался в небольшой поправке

1> Убедитесь, что используемая вами переменная результирующего набора совпадает с определенной (в вашем коде одно место отличается).

2> использовать только

 public ResultSet getAllCustomer() throws SQLException{
try {
       stm = con.prepareStatement("select * from customer");
 
  resultSetCustomer = stm.executeQuery();
   
} catch (Exception e) {
     System.out.println(e);
}  
  return resultSetCustomer;
 

}

3> Закройте ваше соединение / набор результатов / оператор отдельным методом, иначе вы получите сообщение об ошибке. вы можете использовать, как показано ниже

 public void close() throws SQLException{
     
     if (resultSetCustomer != null) {
         resultSetCustomer .close();
     }
     if (stm !=null) {
         stm.close();
     }
 }
 

4> используйте resultset(ваш экземпляр resultset).next() при доступе

Комментарии:

1. Спасибо, это сработало.. просто мне нужно использовать next() в 2 местах при вызове