JDBC ResultSet 可更新的結果集

接着上一篇:可滾動的結果集;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();

具體腳本請參見上一篇:可滾動的結果集。

相關文章
相關標籤/搜索