java - 即使使用不同的 Statement 对象,获取两个 ResultSet 值也会清空两个 ResultSet

标签 java mysql sql jdbc resultset

我已经尝试使用谷歌搜索并在 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()){

            }
        }
    }

这里 rs 如果执行 LINE 2 则为空。但是,如果注释掉 LINE 2,则 rs 具有值。我使用了两个不同的 Statement 对象,因此 rs 在 LINE 2 执行时不会关闭。 (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;

更新 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 中重用。为避免这种情况,请在方法范围内定义变量。

关于java - 即使使用不同的 Statement 对象,获取两个 ResultSet 值也会清空两个 ResultSet,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37101534/

相关文章:

php - Drupal 6 中的 SQL PHP 注入(inject)攻击

Java解析文本文件到数组

java - 从 Mac OS X 上的 .app 文件夹运行 hdiutil 等外部程序

mysql - 生成案件编号

mysql - 如何比较同一个表中的两行,但列小于和大于数字

mysql - 按第二个表中的匹配项选择顺序

java - YCSB 对 mysql 数据库进行扫描操作时出错

java - 如何使用 JaCoCo 代理检查代码覆盖率?

php - 根据 <select> 输入更改 MySQL 查询以更改 Highcharts 图表

sql - 返回列的前 n 个字母