【问题标题】:Fetching two ResultSet values empties both ResultSets even with different Statement objects即使使用不同的 Statement 对象,获取两个 ResultSet 值也会清空两个 ResultSet
【发布时间】: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 代表 rsstmt2 代表 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


【解决方案1】:

ResultSet 变量应该用于其范围内的单个查询。根据您的问题,ResultSet 变量是在类级别定义的,并以两种不同的方法searchStocksgetUsernameFromEmail 重用。为避免这种情况,请在方法范围内定义变量。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-08-07
    • 1970-01-01
    • 1970-01-01
    • 2012-07-17
    • 1970-01-01
    相关资源
    最近更新 更多