数据库二进制字段读取问题(long raw)

在项目中遇到Oracle数据库Long Raw类型的字段存储报表文件内容的问题。当增加新的关联字段后,读取Long Raw字段时出现SQLException‘流已关闭’。解决方案是保持查询与结果集获取顺序一致,或者提前获取二进制字段。此外,当使用JPA进行4k以上文件插入时遇到异常,最终采用JDBC实现文件的存储。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

项目中用到了long raw 类型字段用于存放报表文件内容,一直相安无事。有一天需要修改设计,增加了一个跟报表组关联,问题来了,读取long raw字段总是提是SQLException“流已关闭”,经过一番较量,才算解决,在此和大家分享一下。 

原来表结构:

create table reportview
(
  id number(32) not null,
  rptname varchar2(100) not null,
  xmldata long raw not null,
  primary key(id)
)

executeQuery("select * from reportview");
while(res.next())
{
  res.getLong("id");
  res.getString("rptname");
  res.getBytes("xmldata");
}

没有问题,一切正常

后来多了个关联

create table reportview
(
  id number(32) not null,
  rptname varchar2(100) not null,
  xmldata long raw not null,

groupid varchar2(100) not null


  primary key(id)
)

当执行

executeQuery("select * from reportview");
while(res.next())
{
  res.getLong("id");
  res.getString("rptname");

res.getString("groupid");
  res.getBytes("xmldata");
}

时就会抛出 java.sql.SQLException 流已关闭的错误

问题: 当然表中用到二进制字段时,要不按照select顺序和rs顺序相同来取,要不这个二进制字段要提前rs.getBytes("xmldata")

 

在继续说下插入的问题.

 本来好好的,文件大到4k的时候有出现了,插入的异常.本来只想像普通对象那样定义

public class ReportView implements Serializable{

@Id

    private Integer id;

 @Lob

   private byte[] xmldata;

}
em.persist(ReportView);

但是当文件超过4k,就不行了.想不出好的办法,只能用jdbc来实现

 

public   void  insertReportBlob(ReportTempView report)  throws  TransException  {
        
// TODO Auto-generated method stub
             Connection conn =
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值