1

我正在使用 Java 和 MySQL 开发一个 Web 应用程序。

我创建了一个方法,该方法应该根据数据库中的各种表返回相应列名的 ArrayList。

但是,当我调试该方法时,我意识到while(rs.next())原因是错误的。我使用这个网站作为参考,因此我不确定出了什么问题。

这是代码。谢谢。

// Returns the the all the columns in the table
public ArrayList getColumnName(String tableName) throws SQLException {
    ResultSet rs = null;
    List<String> columnName = new ArrayList<String>();

    Statement st = null;
    Connection con = null;

    try {
        // Get a connection from the connection factory
        con = DriverManager.getConnection("jdbc:mysql://localhost:3306/information_schema", "root", "xxxx");

        // Create a Statement object so we can submit SQL statements to the driver
        st = con.createStatement();

        StringBuilder sql = new StringBuilder("SELECT column_name FROM information_schema.columns " +
                "WHERE table_schema = 'testDB' AND table_name = '");

        sql.append(tableName).append("'");

        rs = st.executeQuery(sql.toString());

        while (rs.next()) { // getting error..
            columnName.add(rs.getString("column_name"));
        }

    } catch (SQLException ex) {
        Logger.getLogger(ModificationPage.class.getName()).log(Level.SEVERE, null, ex);
    } finally {
        if (con != null || st != null) {
            st.close();
            con.close();
        }
    }

    return (ArrayList) columnName;
}
4

2 回答 2

2

根据1.6 的 Javadoc(不确定您使用的是哪个版本的 Java):

抛出:SQLException - 如果发生数据库访问错误或在关闭的结果集上调用此方法

如果你真的到了调用 rs.next() 的那一行,那么就发生数据库错误是非常非常不可能的。因此,最可能的结果是结果集已关闭。

请将您的代码更改为以下内容,看看您是否仍然在同一行收到错误:

while (!rs.isClosed() && rs.next()) { // getting error..
        columnName.add(rs.getString("column_name"));
}

还有,神圣的 SQL 注入攻击,蝙蝠侠!

获取原始字符串并将其括在单引号中会导致此代码存在 SQL 注入漏洞。基本上,恶意用户所要做的就是用单引号 (') 结束您的查询,然后运行他们自己的查询。

于 2013-07-04T03:47:56.310 回答
1

那么,异常永远不会发生?

如果是这种情况,应该抛出一个查询错误rs = st.executeQuery(sql.toString()),但如果它成功了while并且没有迭代,那是因为一个空的结果集

也许您向查询传递了错误的参数?

于 2013-07-04T03:36:19.567 回答