【问题标题】:BLOB column empty after JDBC insertion插入 JDBC 后 BLOB 列为空
【发布时间】:2014-08-10 04:54:24
【问题描述】:

我有这段代码(实际上,这是它的简化版本,obv。)

private StreamAndStatement getStatement(File f, String fid, Long dex, String uid, int id)
{
  FileInputStream fis = null;
  PreparedStatement statement;
  statement = connection.prepareStatement("INSERT INTO BLOBTABLE (FID, FDEX, SFILE, UID, ID) VALUES (?, ?, ?, ?, ?)");
  statement.setString(1, fid);
  statement.setLong(2, dex);
  fis = new FileInputStream(file);
  statement.setBinaryStream(3, fis, file.length());
  statement.setString(4, uid);
  statement.setInt(5, id);

  return new StreamAndStatement(statement, fis);
}

private insertStuff()
{
  File f = new File("/home/user/thisFileExists");
  StreamAndStatement sAndStatement = getStatement(f, "XYZ", 18L, "ABC", 78);
  sAndStatement.getStatement().execute();
  sAndStatement.closeStream();
}

StreamAndStatement 与您想象的一样简单明了。

现在整个代码运行没有 Oracle 对我大喊大叫,但 blob 最终是空的......

我真的没有在两者之间的任何时候弄乱流,正如你所见,创建流的 getStatement 和语句的执行是在两行连续的,所以没有篡改......

【问题讨论】:

    标签: java oracle jdbc blob


    【解决方案1】:

    我们首先插入带有空 blob 的记录,然后进入更新模式设置其内容。据我所知,这是经典的方法。代码可以如下(DbUtil 给我们一些实用方法):

        int insertBlobGettingId(Connection con, int idUpload, InputStream streamFile) {
                int idBlob = DBUtil.getUniqueIdentifier("seq_uploaded_blob", con);
                String insertEmptyBlob = "insert into uploaded_blob (id, FILE_CONTENT) values ("+idBlob+", empty_blob())";
                DBUtil.executeSql(insertEmptyBlob, con);
    
                if(streamFile != null) {
                    String sql = "select file_content from uploaded_blob where id = "+idBlob+" FOR UPDATE ";
    
                    oracle.jdbc.OracleResultSet rs = null;
                    oracle.sql.BLOB blob = null;
                    try{
    
                        rs = (oracle.jdbc.OracleResultSet)DBUtil.openResultSet(sql, con);
                        if(rs.next()){
                            blob = rs.getBLOB("file_content");
    
                            int chunkSize = blob.getChunkSize();
                            byte[] binaryBuffer = new byte[chunkSize];
                            int bytesRead;
                            int position = 1;
    
                            while ((bytesRead = streamFile.read(binaryBuffer)) != -1) {
                                blob.putBytes(position, binaryBuffer, bytesRead);
                                position += bytesRead;
                            }
    
                        } else {
                            throw new RuntimeException("Id "+idBlob+" not found");
                        }
    
                    }catch(Exception e){
                        throw new RuntimeException(e);
    
                    }finally{
                        DBUtil.closeResultSet(rs);
                    }
                }
                return idBlob;
        }
    

    【讨论】:

      猜你喜欢
      • 2013-01-08
      • 2016-02-08
      • 1970-01-01
      • 2018-06-21
      • 2019-10-20
      • 2011-03-28
      • 2011-08-07
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多