java - 数组未填充
问题描述
当我稍后查看它时,数组中应该至少有 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;
}
解决方案
您需要了解PreparedStatement
实际工作原理。我强烈建议您按照教程学习如何使用它,然后按照您自己的代码的模式。
但这也都在文档中,所以让我们引用各种相关的部分。
的 javadocexecuteQuery()
说:
PreparedStatement
在此对象中执行 SQL 查询,并返回ResultSet
查询生成的对象。
executeQuery()
问题中的代码此时已经是错误的,因为它**忽略了调用的返回值。
此外,javadocgetResultSet()
说:
检索当前结果作为
ResultSet
对象。每个结果只应调用此方法一次。
问题中的代码在这一点上更加错误,因为它getResultSet()
在循环中重复调用。
如果您已经阅读了您正在使用的方法的 javadoc,那么很明显有些地方是错误的。如前所述,通过教程将展示如何正确执行此操作。实际上,任何使用 JDBC 执行查询的示例的网络搜索都会显示这一点。
有关其工作原理的额外背景信息,javadocexecute()
说:
执行此
PreparedStatement
对象中的 SQL 语句,可以是任何类型的 SQL 语句。一些准备好的语句返回多个结果;execute 方法处理这些复杂的语句以及由方法executeQuery
和executeUpdate
.execute 方法返回一个布尔值来指示第一个结果的形式。您必须调用方法
getResultSet
或getUpdateCount
检索结果;您必须调用getMoreResults
以移动到任何后续结果。
的 javadocgetMoreResults()
说:
移动到此
Statement
对象的下一个结果,如果它是一个对象,则返回 trueResultSet
,并隐式关闭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
}
}
}
}
推荐阅读
- reactjs - React 路由器是正确的,但不能按预期工作
- cygwin - 兼容性层与虚拟化层
- r - 数据表 lapply 和输出中的附加列
- python - 来自谷歌的 400 错误请求
- java - Vert.x:一个 ChainAuthHandler 中的多个 JWTAuthHandler
- jhipster - jHipster 显示“发生错误 :-(” 在 Internet Explorer 中打开应用程序时,但在 chrome 浏览器中工作正常
- java - 如何指定该用户是否已共享我的应用 x 次?
- lua - Kong v1.0.2 的自定义插件已启用但未安装
- python - 如何摆脱python中的嵌套循环
- c# - 使用双泛型的 C# 类:当它们都应该相同时只给出一个?