#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:
В вашем коде есть несколько проблем:
- Вы получаете
ResultSet
объект, перебираете все строки в нем, получаете значения столбцов, а затем возвращаете этотResultSet
объект. К тому времени, когда он возвращается вызывающей стороне, он уже был использован циклом, который обрабатывал строки (это причина ошибки в вашем вопросе). - Не возвращайте
ResultSet
объект, вместо этого создайтеCustomer
класс сущностей, который сопоставляется с данными в БД, и верните экземплярCustomer
. ВозвратResultSet
объекта действительно плох, поскольку он не дает контроля над тем, как объект закрывается, и не делает ваш код объектно-ориентированным. - Вам не нужно создавать подготовленный оператор, если у вас нет параметризованного запроса.
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 местах при вызове