我一直在使用 JDBC 和不同类型的 ResultSet 并且有一个关于使其成为 TYPE_SCROLL_SENSITIVE 的问题(这个问题与敏感部分有关,而不是类型滚动部分)。理论上说,数据库中的变化反映在 ResultSet 中,反之亦然,但这对我来说并没有发生。
这是我尝试过的东西:
Connection conn = null;
try {
DriverManager.registerDriver(new oracle.jdbc.driver.OracleDriver());
String url = "jdbc:oracle:thin:@oracle.myCompany.com:1521:xe";
conn = DriverManager.getConnection(url, "username", "password");
Statement stmt = conn.createStatement(ResultSet.TYPE_SCROLL_SENSITIVE, ResultSet.CONCUR_UPDATABLE);
String query = "SELECT user_id, first_name, last_name FROM Users";
ResultSet rs = stmt.executeQuery(query);
while(rs.next()){
System.out.println("-----------------------------");
System.out.println(rs.getInt(1));
System.out.println(rs.getString("first_name"));
System.out.println(rs.getString("last_name"));
int id = rs.getInt(1);
rs.updateInt(1,100+id);
}
} catch (SQLException e) {
e.printStackTrace();
} finally{
conn.close();
}
当我更新 ID 并添加 100 时,更改不会显示在数据库中(如果在此下方,我添加 rs.updateRow() 那么它确实会更新数据库。但是如果我这样做也会更新数据库TYPE_SCROLL_INSENSITIVE)。
我尝试的另一件事是:
Connection conn = null;
try {
DriverManager.registerDriver(new oracle.jdbc.driver.OracleDriver());
String url = "jdbc:oracle:thin:@oracle.myCompany.com:1521:xe";
conn = DriverManager.getConnection(url, "username", "password");
Statement stmt = conn.createStatement(ResultSet.TYPE_SCROLL_SENSITIVE, ResultSet.CONCUR_UPDATABLE);
String query = "SELECT user_id, first_name, last_name FROM Users";
ResultSet rs = stmt.executeQuery(query);
String query2 = "INSERT INTO User VALUES (4, 'Joe', 'Bloggs')";
stmt.executeUpdate(query2);
while(rs.next()){
System.out.println("-----------------------------");
System.out.println(rs.getInt(1));
System.out.println(rs.getString("first_name"));
System.out.println(rs.getString("last_name"));
int id = rs.getInt(1);
rs.updateInt(1,100+id);
}
} catch (SQLException e) {
e.printStackTrace();
} finally{
conn.close();
}
但是,如果我运行这段代码,并期望新行在 resultSet 中,因为它很敏感......我在行上得到一个 NullPointerException :while(rs.next()){
那么有人可以解释一下敏感的 ResultSet 是如何工作的以及我做错了什么吗?可能举个例子?