java读取oracle的blob字段空指针错误!!!太奇怪了

faintyzxm 2002-12-02 04:25:03
java读取oracle的blob字段出错!!!
查询语句:
select id,filename,sfile from tfiles where id=1
(在数据库中执行查询,确定对应blob字段有值)

String fileName = rs.getString("filename"); //有值
--------------------------------
java.sql.Blob bb = rs.getBlob("sfile"); //bb为null
--------------------------------
oracle.sql.BLOB blob = (oracle.sql.BLOB)rs.getBlob("sfile"); //blob为null
--------------------------------
InputStream in = rs.getBinaryStream("sfile"); //in为null
--------------------------------
byte[] b = rs.getBytes("sfile"); //b为null
--------------------------------
为什么我读取blob字段出来的就为null呢?
使用(OracleResultSet)rs).getBLOB("sfile");则必须使用weblogic自带一个weblogic.*.*.OracleResultSet

对象。同样结果为null
难道是我插入的文件数据本来就为空么?
--------------------------------
附:插入blob字段代码,先插blob控制,然后update,已编译执行成功:
stmt = con.prepareStatement("update tFiles set sFile = ? where Filename = ?");
byte[] buffer = this.getBinaryFile();
stmt.setBinaryStream(1,(new ByteArrayInputStream(buffer)),buffer.length);
stmt.setString(2, fileName);
--------------------------------
buffer我调试过了,保证非空,且执行完毕后在数据库中查询blob字段显示有值:(OraBlob)
--------------------------------

请问这到底是怎么回事?
为什么我取不出来呢?

...全文
565 12 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
12 条回复
切换为时间正序
请发表友善的回复…
发表回复
faintyzxm 2002-12-05
  • 打赏
  • 举报
回复
调试过了,还是没有法子解决阿……
同样为null
不知道哪位大虾能给个保证可以执行成功的,且和fastmask方法不同的实例阿??
fastmask 2002-12-03
  • 打赏
  • 举报
回复
String result="";
BLOB bCont;
byte[] data;
Statement stament=null;
try
{
stament=conn.createStatement();//conn是Connection的对象
resultSet=stament.executeQuery("select recvdata from ComLog "+
"where SIComLogid="+id;//id是参数
while(resultSet.next())
{

//分析接收的数据
result="\n接收的数据\n----------------------------\n";
bCont = ((OracleResultSet)resultSet).getBLOB("recvdata");
if(bCont==null||bCont.length()==0)
{
result+="无数据";
}
else
{
data=bCont.getBytes(1,(int)bCont.length());//这个就是数据
result+=GetDesc(data);
}
result+="\n------------------\n";

break;
}
这是我现在用的代码,有些业务方面的东西我删掉了,程序正常运行,没有问题的.你别告诉我不行.嘿嘿
faintyzxm 2002-12-03
  • 打赏
  • 举报
回复
to 楼上们!!!
------rs.next()才是第一条记录,不然就全是null,你试着加上这句话看行不行!
看到这句没有?String fileName = rs.getString("filename"); //有值
我第一个字段都有值了,证明我肯定取的是第一条记录拉,怎么会没有rs.next呢?

-----楼主有没有提交啊,是不是在数据库中添加数据却没有提交
怎么可能,我在没有运行系统的时候,直接在数据库里面查询都可以查到数据,没看到:(在数据库中执行查询,确定对应blob字段有值)、buffer我调试过了,保证非空,且执行完毕后在数据库中查询blob字段显示有值:(OraBlob)

------呵呵,oracle的blob不是这么玩的,应该这样……
这个样子我试过了,没看到:
使用(OracleResultSet)rs).getBLOB("sfile");则必须使用weblogic自带一个weblogic.*.*.OracleResultSet
对象。同样结果为null


大家的帮忙我很感谢,但希望看清楚我说明的那些,那样就可以免掉不必要的讨论了……

我现在及其怀疑数据库本身有问题……
谁能给我个读取oracle的blob数据转换成byte[]数组的可运行并成功的实例???????????
fastmask 2002-12-03
  • 打赏
  • 举报
回复
类型肯定不错的,我的程序就这么跑的.
cypeng 2002-12-03
  • 打赏
  • 举报
回复
to fastmask:

不对吧,这样要报类型错误的。

楼主的问题可能是因为未提交
fastmask 2002-12-03
  • 打赏
  • 举报
回复
java.sql.Blob bb = rs.getBlob("sfile"); //bb为null
呵呵,oracle的blob不是这么玩的,应该这样

java.sql.Blob bb = ((OracleResultSet)rs).getBLOB("sfile");
BLOB是oracle实现了bolb的接口的类,你可以参考oracle的jdbc的文档.
他需要的包就是oracle带的classes12.jar了,和weblogic没有关系.
fastmask 2002-12-03
  • 打赏
  • 举报
回复
那你就跟踪调试一下看看那个rs到底是什么类型了,后者把rs.toString(),可以看到实际类型,然后按照类型进行转换了。然后你看看weblogic.jdbc.rmi这个的帮助文档,也许他对这个blob也有自己的实现。
faintyzxm 2002-12-03
  • 打赏
  • 举报
回复
to : fastmask(我心烦)
我使用了你这种方法,其中OracleResultSet和BLOB来自
import oracle.jdbc.OracleResultSet;
import oracle.sql.BLOB;
编译可以成功,但是,在weblogic下运行的时候,
blob = ((OracleResultSet)rs).getBLOB(columnName);
处报出错误如下:
java.lang.ClassCastException: weblogic.jdbc.rmi.SerialResultSet

应该是说rs对象为weblogic.jdbc.rmi.SerialResultSet这个类型,这样子直接造型错误。
我试过将OracleResultSet改为SerialResultSet类型,同样为null
难道是数据库连接上的问题么?我使用的是weblogic的连接池,该怎么解决呢??
elabs 2002-12-03
  • 打赏
  • 举报
回复
帮我看看这个

http://expert.csdn.net/Expert/topic/1226/1226149.xml?temp=.7509882
elabs 2002-12-03
  • 打赏
  • 举报
回复
如果用db2或者jdbc-odbc该如何写啊
study_body 2002-12-02
  • 打赏
  • 举报
回复
楼主有没有提交啊,是不是在数据库中添加数据却没有提交
newbig 2002-12-02
  • 打赏
  • 举报
回复
oracle里我不清楚,不过在DB2里面,你读出一个数据前要rs.next()一下,也就是说要从rs.next()才是第一条记录,不然就全是null,你试着加上这句话看行不行!

62,629

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧