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);
}
rs.next() 的 while 循环仅在一次迭代中终止,即使本身包含 6 条记录。如何纠正?
问题是您使用同一个语句对象来执行多个查询。成瘾问题是
-
您既不关闭语句,也不关闭结果集(请参阅示例)。
-
您应该使用语句的参数(请参阅示例)。
-
不应使用 select *,而应列出要从语句返回的列(我不会在示例中包含此列)。
-
其中一个查询("从登录中选择类型")总是以相同的方式重复,可能是查询上有错误。否则,它应该在主循环之外执行一次。
-
在示例中,我不管理连接,但也应该这样做
假设您有一个名为 conn 的连接对象
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();
}
您的问题是每个连接一次只能处理一个 SQL 语句。 您试图在执行一堆其他语句时保持第一个select
语句处于打开状态。 不能在单个连接上执行此操作。
我建议进行两项更改以使这项工作。
- 首先对
login
表执行查询。 它的结果不会因一次迭代而异,因此在主循环中一遍又一遍地重复它是没有意义的。 - 将针对
details
和assignments
的查询重写为插入/选择语句。 大概是下面这样。
.
"insert into assignments " +
"select logid, ,'" + comments + "','P','" + userid + "','" + username + "' "
"from details " +
"where COURSEANDDEPT='"+username+"'"
此外,您可以考虑使用PreparedStatement
来编写此内容,具体取决于SQL注入攻击的可能性是否很大。