我正在学习一些关于JDBC以及如何与数据库交互的知识。我得到了基础知识,但现在遇到了可更新结果集的问题。在这个练习中,我必须检查数据库中每种啤酒的库存,并添加50。
所以这段小代码确实有用,但不是所有的时间。我运行了好几次,大约50%的时间股票实际上涨了。检查这个我写了另一个小的while循环,打印一个包含必要数据的表。任何想法为什么它在100%的时间都不起作用?
数据库中有1071条记录,我在获得结果后立即运行了这段代码。我应该在再次运行之前等待吗?
package stockbier;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
public class bierenstock {
public static void main(String[] args) {
try (Connection con = DriverManager.getConnection(
"jdbc:mysql://noelvaes.eu/StudentDB", "student", "student123");
PreparedStatement stmt = con.prepareStatement
("select * from Beers",
ResultSet.TYPE_SCROLL_INSENSITIVE,
ResultSet.CONCUR_UPDATABLE);) {
ResultSet rs = stmt.executeQuery();
while (rs.next()) {
// edited int stock
int stock = rs.getInt("Stock") + 50;
rs.updateInt("Stock", stock);
rs.updateRow();
}
rs.close();
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
答案 0 :(得分:0)
尝试以下更改:
public static void main(String[] args) {
try (Connection con = DriverManager.getConnection(
"jdbc:mysql://noelvaes.eu/StudentDB", "student", "student123");
PreparedStatement stmt = con.prepareStatement
("select * from Beers",
ResultSet.TYPE_SCROLL_SENSITIVE,
ResultSet.CONCUR_UPDATABLE);) {
ResultSet rs = stmt.executeQuery();
while (rs.next()) {
int stock = rs.getInt("Stock") + 50;
rs.updateInt("Stock", stock);
rs.updateRow();
}
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} finally {
if (stmt != null) { stmt.close(); }
}
}
ResultSet对象的类型在两个区域中确定其功能级别:可以操作游标的方式,以及如何对ResultSet对象反映对基础数据源的并发更改。 / em>的
TYPE_SCROLL_INSENSITIVE :
结果可以滚动;它的光标可以向前和向前移动 相对于当前位置向后,它可以移动到 绝对的位置。结果集对所做的更改不敏感 它是打开时的基础数据源。它包含行 在查询执行时或作为查询时满足查询 检索行。
TYPE_SCROLL_SENSITIVE :
结果可以滚动;它的光标可以向前和向前移动 相对于当前位置向后,它可以移动到 绝对的位置。结果集反映了对此所做的更改 结果集保持打开状态时的基础数据源。
有关详细信息,请参阅Updating ResultSet。
答案 1 :(得分:0)
你的桌子有PRIMARY KEY吗?
指定结果集是可更新的并不能保证 你得到的结果集实际上是可更新的。没有的司机 支持可更新结果集将返回只读结果集。在 另外,为了获得可更新的结果集,通常必须进行查询 将主键指定为所选列之一,它应该 只从一个表中选择列。