首页 > 解决方案 > 数组未填充

问题描述

当我稍后查看它时,数组中应该至少有 3 个条目,但它只显示一个。我相信这是你有问题的方法,有什么建议吗?

    String[] getKidsNamebyCid(int cid) {
        String[] out = new String[20];
        try {
            String qry = "SELECT KIDSNAME FROM TBLKIDS WHERE CID = ?";//setting query command
            ps = connect.prepareStatement(qry);//preparing statement
            ps.setInt(1, cid);//setting CID
            ps.executeQuery();//running command
            int i = 0;
            while (ps.getResultSet().next()) {
                out[i] = ps.getResultSet().getString("KIDSNAME");
                i++;
            }
        } catch (SQLException se) {
            se.printStackTrace();
        } catch (Exception e) {
            e.printStackTrace();
        }
        return out;
    }

标签: javasqlarraysloopsjdbc

解决方案


您需要了解PreparedStatement实际工作原理。我强烈建议您按照教程学习如何使用它,然后按照您自己的代码的模式。

但这也都在文档中,所以让我们引用各种相关的部分。

的 javadocexecuteQuery()说:

PreparedStatement在此对象中执行 SQL 查询,并返回ResultSet查询生成的对象。

executeQuery()问题中的代码此时已经是错误的,因为它**忽略了调用的返回值。

此外,javadocgetResultSet()说:

检索当前结果作为ResultSet对象。每个结果只应调用此方法一次

问题中的代码在这一点上更加错误,因为它getResultSet()在循环中重复调用。


如果您已经阅读了您正在使用的方法的 javadoc,那么很明显有些地方是错误的。如前所述,通过教程将展示如何正确执行此操作。实际上,任何使用 JDBC 执行查询的示例的网络搜索都会显示这一点。

有关其工作原理的额外背景信息,javadocexecute()说:

执行此PreparedStatement对象中的 SQL 语句,可以是任何类型的 SQL 语句。一些准备好的语句返回多个结果;execute 方法处理这些复杂的语句以及由方法executeQueryexecuteUpdate.

execute 方法返回一个布尔值来指示第一个结果的形式。您必须调用方法getResultSetgetUpdateCount检索结果;您必须调用getMoreResults以移动到任何后续结果。

的 javadocgetMoreResults()说:

移动到此Statement对象的下一个结果,如果它是一个对象,则返回 true ResultSet,并隐式关闭ResultSet使用该方法获得的任何当前对象getResultSet

“返回多个结果”不是在谈论来自单个查询的多行,而是来自多个查询的多个结果。它通常需要执行存储过程或 SQL 代码块才能实现。


这是从执行单个SELECT语句中正确获取多行的方法:

String qry = "SELECT KIDSNAME FROM TBLKIDS WHERE CID = ?";
try (PreparedStatement ps = connect.prepareStatement(qry)) {
    ps.setInt(1, cid);//setting CID
    try (ResultSet rs = ps.executeQuery()) {
        int i = 0;
        while (rs.next()) {
            out[i] = rs.getString("KIDSNAME");
            i++;
        }
    }
}

如果有问题的SQL 代码返回了多个结果集,您可以这样做:

try (PreparedStatement ps = connect.prepareStatement(qry)) {
    // call ps.setXxx() methods here
    boolean isResultSet = ps.execute();
    while (isResultSet) {
        try (ResultSet rs = ps.getResultSet()) {
            int i = 0;
            while (rs.next()) {
                // call rs.getXxx() methods here
                i++;
            }
        }
        isResultSet = ps.getMoreResults();
    }
}

最好使用for循环编写,以将循环逻辑保持在一起:

try (PreparedStatement ps = connect.prepareStatement(qry)) {
    // call ps.setXxx() methods here
    for (boolean isResultSet = ps.execute(); isResultSet; isResultSet = ps.getMoreResults()) {
        try (ResultSet rs = ps.getResultSet()) {
            for (int i = 0; rs.next(); i++) {
                // call rs.getXxx() methods here
            }
        }
    }
}

推荐阅读