【问题标题】:Java - NULL ResultSetJava - NULL 结果集
【发布时间】:2017-03-30 23:55:06
【问题描述】:

我有一个从 MySQL 表中获取数据的函数

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。为什么即使我的表中有数据也会发生这种情况(见图)。

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;
    }
}

【问题讨论】:

  • 请添加executeSearch方法。
  • 更新了executeSearch 方法。
  • 无论如何都不要执行finally 块?不确定,使用 Java,但从 finally 块返回似乎是错误的。

标签: java mysql resultset


【解决方案1】:

问题似乎出在您的 executeSearch 方法中; finally 块将始终执行,因此通过在 finally 块中返回 null ,您实际上覆盖您在 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;
}

【讨论】:

  • 我尝试获取ResultSet 的第一个元素并将其打印出来。这是代码if (rs.next()){ i = rs.getInt(1); };。我不知何故收到此错误Exception in thread "main" java.sql.SQLException: Operation not allowed after ResultSet closed
  • 您的版本可以正常工作。但它只返回一行com.mysql.jdbc.JDBC42ResultSet@21b8d17c
  • 那是因为关闭数据库连接也会关闭相关的ResultSet。我已经更新了我的答案,包括从stackoverflow.com/a/7507225/899126 大量借用的方法;本质上,您可以将 ResultSet 转换为 HashMap 列表。
猜你喜欢
  • 1970-01-01
  • 2020-05-19
  • 1970-01-01
  • 1970-01-01
  • 2011-11-30
  • 2014-02-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多