日期:2014-05-17  浏览次数:20935 次

往数据库里存图片BLOB大字段出错
我在网上找的存图片的程序,但是一直报错如下:
Exception in thread "main" java.lang.UnsupportedOperationException
at sun.jdbc.odbc.JdbcOdbcResultSet.getBlob(Unknown Source)
at blob.OracelBlobTest.writeBlob(OracelBlobTest.java:90)
at blob.OracelBlobTest.main(OracelBlobTest.java:154)
这个语句有错误: blob = (BLOB)rst.getBlob(1);

求达人帮忙~~~
程序如下:

package blob;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.InputStream;
import java.io.OutputStream;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;

import oracle.sql.BLOB;
/**
 * 总结:
 * 1.JDBC的API:java.sql.Blob接口,只提供了BLOB的读取方法,没有提供写入的方法。
 * 2.ORACEL的API:oracle.sql.BLOB是一个类,它实现了java.sql.Blob接口,并且提供了向BLOB中写入数据的方法
 * 3.在向数据库中插入BLOB时,只能用ORACEL提供的API:oracel.sql.BLOB
 * 写入的步骤:1>插入一条记录,其中BLOB字段用oracle的空函数:empty_blob()代替。
 * 2>以加锁的方式读取刚插入的记录,
 * 3>利用oracle的oracle.sql.BLOB的getBinaryOutputStream()方法获取BLOB字段的输出流,向流中写入数据
 * 4>用被写入的BLOB数据,更新原记录
 * 4.在从数据库中读取BLOB时,既可以使用java.sql.Blob,也可以使用oracel.sql.BLOB
 * 读取的步骤:1>读取记录,获取BLOB字段的输入流,
 * 2>读取输入流中的数据,保存到一个地方。
 */
public class OracelBlobTest {
  private Connection conn;
  private final String DB_URL = "jdbc:odbc:oracle";
  private final String DB_DRIVER = "sun.jdbc.odbc.JdbcOdbcDriver";
  private final String DB_USER= "system";
  private final String DB_PASS= "123456";
 
  /**
  * 获取数据库连接
  */
  private void initConnection() throws Exception {
  if(conn == null || conn.isClosed()){
  Class.forName(DB_DRIVER);
  conn = DriverManager.getConnection(DB_URL, DB_USER, DB_PASS);
  conn.setAutoCommit(false);
  }
  }
 
  private void closeConnection(ResultSet rst, PreparedStatement psmt, Connection conn) throws Exception {
  if(rst != null){
  rst.close();
  }
  if(psmt != null){
  psmt.close();
  }
  if(conn != null){
  conn.close();
  }
  }
 
  public OracelBlobTest() {
  try {
  initConnection();
  } catch (Exception e) {
  e.printStackTrace();
  }
  }
 
  /**
  * 将指定文件写入到数据库中去。
  * 注意:因为JDBC中的API没有提供写入BLOB的方法,所以这里用到了oracle的API:oracle.sql.BLOB;它实现了接口:java.sql.Blob,同时提供了写入BLOB的方法。
  * 这里不能用java.sql.Blob
  */
  @SuppressWarnings("deprecation")
public void writeBlob(String file) throws Exception {
  // 1.插入一条记录,其中blob字段用空函数代替
  // 2.以加锁的方式读取该记录
  // 3.向blob字段写数据,并执行更新操作。
  // 4.提交事务,关闭资源
  // 1.
  String sql = "insert into MYTABLE (ID, PIC) values (?, empty_blob())";
  PreparedStatement psmt = conn.prepareStatement(sql);
  psmt.setString(1, "200921090149");
  psmt.executeUpdate();
 
  // 2.
  BLOB blob = null;
  OutputStream os = null;
  InputStream is = new FileInputStream(file);
  sql = "select PIC from MYTABLE where ID = ? for update";
  psmt =