使用executeUpdate的ResultSet出现java问题
我是编程新手,在使用带有resultSet next()方法的executeUpdate时遇到了一个问题。 它只在结果集中迭代一次,然后执行更新关闭结果集。我得到错误:结果集未打开。不允许操作“下一步”。确认自动提交已关闭。 我加了一个骗局。setAutoCommit(false)语句,但问题仍然存在。 我需要使用不同的变量值多次运行更新。 以下是我的代码:
try {
String eidQuery = "SELECT EID FROM EMPLOYEE_DATA WHERE ACTIVE = TRUE ORDER BY EID";
int nextEID;
Statement st = con.createStatement();
con.setAutoCommit(false);
rs = st.executeQuery(eidQuery);
while (rs.next()){
nextEID = rs.getInt(1);
String getDailyTotals = "SELECT DATE, SUM(TOTAL), MAX(OUT_1) FROM PUNCHES WHERE EID = " + nextEID + " AND DATE >= '" + fd + "' "
+ "AND DATE <= '" + td + "' GROUP BY DATE";
ResultSet rs2 = st.executeQuery(getDailyTotals);
while (rs2.next()){
double dailyTotal = rs2.getDouble(2);
if (dailyTotal > 8){
double dailyOT = dailyTotal-8;
String dailyDate = rs2.getDate(1).toString();
Timestamp maxTime = rs2.getTimestamp(3);
String updateOT = "UPDATE PUNCHES SET OT = " + dailyOT + " WHERE EID = " + nextEID + " AND DATE = '" + dailyDate + "' AND OUT_1 = '" + maxTime + "'";
st.executeUpdate(updateOT);
}
}
}
rs = st.executeQuery("SELECT PUNCHES.EID, EMPLOYEE_DATA.FIRST_NAME, EMPLOYEE_DATA.LAST_NAME, SUM(PUNCHES.OT) FROM PUNCHES "
+ "JOIN EMPLOYEE_DATA ON PUNCHES.EID = EMPLOYEE_DATA.EID WHERE PUNCHES.DATE >= '" + fd + "' AND PUNCHES.DATE <= '" + td + "' GROUP BY EMPLOYEE_DATA.FIRST_NAME, EMPLOYEE_DATA.LAST_NAME, PUNCHES.EID");
Reports.setModel(DbUtils.resultSetToTableModel(rs));
} catch (SQLException ex) {
Logger.getLogger(GUI.class.getName()).log(Level.SEVERE, null, ex);
JOptionPane.showMessageDialog(null, ex);
}
# 1 楼答案
根据API的语句文档,“默认情况下,每个语句对象只能同时打开一个ResultSet对象。因此,如果一个ResultSet对象的读取与另一个ResultSet对象的读取交错,则每个ResultSet对象必须由不同的语句对象生成”
如果要在同一嵌套循环中读取两个不同的ResultSet,则需要两个不同的语句
# 2 楼答案
来自java。sql。结果集javadoc:
执行更新后,先前的结果集将关闭。你需要重新编写代码来解释这一点。 https://docs.oracle.com/javase/7/docs/api/java/sql/ResultSet.html
最简单的返工方法可能是使用两条语句,一条用于查询,另一条用于更新,但正如duffymo在回答中所指出的那样,您可以做更多的事情来改进
# 3 楼答案
你对编程和(显然)Java都是新手。以下是我可以给你的一些建议:
PreparedStatement
。您不应该通过连接Strings
来创建SQL李>