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.blogjava.net/zhyiwww   
|----------------------------------------------------------------------------------------|
posted on 2010-02-04 10:30 zhyiwww 阅读(2533) 评论(0)  编辑  收藏 所属分类: j2eeoracle

只有注册用户登录后才能发表评论。


网站导航: