"對只轉髮結果集的無效操作: first" - 異常

鴨脖發表於2013-03-26
今天呼叫DbUtil類直接運算元據庫,取得ResultSet,想判斷其是否為空(sql中有exists判斷有無相關記錄),結果出現異常: 
Java程式碼  收藏程式碼
  1. [ERROR] 2009-03-19 11:04:44 [http-8080-1] com.utils.DbUtil.executeSql(DbUtil.java:57)  
  2. java.sql.SQLException: 對只轉髮結果集的無效操作: first  
  3. java.sql.SQLException: 對只轉髮結果集的無效操作: first  
  4.     at oracle.jdbc.driver.DatabaseError.throwSqlException(DatabaseError.java:112)  
  5.     at oracle.jdbc.driver.DatabaseError.throwSqlException(DatabaseError.java:146)  
  6.     at oracle.jdbc.driver.BaseResultSet.first(BaseResultSet.java:74)  
  7.     at com.mchange.v2.c3p0.impl.NewProxyResultSet.first(NewProxyResultSet.java:3420)  
  8.     at com.utils.DbUtil.executeSql(DbUtil.java:53)  

分析及解決: 
在Statement建立時 
Java程式碼  收藏程式碼
  1. stmt = conn.createStatement();  

使用的是預設引數(結果集型別為ResultSet.TYPE_FORWARD_ONLY),這種型別的結果集只能通過rs.next();方法逐條讀取,使用其他讀取方法時就會報錯。如果需要執行一些其他或複雜的移動結果集指標的操作就要使用其它引數。 
如,更改如下,可解決: 
Java程式碼  收藏程式碼
  1. stmt=conn.createStatement(ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_READ_ONLY);  

各引數介紹: 
引用

  1. ResultSet.TYPE_FORWARD_ONLY   (預設方式,略) 
   2. ResultSet.TYPE_SCROLL_INSENSITIVE  雙向滾動,但不及時更新,就是如果資料庫裡的資料修改過,並不在ResultSet中反應出來。 
   3. ResultSet.TYPE_SCROLL_SENSITIVE  雙向滾動,並及時跟蹤資料庫裡的更新,以便更改ResultSet中的資料。 
   4. ResultSet.CONCUR_READ_ONLY  只讀取ResultSet 
   5. ResultSet.CONCUR_UPDATABLE  用ResultSet更新資料庫 

相關文章