2013-05-14 4 views
0

У меня есть эта база данных sqlite, в которой я могу запустить запрос «выберите * со штрих-кода, где штрих-код =« CFMS-ZUFH-WRVY-EXAA », и получить один row return. Однако в моем приложении Java, когда я запускаю почти такой же sql, он возвращает пустой набор результатов. Переменные last, email и т. д. - это JTextFields, хотя проблема перед ними. Оператор if даже не выполняется, и если Я бегу rs.next() перед ним и установить, если (истина), я получаю ошибку говоря ResultSet закрыт.Не могу понять, почему sqlite-запрос не возвращает правильный результат.

try { 
    db.dbopen(config.getdbfolder(),config.getdbname()); 
    // barcode-barcode.replaceAll("\\s",""); 
    ResultSet rs=db.query("select * from barcode where barcode=?",barcode); 

    if (rs.next()) { 
     first.setText(rs.getString("first_name")); 
     System.out.println(rs.getString("first_name")); 
     last.setText(rs.getString("last_name")); 
     email.setText(rs.getString("email")); 
     phone.setText(rs.getString("phone")); 
     subject.setSelectedItem(rs.getString("subject")); 
     Boolean selected; 
     if (rs.getString("baronly").equals("false")) selected=false; 
     else selected=true; 
     barcodebox.setSelected(selected); 
     update=true; 

    } 
    db.conn.close(); 

} catch (SQLException e) { 
    e.printStackTrace(); 
} catch (ClassNotFoundException e) { 
    // TODO Auto-generated catch block 
    e.printStackTrace(); 
} 

Вот метод запроса.

public ResultSet query(String sql, String barcode) throws SQLException { 
    // TODO Auto-generated method stub 
    PreparedStatement prep =conn.prepareStatement(sql); 
    prep.setString(1, barcode); 

    ResultSet rs= prep.executeQuery(); 
    prep.close(); 
    return rs; 
} 
+0

'if (rs.next()) {' не должно быть 'while (rs.next()) {'? – Smit

+0

@ Нет, это не обязательно. rs.next() просто проверяет, была ли возвращена какая-либо строка. – Jason

+0

Нет только один результат. – Codeguy007

ответ

1

В вашем методе query, вы закрываете PreparedStatement, прежде чем вернуть ResultSet. Согласно Javadocs for close:

Примечание: При себе объект закрыт, его текущий объект ResultSet, , если таковой существует, также закрыт.

Не закрывайте PreparedStatement в query, закройте его после того, как вы используете ResultSet. Я бы удалил метод query и поместил его код в строку с остальной частью вашего кода, так что у вас все еще есть ссылка на PreparedStatement, чтобы закрыть после того, как вы закончите с ResultSet.

И как уже упоминалось @Reimeus, назначьте результат replaceAll обратно на barcode.

+0

Да, это не работает. Если я прокомментирую prep.close() в запросе, то предыдущее использование запроса функции не выполняется. Я попробую заменить запрос на встроенный код и посмотреть, есть ли у меня больше удачи. – Codeguy007

+0

Я не сказал «не закрывай его вообще». Вам придется изменить порядок кода, чтобы его можно было закрыть после обработки 'ResultSet'. – rgettman

+0

Ничего, я изменил что-то, что изменило логику предыдущего использования запроса, так что он работал, несмотря на то, что запрос ничего не возвращал.Я переместил весь код в ряд, и теперь он отлично работает. – Codeguy007

1

Ваш штрих-код может по-прежнему иметь пробелы. Назначают его к результату replaceAll:

barcode = barcode.replaceAll("\\s",""); 
+0

стрелять, не видел, что один XD – Jason

+0

Да, дело не в этом. – Codeguy007

+0

Вам не нужно беспокоиться об этой линии. штрих-код является окончательным, поэтому я не могу изменить его значение в любом случае. Я просто попробовал это, чтобы увидеть, были ли пробелы в переменной, но это не проблема. – Codeguy007

0

Итак, это окончательный ответ от @Reimeus @ rgettman.

 try { 
      db.dbopen(config.getdbfolder(),config.getdbname()); 
      //you need to set this replaceAll return value to original variable 
      barcode = barcode.replaceAll("\\s",""); 

      //make prep statement here in order to close it in the finally block 
      PreparedStatement prep =conn.prepareStatement("select * from barcode where barcode=?"); 

      //modify query function to accept prepared statement instead of a string 
      ResultSet rs=db.query(prep ,barcode); 

      if (rs.next()) { 
       first.setText(rs.getString("first_name")); 
       System.out.println(rs.getString("first_name")); 
       last.setText(rs.getString("last_name")); 
       email.setText(rs.getString("email")); 
       phone.setText(rs.getString("phone")); 
       subject.setSelectedItem(rs.getString("subject")); 
       Boolean selected; 
       if (rs.getString("baronly").equals("false")) selected=false; 
       else selected=true; 
       barcodebox.setSelected(selected); 
       update=true; 

      } 
      db.conn.close(); 

     } catch (SQLException e) { 
      e.printStackTrace(); 
     } catch (ClassNotFoundException e) { 
      // TODO Auto-generated catch block 
      e.printStackTrace(); 
     } finally { 
     //finally you close prepared statement. note that closing prep also closes 
//resultset and closing connection won't clean up resultset nor prep according to most of 
//stackoverflow answers. However, it is recommended to close both resultset and prepared 
//statement explicitly 
     prep.close(); 
     rs.close(); 
     } 

Это должно работать при условии, что ваша таблица базы данных имеет правильные значения, которые соответствуют условиям условия where. Пожалуйста, дважды проверьте, успешно ли выполняется ваш запрос, когда вы тестируете его.

Смежные вопросы