try {
ResultSet rs = stat.executeQuery("select * from details where COURSEANDDEPT='"+username+"'");
//if (rs.next()) {
while (rs.next()) {
String logid=rs.getString(1);
char temp=' ';
ResultSet ag=stat.executeQuery("select type from login");
if (ag.next()) {
temp=ag.getString(1).charAt(0);
if (temp=='s' || temp=='S') {
String logid=ag.getString(1);
stat.executeQuery("insert into assignments values('"+logid+"','"+comments+"','P','"+userid+"','"+username+"')");
}
}
}
JOptionPane.showMessageDialog(this,"Assignment Sent To The Whole Class");
//} else {
//JOptionPane.showMessageDialog(this,"Invalid Branch");
//}
} catch (ClassNotFoundException | SQLException ex) {
Logger.getLogger(Assignments.class.getName()).log(Level.SEVERE, null, ex);
}
即使在自身包含6条记录之后,rs.next()的while循环也只在一次迭代中终止。如何纠正它?
答案 0 :(得分:2)
问题是您使用相同的语句对象来执行多个查询。成瘾问题是
您既不关闭您的陈述也不关闭您的结果集(参见示例)。
你应该使用陈述'参数(见例)。
您不应该使用select *,而是列出您想要从语句中返回的列(我不会在示例中包含此内容)。
其中一个查询("从登录中选择类型")总是以相同的方式重复,可能在查询中出现错误。否则它应该在主循环之外执行一次。
在示例中我没有管理连接但是这也应该这样做
假设您有一个名为conn
的Connection对象 PreparedStatemet stat=null;
PreparedStatement innerStat=null;
PreparedStatement insertStat=null;
try {
stat=conn.prepareStatement("select * from details where COURSEANDDEPT=?");
stat.setString(1,username);
ResultSet rs = stat.executeQuery();
//if (rs.next()) {
while (rs.next()) {
String logid=rs.getString(1);
char temp=' ';
innerStat=conn.prepareStatement("select type from login");
ResultSet ag=innerStat.executeQuery();
if (ag.next()) {
temp=ag.getString(1).charAt(0);
if (temp=='s' || temp=='S') {
String logid=ag.getString(1);
ag.close();
innerStat.close();
insertStat=conn.prepareStatement("insert into assignments values(?,?,?,?,?)");
insertStat.setString(1,logId);
insertStat.setString(2,comments);
insertStat.setString(3,"P");
insertStat.setString(4,userid);
insertStat.setString(5,username);
insertStat.executeUpdate();
insertStat.close();
}//closes if on temp
} //closes if on ag
} //closes while
rs.close();
stat.close();
JOptionPane.showMessageDialog(this,"Assignment Sent To The Whole Class");
//} else {
//JOptionPane.showMessageDialog(this,"Invalid Branch");
//}
} catch (ClassNotFoundException | SQLException ex) {
Logger.getLogger(Assignments.class.getName()).log(Level.SEVERE, null, ex);
if(insertStat!=null) insertStat.close();
if(innerStat!=null) innertStat.close();
if(stat!=null) stat.close();
}
答案 1 :(得分:0)
您的问题是每个连接一次只能处理一个SQL语句。当您执行大量其他语句时,您正试图将第一个select
语句保持打开状态。你不能在一个连接上这样做。
我建议进行两项修改以使其发挥作用。
login
表进行查询。它的结果从一次迭代到下一次迭代都不会有所不同,所以在主循环中反复重复它没有意义。details
和assignments
的查询重写为insert / select语句。它可能类似于以下内容。
"insert into assignments " +
"select logid, ,'" + comments + "','P','" + userid + "','" + username + "' "
"from details " +
"where COURSEANDDEPT='"+username+"'"
此外,您可以考虑使用PreparedStatement
编写此内容,具体取决于SQL注入攻击是否可能。