【发布时间】:2016-09-03 05:57:11
【问题描述】:
我试过谷歌搜索并在 SO 上查看了这些线程:
java jdbc accessing multiple resultsets
Open two resultsets simultaneously
JDBC returning empty result set
JDBC returns an empty ResultSet (rs.isBeforeFirst() == true) although the table isn't empty
它们都无关紧要。
private void searchStocks(){
rs=stmt.executeQuery("select * from table1;"); //ResultSet rs; Statement stmt; ****LINE 1
rs2=stmt2.executeQuery("select * from table2;"); //ResultSet rs2; Statement stmt2; ****LINE 2
while (rs.next()){ //next() method returns false
while(rs2.next()){
}
}
}
如果 LINE 2 被执行,这里 rs 是空的。但是,如果注释掉第 2 行,则 rs 具有值。我正在使用两个不同的 Statement 对象,因此在 LINE 2 执行时 rs 不会关闭。 (stmt 代表 rs 和 stmt2 代表 rs2)
我对两者都使用相同的Connection 对象。我究竟做错了什么?有没有办法在不使用 SQL JOIN 的情况下做到这一点?
(这里是你需要的声明)
Connection con=DriverManager.getConnection("jdbc:mysql://localhost:3306/test","root","test");
Statement stmt=con.createStatement();
Statement stmt2=con.createStatement();
更新
我也尝试过对同一个数据库使用不同的 Connection 对象:
con=DriverManager.getConnection("jdbc:mysql://localhost:3306/test","root","test");
con2=DriverManager.getConnection("jdbc:mysql://localhost:3306/test","root","test");
stmt=con.createStatement();
stmt2=con2.createStatement();
再次没有结果。
更新 2
(回应 @sidgate 的评论)
private ResultSet rs=null;
private ResultSet rs2=null;
更新 3
(出现问题的整个方法的 mcve 版本;我在代码中使用的实际标识符名称保持不变,但在上述片段中已更改为了读者方便)
private void searchStocks(){
String query=jTextField8.getText().trim();
try {
if (query.equals("Search for stocks")||query.length()==0){
rs=stmt.executeQuery("select * from masterstocks;");
rs2=stmt2.executeQuery("select * from userstock_"+getUsernameFromEmail(loginEmail)+";");
}
else{
rs=stmt.executeQuery("select * from masterstocks where name like \"%"+query+"%\" or symbol like \"%"+query+"%\";");
rs2=stmt2.executeQuery("select * from userstock_"+getUsernameFromEmail(loginEmail)+" where name like \"%"+query+"%\" or symbol like \"%"+query+"%\";");
}
while (rs.next()){
//stuff
if (jCheckBox3.isSelected()){
rs2.beforeFirst();
while(rs2.next()){
//stuff
}
}
}
}
} catch (SQLException ex) {
ex.printStackTrace();
showSQLError();
}
}
【问题讨论】:
-
您确定这是您唯一的代码吗?一件事是缺少 RS 初始化。你能分享完整的代码吗?
-
@sidgate 完整的代码大约有 2500 行......但是请检查
rs初始化的更新 -
这些零碎的东西没有用。我确定您粘贴的代码行还有更多内容。
-
虽然我们非常感谢您没有发布大约 2500 行的“代码转储”,但我们也无法从微小的代码片段中收集有用的信息。这就是为什么您需要创建并发布说明问题的minimal reproducible example。
-
hmm.. 现在我要问你
getUsernameFromEmail里有什么。我确信结果集变量在该方法中得到重用
标签: java mysql sql jdbc resultset