【发布时间】:2017-03-21 10:52:18
【问题描述】:
我正在尝试使用另外 2 个表来更新一个表。这是程序:
private void getTickersByNames(String fromtable, String totable) {
try {
String ticker;
con = mhjexcel.con;
sql = "SELECT * FROM APP." + totable;
Statement stmt2 = con.createStatement(ResultSet.TYPE_SCROLL_SENSITIVE, ResultSet.CONCUR_UPDATABLE);
ResultSet rs2 = stmt2.executeQuery(sql);
rs2.beforeFirst();
while (rs2.next()) {
String name = rs2.getString("name");
sql = "SELECT * FROM APP." + fromtable + " where name = '" + name + "'";
Statement stmt1 = con.createStatement(ResultSet.TYPE_SCROLL_SENSITIVE, ResultSet.CONCUR_UPDATABLE);
ResultSet rs1 = stmt1.executeQuery(sql);
rs1.first();
if (rs1.getRow() == 0) {
out("the name is not in 1st table" + name);
rs1.close();
stmt1.close();
Statement stmt3 = con.createStatement(ResultSet.TYPE_SCROLL_SENSITIVE, ResultSet.CONCUR_UPDATABLE);
fromtable = "tsetmc";
sql = "SELECT * FROM APP." + fromtable + " where name = '" + name + "'";
ResultSet rs3 = stmt3.executeQuery(sql);
rs3.first();
if (rs3.getRow() == 0) {
out("the name is not in second too");
rs3.close();
stmt3.close();
continue;
} else {
ticker = rs3.getString("ticker");
rs3.close();
stmt3.close();
out(ticker);
out(rs2.getRow());
rs2.absolute(rs2.getRow());
rs2.updateString("ticker", ticker);
rs2.updateRow();
continue;
}
} else {
ticker = rs1.getString("ticker");
rs1.close();
stmt1.close();
rs2.updateString("ticker", ticker);
rs2.updateRow();
}
}
rs2.close();
stmt2.close();
} catch (SQLException ex) {
Logger.getLogger(Frame_Ticker.class.getName()).log(Level.SEVERE, null, ex);
}
}
这是一个例外:
严重:空 java.sql.SQLException:游标状态无效 - 没有当前行。 在 org.apache.derby.client.am.SQLExceptionFactory40.getSQLException(Unknown Source)
我看了很多...语句未关闭...结果集未关闭... rs2.getRow() 返回 1 ... rs2.updateString() 有效。 .. 但是 rs2.updateRow() 不起作用 ...我不明白...也许我不应该一起使用某些结果集!?
感谢您的帮助。
编辑
我终于找到了答案,并在此页面中提供。
【问题讨论】:
-
3 个查询循环?无论你尝试做什么 - 你都做错了。
-
嗨@juergend。为什么错了?禁止使用3个查询吗?
-
@juergend - 我只是在 rs2 上制作循环!不是其他人。
-
你...不要循环查询。您检索所需的行并遍历 ResultSet。
-
对于像计时器(立即跟踪)这样的东西,更新像数据库这样昂贵的东西和像
Map这样的内存中的东西是没有意义的