获取两个ResultSet值会清空两个ResultSets,即使语句对象不同也是如此



我尝试过谷歌搜索,并在SO:上查看了这些线程

javajdbc访问多个结果集
同时打开两个结果集
JDBC返回空结果集
JDBC返回一个空的ResultSet(rs.isBeforeFirst()==true),尽管表是';t空

它们都是毫不相干的。

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为空。但是,如果注释掉LINE 2,则rs具有值。我使用两个不同的Statement对象,所以当LINE2执行时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();

更新
我还尝试过使用不同的连接对象到同一个数据库:

            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;

UPDATE 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();
    }
}

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

相关内容

  • 没有找到相关文章

最新更新