zhyiwww
          用平實的筆,記錄編程路上的點點滴滴………
          posts - 536,comments - 394,trackbacks - 0


          我在處理結果集的時候,做了一個處理,把記錄都處理成了Map的對象,而把結果集處理成了一個List對象。
          如下:
          public List<Map<String, Object>> toList() throws SQLException {

                      List<Map<String,Object>> recordsList = new ArrayList<Map<String, Object>>();
                 
                      ResultSetMetaData meta = rst.getMetaData();
                      int colCnt = meta.getColumnCount();
                     
                      while(rst.next()){
                         
                          Map<String,Object> record = new HashMap<String, Object>();
                         
                          for(int i=0;i<colCnt;i++){
                              String colName = meta.getColumnName(i+1);
                              Object colValue = rst.getObject(colName);
                              log.debug(colValue);
                              if(colValue instanceof Blob){
                                  log.debug("blob type");
                              }else{
                                  record.put(colName, colValue);
                              }
                             
                          }
                         
                          recordsList.add(record);
                      }      
                        
                      return recordsList;
                  }

          之后,就關閉了resultset ,statement ,connection。然而在我從map對象里面取得blob對象時,總是報SQLException異常。經過調試,發現在blob.getBinaryStream()時發生異常。

          無奈之下做了一個試驗。

          PreparedStatement stmt = null;
          //        ResultSet rst = null;
          //
          //        try {
          //            stmt = this.con
          //                    .prepareStatement("SELECT * FROM CCX_INFO_ARTICAL WHERE ARTICAL_ID=?");
          //            stmt.setLong(1, articalId);
          //
          //            rst = stmt.executeQuery();
          //            if(rst.next()){
          //                Blob b = rst.getBlob("ARTICAL_CONTENT");
          //                log.debug(b);
          ////                InputStream in = b.getBinaryStream();
          //               
          //               
          //               
          //               
          //                log.debug(in);
          //               
          //            }
          //
          //        } catch (SQLException e) {
          //            throw e;
          //        } finally {
          //            rst.close();
          //            if (stmt != null) {
          //                stmt.close();
          //            }
          //            if (this.con != null && this.con.getAutoCommit()) {
          //                this.con.close();
          //            }
          //        }
          //

          此段代碼可以順利的無異常的執行。由此我推測認為,主要是因為 resultset ,connection關閉引起的。這說明,在執行了查詢操作之后,
          我們雖然可以得到一個blob對象,但是實際的內容并沒有讀如內存,也就是說,并沒有讀如到blob對象中,而此blob對象也就相當于一個對數據庫中blob字段操作的一個引用,所以,此時,如果想從blob字段中讀取數據,還是需要數據庫連接的。

          而上面的封裝操作之后,數據庫連接已經中斷,所以,再讀取數據時,就發生了異常。


          下面是Blob接口的說明,也許能給我們更好的解釋.


          public interface Blob

          SQL BLOB 值在 JavaTM 編程語言中的表示形式(映射關系)。SQL BLOB 是內置類型,它將 Binary Large Object 存儲為數據庫表的某一行中的一個列值。默認情況下,驅動程序使用 SQL locator(BLOB) 實現 Blob,這意味著 Blob 對象包含一個指向 SQL BLOB 數據而不是數據本身的邏輯指針。Blob 對象在它被創建的事務處理期間有效。

          接口 ResultSetCallableStatementPreparedStatement 中的方法(如 getBlobsetBlob)允許編程人員訪問 SQL BLOB 值。Blob 接口提供某些方法來獲得 SQL BLOB (Binary Large Object) 值的長度、在客戶端實現 BLOB 值以及確定 BLOB 值中某一字節樣本的位置。此外,此接口還擁有更新 BLOB 值的方法。






          |----------------------------------------------------------------------------------------|
                                     版權聲明  版權所有 @zhyiwww
                      引用請注明來源 http://www.aygfsteel.com/zhyiwww   
          |----------------------------------------------------------------------------------------|
          posted on 2010-02-04 10:30 zhyiwww 閱讀(2548) 評論(0)  編輯  收藏 所屬分類: j2eeoracle
          主站蜘蛛池模板: 山丹县| 科技| 蒙城县| 交口县| 陕西省| 阿拉尔市| 临安市| 福州市| 万州区| 蓝山县| 驻马店市| 金坛市| 哈尔滨市| 化隆| 白玉县| 安达市| 巴彦淖尔市| 东阿县| 瓦房店市| 昂仁县| 乌兰浩特市| 普兰县| 永泰县| 稻城县| 拉萨市| 奈曼旗| 清流县| 应城市| 珠海市| 名山县| 资阳市| 怀来县| 花莲县| 台东县| 沙坪坝区| 广昌县| 舒兰市| 囊谦县| 宾阳县| 开鲁县| 临沧市|