2016-11-16 3 views
2

У меня есть функция для извлечения данных из MySQL таблицыJava - NULL ResultSet

public ResultSet getAddressID(String city) throws SQLException{ 
     String q = "SELECT PK_ADDRESS_ID FROM tbl_addresses WHERE city =" + "\""+ city+ "\";"; 
     ResultSet rs = executeSearch(q); 
     return rs; 
    } 

При попытке System.out.println(n.getAddressID("Sheffield")); она возвращает null. Почему это произошло, хотя в моей таблице есть данные (см. Рисунок).

enter image description here

public ResultSet executeSearch(String q){ 
    openConnection(); 
    try{ 
     Statement statement = connection.createStatement(); 
     ResultSet resultSet = statement.executeQuery(q); 
     closeConnection(); 
     return resultSet; 
    } 
    catch (Exception e){ 
     JOptionPane.showMessageDialog(null, e.getMessage()); 
    } 
    finally { 
     closeConnection(); 
     return null; 
    } 
} 
+0

Пожалуйста, добавьте метод 'executeSearch'. – Berger

+0

Обновлен метод 'executeSearch'. –

+1

Не блокировать 'finally', какими бы ни были? Не уверен, с Java, но, похоже, неправильно вернуться из блока finally. –

ответ

0

Проблема, кажется, в вашем методе executeSearch; блок finally всегда будет выполняться, поэтому, возвращая null в блоке finally, вы по существу переопределите то, что вы вернули в блок try!

Это может быть альтернативное решение; обратите внимание, что я возвращаюсь в конце метода, а не в любые части блока try-catch-finally.

/** 
* Converts a provided ResultSet into a generic List so that the 
* ResultSet can be closed while the data persists. 
* Source: http://stackoverflow.com/a/7507225/899126 
*/ 
public List convertResultSetToList(ResultSet rs) throws SQLException 
{ 
    ResultSetMetaData md = rs.getMetaData(); 
    int columns = md.getColumnCount(); 
    List list = new ArrayList(50); 

    while (rs.next()) 
    { 
     HashMap row = new HashMap(columns); 
     for(int i = 1; i <= columns; ++i) 
     { 
      row.put(md.getColumnName(i), rs.getObject(i)); 
     } 
     list.add(row); 
    } 

    return list; 
} 

public List executeSearch(String q) 
{ 
    List toReturn; 
    openConnection(); 
    try { 
     Statement statement = connection.createStatement(); 
     toReturn = this.convertResultSetToList(statement.executeQuery(q)); 
    } 
    catch (Exception e) { 
     JOptionPane.showMessageDialog(null, e.getMessage()); 
     toReturn = new ArrayList(); 
    } 
    finally { 
     closeConnection(); 
    } 

    return toReturn; 
} 
+0

Я пытаюсь извлечь первый элемент 'ResultSet' и распечатать его. Вот код 'if (rs.next()) { \t \t i = rs.getInt (1); \t}; '. Как-то я получаю эту ошибку «Исключение в потоке» main «java.sql.SQLException: операция не разрешена после закрытия ResultSet' –

+0

Ваша версия работает кстати. Но он просто возвращает одну строку 'com.mysql.jdbc.JDBC42ResultSet @ 21b8d17c' –

+0

Это связано с тем, что закрытие соединения с базой данных также закрывает связанные ResultSets. Я обновил свой ответ, чтобы включить метод, заимствованный в значительной степени из http://stackoverflow.com/a/7507225/899126; По сути, вы должны преобразовать ResultSet в список HashMaps. –