2013-09-22 36 views
1

我有以下代碼:ResultSet.TYPE_FORWARD_ONLY它實際上是如何工作的?

try(Connection con = DriverManager.getConnection("jdbc:mysql://localhost:3306/test","root","VENIVIDIVICI"); 
     Statement st = con.createStatement(ResultSet.TYPE_FORWARD_ONLY,ResultSet.CONCUR_READ_ONLY); 
     ResultSet rs = st.executeQuery("SELECT * FROM example184")) 
{ 
    rs.absolute(2); 
    rs.absolute(1); 
    rs.beforeFirst(); 

while (rs.next()) 
{ 
    System.out.println(rs.getString("iD")); 

} 
    while(rs.previous()) 
    { 
     System.out.println(rs.getString("Id")); 
    } 
} 
catch(SQLException sql){System.out.println(sql);} 

} 

它應該給SQLException的,因爲它是唯一ResultSet.TYPE_FORWARD_ONLY,而不是它工作正常,沒有拋出任何異常。

UPDATE:作爲Aleroot在下面的響應的建議,我已經嘗試了以下修改:

try(Connection con = DriverManager.getConnection("jdbc:mysql://localhost:3306/test","root","VENIVIDIVICI"); 
     Statement st = con.createStatement(ResultSet.TYPE_FORWARD_ONLY,ResultSet.CONCUR_READ_ONLY); 
     ResultSet rs = st.executeQuery("SELECT * FROM example184")) 
{ 

    st.setFetchSize(Integer.MIN_VALUE); 
     rs.afterLast(); 
while (rs.previous()) 
{ 
    System.out.println(rs.getString("iD")); 

} 

} 
catch(SQLException sql){System.out.println(sql);} 

} 
} 

沒有成功,但它仍然編譯和運行正常。

感謝, 事實上ITIS

回答

1

TYPE_FORWARD_ONLY意味着ResultSet中只能向前導航。您無法在ResultSet中向後移動。

在這種情況下,我認爲previous()呼叫被允許的,因爲緩存,試圖改變獲取大小:

st.setFetchSize(Integer.MIN_VALUE); 

,或者閱讀從年底開始的結果集,而不事先從開始閱讀結束(旁邊)...

要向後移動嘗試:

rs.afterLast() 
while (rs. previous()) 
{ 
    System.out.println(rs.getString("iD")); 

} 

如果在這兩種情況下的驅動程序繼續執行,而不扔SQ LException,它可能是您正在使用的驅動程序的錯誤...

+0

@我已經嘗試了它們兩個,它仍然有效,我正在使用代碼更新問題 –

+0

您正在使用哪種版本的JDBC驅動程序? – aleroot

+0

JDBC 4.1 mysql驅動程序5.1 –

相關問題