关于将文件用java.sql.Blob类型的blob操作写入oracle数据库中的blob!!!谁会!!!50分

wilson.sea 2004-07-13 07:36:45
怎样操作数据库的Blob字段将文件写入数据库!!!
急急急!!!请高手指教!!!
...全文
863 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
dropship 2004-07-15
  • 打赏
  • 举报
回复
up一下,希望有更明白的解答
wilson.sea 2004-07-15
  • 打赏
  • 举报
回复
我的问题是怎么将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()!!
非常感谢上面这个朋友的大力支持,花费您宝贵的休息时间,我再次表示衷心的感谢
wilson.sea 2004-07-15
  • 打赏
  • 举报
回复
我看了上面的这段英文资料!
oracle自带的jar包class12.jar里好像没有Oracle JNDI driver.
也不知道这个驱动是否支持URL的连接查询!

我就是用的就是先插入空对象,在对其更新!
可是上面的说,先将Blob序列化成字节数组,然后用Blob.setBytes()方法进行写入!!!
wilson.sea 2004-07-15
  • 打赏
  • 举报
回复
郁闷死我了,这个问题困扰了我将近两周!!!
现在终于解决了!!这个所谓类型转换异常主要是因为oracle.jdbc.driver.OracleDriver驱动不支持oracle8.17(具体版本号记不清了)及更高的版本的类型转换!
到oracle网站去下载ojdbc.jar文件用它的驱动。
便解决了类型转换异常!!!
谢谢上面的朋友的大力支持!
现在就给你们散分!!!
weimenren 2004-07-14
  • 打赏
  • 举报
回复
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
weimenren 2004-07-14
  • 打赏
  • 举报
回复
以上是转贴的一个关于大数据存储的方法

在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...)

weimenren 2004-07-14
  • 打赏
  • 举报
回复
一般来说,大对象存储是把文件存到数据库中,当然也可以内存中的超大字符串。对于象图片这样的文件当然是用二进制存储,这里有很多误区,网络上的教程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();
ecaol 2004-07-14
  • 打赏
  • 举报
回复
UP
wilson.sea 2004-07-14
  • 打赏
  • 举报
回复
上面的朋友,不行啊!他也是将java.sql.Blob强制转换成Oracle.sql.BLOB之后再写入Blob的
我需要的是不用类型强制转换而写入!!!
因为强制转换在JNDI环境下报异常!不能转换!!!!
weimenren 2004-07-13
  • 打赏
  • 举报
回复
希望下面的可以解决你的问题

http://otn.oracle.com/sample_code/tech/java/sqlj_jdbc/files/advanced/LOBSample/LOBSample.java.html

内容概要:该论文研究了一种基于粒子群优化(PSO)的STAR-RIS辅助NOMA无线通信网络优化方法。STAR-RIS作为一种新型可重构智能表面,能够同时反射和传输信号,与传统的仅能反射的RIS不同。结合NOMA技术,可以提高覆盖范围、同时服务的用户数量和频谱效率。由于STAR-RIS元素众多,获取完整信道状态信息(CSI)开销大,因此作者提出在不依赖完整CSI的情况下,联合优化功率配、基站波束成形以及STAR-RIS的传输和反射波束成形向量,以最大化总可实现速率,同时保证每个用户的最低速率要求。仿真结果表明,该方案优于STAR-RIS辅助的OMA系统。论文还提供了详细的Python代码实现,包括系统参数设置、信道模型、速率计算、目标函数、约束函数、主优化函数和结果可视化等内容,完整再现了论文的关键技术方案。 适合人群:通信工程领域的研究人员、高校教师和研究生,特别是对智能反射面技术、非正交多址接入技术和智能优化算法感兴趣的读者。 使用场景及目标:①研究和开发基于STAR-RIS的无线通信系统;②探索PSO算法在无线通信优化的应用;③评估STAR-RIS-NOMA系统相对于传统OMA系统的性能优势;④为实际通信系统设计提供理论依据和技术支持。 其他说明:该论文不仅提出了创新的技术方案,还提供了完整的代码实现,便于读者理解和复现实验结果。此外,论文还讨论了与其他优化方法(如DDPG)的对比,并析了不同工作协议(如模式切换、时间切换和能量配)的性能差异,进一步丰富了研究内容。

67,550

社区成员

发帖
与我相关
我的任务
社区描述
J2EE只是Java企业应用。我们需要一个跨J2SE/WEB/EJB的微容器,保护我们的业务核心组件(中间件),以延续它的生命力,而不是依赖J2SE/J2EE版本。
社区管理员
  • Java EE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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