我正在学习一些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();
}
}
}
尝试以下更改:
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对象如何反映对基础数据源的并发更改
TYPE_SCROLL_INSENSITIVE:
结果可以滚动;其光标可以向前和相对于当前位置向后,它可以移动到绝对位置。结果集对对所做的更改不敏感底层数据源处于打开状态。它包含的行在执行查询时或作为检索行。
TYPE_SCROLL_SENSITIVE:
结果可以滚动;其光标可以向前和相对于当前位置向后,它可以移动到绝对位置。结果集反映了对底层数据源,而结果集保持打开状态。
有关更多详细信息,请参阅更新结果集。
您的表有PRIMARY KEY吗?
指定结果集是可更新的并不能保证您得到的结果集实际上是可更新的。没有支持可更新的结果集将返回一个只读的结果集。在里面此外,要获得可更新的结果集,查询通常必须将主键指定为选定的列之一,它应该只从一个表中选择列。