即使使用不同的 Statement 对象,获取两个 ResultSet 值也会清空两个 ResultSet
Fetching two ResultSet values empties both ResultSets even with different Statement objects
我尝试使用谷歌搜索并在 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
代表 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();
更新
我也试过对同一个数据库使用不同的连接对象:
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
(出现问题的 Entire 方法的 mcve 版本;我在代码中使用的实际标识符名称保持不变,但为了 reader)
的方便,在上面的片段中进行了更改
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 变量在 class 级别定义,并在 searchStocks
和 getUsernameFromEmail
两种不同的方法中重复使用。为避免这种情况,请在方法范围内定义变量。
我尝试使用谷歌搜索并在 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
代表 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();
更新
我也试过对同一个数据库使用不同的连接对象:
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
(出现问题的 Entire 方法的 mcve 版本;我在代码中使用的实际标识符名称保持不变,但为了 reader)
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 变量在 class 级别定义,并在 searchStocks
和 getUsernameFromEmail
两种不同的方法中重复使用。为避免这种情况,请在方法范围内定义变量。