2013-10-29 73 views
3

我一直在玩JDBC和不同類型的ResultSet,並有一個關於使它TYPE_SCROLL_SENSITIVE(這個問題是關於敏感部分,而不是類型滾動部分)的問題。該理論認爲數據庫中的更改反映在ResultSet中,反之亦然,但這並不適用於我。JDBC ResultSet Type_Scroll_Sensitive

這裏是我已經試過:

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(); 
} 

但是,如果我運行此代碼,並期待新行要在結果,因爲它是敏感......我上線一個NullPointerException:while(rs.next()){

那麼有人可以解釋一下敏感的ResultSet是如何工作的以及我做錯了什麼?可能有一個例子嗎?

回答

3

TYPE_SCROLL_SENSITIVE表示如果您在迭代其數據時發生表的更改,則會看到它。要重現此問題作出

System.out.println("-----------------------------"); 

改變使用外部工具FIRST_NAME休息,然後執行此行

System.out.println(rs.getString("first_name")); 

的變化應該是可見的。

請注意,此功能是可選的。爲了測試它是否能運行此

boolean res = conn.getMetaData().ownDeletesAreVisible(ResultSet.TYPE_SCROLL_SENSITIVE); 
System.out.println(res); 
1

所有更新到現場像你updateInt確實需要的updateRow調用生效。這與滾動類型無關。根據具體的數據庫,你甚至可以更新ResultSet這是TYPE_FORWARD_ONLY(如果支持,這是最快的選擇)。唯一的限制是,它們必須是CONCUR_UPDATABLE

您的第二個代碼的錯誤是使用相同的語句進行更新,而不是您用來獲取ResultSet。因此,執行更新時,ResultSet將無效。你必須爲此使用兩個語句。

變化

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); // you use stmt here 

String query2 = "INSERT INTO User VALUES (4, 'Joe', 'Bloggs')"; 
stmt.executeUpdate(query2); // here you use stmt again 

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); 

Statement stmt2 = conn.createStatement();// new statement for the insertion 
String query2 = "INSERT INTO User VALUES (4, 'Joe', 'Bloggs')"; 
stmt2.executeUpdate(query2); 
0

而從ResultSet對象迭代數據,首先看到的變化,你需要停止程序執行了一段時間了,您可以使用System.in。 read()之後,你可以去數據庫更改表數據,並進入程序查看結果集中更新的行,使用resultset對象上的refreshrow()。 您可以使用refreshrow()方法將更新後的行數據從數據庫獲取到結果集。

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); // you use stmt here 

    while(rs.next()){ 
    System.out.println("-----------------------------"); 
     System.in.read(); 
    System.out.println(rs.getInt(1)); 

    rs.refreshRow(); 
    System.out.println(rs.getString("first_name")); 
    System.out.println(rs.getString("last_name")); 
     }