怎样操作数据库的Blob字段将文件写入数据库!!!

怎样操作数据库的Blob字段将文件写入数据库!!! 急急急!!!请高手指教!!!
回复人: weimenren(愚人码头) ( 一星(中级)) 信誉:152 2004-7-13 20:23:07 得分: 45
 
希望下面的可以解决你的问题 http://otn.oracle.com/sample_code/tech/java/sqlj_jdbc/files/advanced/LOBSample/LOBSample.java.html
Top
回复人: Billzxh() ( 一级(初级)) 信誉:100 2004-7-14 9:30:45 得分: 0
 
上面的朋友,不行啊!他也是将java.sql.Blob强制转换成Oracle.sql.BLOB之后再写入Blob的 我需要的是不用类型强制转换而写入!!! 因为强制转换在JNDI环境下报异常!不能转换!!!!
Top
回复人: ecaol(孤单北半球) ( 一星(中级)) 信誉:97 2004-7-14 10:06:19 得分: 5
 
UP
Top
回复人: weimenren(愚人码头) ( 一星(中级)) 信誉:152 2004-7-14 22:41:19 得分: 0
 
一般来说,大对象存储是把文件存到数据库中,当然也可以内存中的超大字符串。对于象图片这样的文件当然是用二进制存储,这里有很多误区,网络上的教程99%都是行不通的,连SUN自己的文档都一直错误,虽然错误很小。按说二进制文件应该存为BLOB类型,但JBDC2并不能直接对BLOB存入二进制文件,如果你这样做,会得到一个IO而不是SQL异常,为此花了我近两个小时才弄清楚。   如果要把一个二制文件存入ORACLE,用标准的JDBC你就要用LONG ROW类型: create table tb_file(name varchar(20),detail long row);   然后 File file = new File("aaa.gif"); int fileLength =(int) file.length(); InputStream fin = new FileInputStream(file); PreparedStatement pstmt = con.prepareStatement("insert into tb_file values('aaa.gif',?)"); pstmt.setBinaryStream (1, fin, fileLength); pstmt.executeUpdate();   如果你一定要用BLOB存储,你就必须用ORACLE自己的方法: create table tb_file(name varchar(20),detail BLOB); con.setAutoCommit(false); stmt.executeUpdate("insert into tb_file values('aaa.gif',empty_blob())");   下面必须SELECT得到BLOB的对象再向里写: rs = stmt.executeQuery("select detail from tb_file where name='aaa.gif' for upfdate" ); if(rs.next()) { Blob blob = rs.getBlob(1); BinaryOutputStream out = ((oracle.sql.BLOB)blob).getBinaryOutputStream(); byte[] b = new byte[((oracle.sql.BLOB)blob).getBufferSize]; InputStream fin = new FileInputStream(file); int len = 0; while( (len = fin.read(b)) != -1) out.write(b,0,len); fin.close(); out.close(); con.commit(); }   同样读取数据你并不能象LONG ROW那样 InputStream in = rs.getBinaryInputStream("detail");   而要 Blob blob = rs.getBlob("detail"); in = blob.getBinaryStream();
Top
回复人: weimenren(愚人码头) ( 一星(中级)) 信誉:152 2004-7-14 22:54:31 得分: 0
 
以上是转贴的一个关于大数据存储的方法 在Oracle中 假定有一张表 lob_table(blob_col Blob, clob_col clob) 假定你创建了Statement Object, stmt // Select LOB locator into standard result set. ResultSet rs = stmt.executeQuery ("SELECT blob_col, clob_col FROM lob_table"); while (rs.next()) { // Get LOB locators into Java wrapper classes. java.sql.Blob blob = (java.sql.Blob)rs.getObject(1); java.sql.Clob clob = (java.sql.Clob)rs.getObject(2); (...process...) } 输出强制转换为java.sql.Blob 和 java.sql.Clob, 你接下来可以强制转换成oracle.sql.BLOB 和 CLOB,以便利用 oracle.sql.* 中class的扩展功能,你可以这样转换 // Get LOB locators into Java wrapper classes. oracle.sql.BLOB blob = (BLOB)rs.getObject(1); oracle.sql.CLOB clob = (CLOB)rs.getObject(2); (...process...)
Top
回复人: weimenren(愚人码头) ( 一星(中级)) 信誉:152 2004-7-14 23:10:35 得分: 0
 
You can use a BLOB column to serialize an object into a database. There is a problem serializing object > 4K into the db, but you can get round that in Oracle. You have to use the Oracle JNDI driver, and use class oracle.sql.BLOB. First INSERT the a new row using the EMPTY_BLOB() function e.g. INSERT INTO blob_table VALUES ( ..., EMPTY_BLOB(), ..) Then do a SELECT for the BLOB column on that row. Use the ResultSet.getBlob() function to get an oracle.sql.BLOB object, serialze the object to a byte array, use the BLOB.setBytes() function so set the contents of the BLOB. Then you can UPDATE the previously created row, with your BLOB containing the serialized object Hope this file can answer your question
Top
回复人: Billzxh() ( 一级(初级)) 信誉:100 2004-7-15 10:34:35 得分: 0
 
我看了上面的这段英文资料! oracle自带的jar包class12.jar里好像没有Oracle JNDI driver. 也不知道这个驱动是否支持URL的连接查询! 我就是用的就是先插入空对象,在对其更新! 可是上面的说,先将Blob序列化成字节数组,然后用Blob.setBytes()方法进行写入!!!
Top
回复人: Billzxh() ( 一级(初级)) 信誉:100 2004-7-15 10:34:56 得分: 0
 
我的问题是怎么将Blob类型的对象序列化,还有setBytes()有两个方法一个是: public int setBytes(long pos,byte[] bytes,int offset,int len)另一个是: public int setBytes(long pos,byte[] bytes) 我没序列化对象,在调用这两个方法时出现异常: java.sql.SQLException: 不支持的特性 at oracle.jdbc.dbaccess.DBError.throwSqlException(DBError.java:134) at oracle.jdbc.dbaccess.DBError.throwSqlException(DBError.java:179) at oracle.jdbc.dbaccess.DBError.throwSqlException(DBError.java:269) at oracle.jdbc.dbaccess.DBError.throwUnsupportedFeatureSqlException(DBError.java:689) at oracle.sql.BLOB.setBytes(BLOB.java:954) 能否告诉我怎么序列化Blob对象成字节数组和使用setBytes()!! 非常感谢上面这个朋友的大力支持,花费您宝贵的休息时间,我再次表示衷心的感谢
Top
回复人: dropship(飞翔) ( 两星(中级)) 信誉:115 2004-7-15 12:36:18 得分: 0
 
up一下,希望有更明白的解答
Top
回复人: Billzxh() ( 一级(初级)) 信誉:100 2004-7-15 18:08:33 得分: 0
 
郁闷死我了,这个问题困扰了我将近两周!!! 现在终于解决了!!这个所谓类型转换异常主要是因为oracle.jdbc.driver.OracleDriver驱动不支持oracle8.17(具体版本号记不清了)及更高的版本的类型转换! 到oracle网站去下载ojdbc.jar文件用它的驱动。 便解决了类型转换异常!!! 谢谢上面的朋友的大力支持! 现在就给你们散分!!!
Top
 

转载于:https://www.cnblogs.com/xnxqs/archive/2005/07/14/192957.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值