接着上一篇:可滾動的結果集;java
1)com.microsoft.sqlserver.jdbc.SQLServerException: 結果集不可更新。
sql
當concurrency設置爲:ResultSet.CONCUR_READ_ONLY(默認)時,結果集不能更新數據,不然會報 SQLServerException數據庫
示例:
併發
statement = con.prepareStatement(sql, ResultSet.TYPE_SCROLL_SENSITIVE, ResultSet.CONCUR_READ_ONLY); rs = statement.executeQuery(); rs.absolute(3);// 結果集可滾動 rs.updateString("strfeaturecode", "hwp_332"); rs.updateRow(); // 更新結果集,報錯 SQLServerException System.out.println(rs.getString("virusid")+" "+rs.getString("featurecode")+" "+rs.getString("apppackage")+" "+rs.getInt("virustype")+" ");
2)com.microsoft.sqlserver.jdbc.SQLServerException: 不支持此遊標類型/併發組合。oracle
當concurrency設置爲:ResultSet.CONCUR_UPDATABLE 時, type 必定要TYPE_SCROLL_SENSITIVE,結果集才能更新數據。可是更新並非絕對的。以下狀況須要注意:app
1)有些數據庫驅動並不支持這項操做,好比oracle,那麼這只是jdbc2.0的一廂情願而已,雖然定義接口,可是沒有對接口充分實現。因此,爲了兼容性也最好不要使用結果集更新數據。sqlserver
2)網上說若是"SELECT * FROM Tbl_VirusBaseInfo",那麼將沒法使用結果集更新,可實際上,我採用SQLServer2005的數據庫進行測試發現,不但能夠更新屬性的值,並且屬性的值是大小寫不敏感的,換句話說,你能夠以下操做更新一樣有效測試
rs.updateString("STRFeatureCode", "hello_kitty"); rs.updateRow(); System.out.println(rs.getString("uidvirusid")+" "+rs.getString("strfeaturecode"));
3)若是查詢結果集時的sql語句是關聯查詢,那麼是不能經過結果集更新數據源的,這個也是有道理的,就好像咱們不能經過複雜的視圖修改源表的數據。ui
示例:spa
statement = con.prepareStatement(sql, ResultSet.TYPE_SCROLL_SENSITIVE, ResultSet.CONCUR_UPDATABLE ); rs = statement.executeQuery(); rs.absolute(3); // 結果集可滾動 rs.updateString("strfeaturecode", "hwp_332"); rs.updateRow(); // 更新結果集 System.out.println(rs.getString("virusid")+" "+rs.getString("featurecode")+" "+rs.getString("apppackage")+" "+rs.getInt("virustype")+" ");
3)關於更新結果集相關的操做
A:只作更新,此時ResultSet的遊標指向當前行,並無移動,可是他的數據在數據庫和java中已是最新的
rs = statement.executeQuery(); rs.absolute(3); rs.updateString("strfeaturecode", "hwp_332"); rs.updateRow(); rs.getString("strfeaturecode") 爲 hwp_332
B:新增數據,首先咱們要把遊標指向能夠插入數據的那行,而後存入數據,指向插入操做。這裏須要注意,有的人說第一個操做是把遊標移動至最後一行的後面一個位置,實際上不是的,若是是這樣那API爲何還要moveToInsertRow這個方法呢?因此它與afterLast仍是有差別的。另外當咱們插入數據以後,遊標已經移動到最後一行後面的位置,因此須要moveToCurrentRow纔可能獲得剛剛的結果集。還有,結果集獲取失敗,可是整個操做並不會回滾,數據已經操做完成,保證數據的一致性。
rs.moveToInsertRow(); rs.updateString("uidvirusid", "id_6ffff7"); rs.updateString("strfeaturecode", "heddddllo_kittyd"); rs.insertRow(); rs.moveToCurrentRow();
C:刪除數據,首先使用遊標定位到刪除行的位置,而後執行刪除操做,刪除以後遊標仍是指向刪除那行,也就是當前行,此時若是還去獲取數據,那麼會報錯,由於刪除的數據沒法獲取,雖然報錯,可是整個操做並不會回滾。
rs.absolute(3); rs.deleteRow();
具體腳本請參見上一篇:可滾動的結果集。