ExecuteQuery возвращает ноль, а оператор execute возвращает истину - PullRequest
0 голосов
/ 05 октября 2018

Вот мой Java-код, пытающийся получить ResultSet из БД.

    try{

        ps=conn.prepareStatement(QueryMapper.SCHEDULE_APPLICANT_STATUS);
        ps.setString(1,schedule_id);
        rs1=ps.execute();
        System.out.println(rs1);
        ResultSet rs = null;
        while(rs1)
        {
            rs=ps.executeQuery();
            System.out.println(rs.next());
            Application applicationBean= new Application();
            System.out.println("ABC"+schedule_id);
            applicationBean.setScheduledProgramId(rs.getString(3)); 
            applicationBean.setStatus(rs.getString(2)); 
            applicationBean.setApplicantId(rs.getString(1)); 
            applicationList.add(applicationBean);
            applicationCount++;
        }

    }catch (SQLException sqlException) {
        log.error(sqlException.getMessage());
        System.out.println(sqlException.getMessage());
    }

Когда я пытаюсь запустить это, я не могу получить набор результатов в rs с помощью оператора executeQuery.Когда я попытался выполнить оператор execute, он вернул true, что означает, что возвращается какой-то набор результатов.Почему мой executeQuery возвращает ноль.

SQL-запрос, который я пытаюсь выполнить,

SELECT * ИЗ ПРИЛОЖЕНИЯ, ГДЕ SCHEDULED_PROGRAM_ID =?

Этот запрос работает нормально и извлекает результаты при выполнении в диспетчере SQL.

Можете ли вы сказать, где я делаю неправильно.

Ответы [ 3 ]

0 голосов
/ 05 октября 2018

Вам не нужны два объекта ResultSet, и вам нужно выполнить PreparedStatement только один раз.Типичный шаблон:

rs = ps.executeQuery();
while (rs.next()) {
    // process the row returned by next()
    // e.g.,
    System.out.println(rs.getString(1));
}
0 голосов
/ 05 октября 2018

В показанном коде rs может быть только null, если rs1 равно false, что может иметь место только в том случае, если вы выполняете что-то, что не приводит к набору результатов (или если ваш драйвер JDBC имеетошибка, но это менее вероятно).

То, что вы делаете, не имеет смысла.Если вы используете execute(), вам не следует снова выполнять запрос, чтобы получить набор результатов.Это неэффективно, так как вы просите сервер базы данных повторить работу, которую он проделал для вашего первого execute(), вместо этого используйте getResultSet().Как описано в PreparedStatement.execute():

Метод execute возвращает boolean, чтобы указать форму первого результата.Вы должны вызвать либо метод getResultSet, либо getUpdateCount, чтобы получить результат;Вы должны позвонить getMoreResults, чтобы перейти к любому последующему результату (ам).

Однако, если вы знаете, что выполняете запрос, который производит набор результатов (и выбор всегда * 1024)* создает набор результатов, даже если он пустой!), тогда вы должны использовать executeQuery().Это упрощает ваш код.

Ваш код также имеет бесконечный цикл.Вы хотели использовать if (rs1) вместо while(rs1)?

Вы должны изменить свой код на что-то вроде

try (PreparedStatement ps=conn.prepareStatement(QueryMapper.SCHEDULE_APPLICANT_STATUS)) {
    ps.setString(1,schedule_id);
    try (ResultSet rs = ps.executeQuery()) {
        // or maybe if (rs.next())?
        while (rs.next()) { 
            Application applicationBean= new Application();
            System.out.println("ABC"+schedule_id);
            applicationBean.setScheduledProgramId(rs.getString(3)); 
            applicationBean.setStatus(rs.getString(2)); 
            applicationBean.setApplicantId(rs.getString(1)); 
            applicationList.add(applicationBean);
            applicationCount++;
        }
    }
} catch (SQLException sqlException) {
    log.error(sqlException.getMessage());
    System.out.println(sqlException.getMessage());
}
0 голосов
/ 05 октября 2018

Вам не хватает вашего читателя.Это должно быть что-то вроде: while (rs1.read ())

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