1

我正在尝试将图像插入数据库并使用自动增量 photo_id。

我的表格列是:

PHOTO_ID  (primary key),
USERNAME  (fkey),
PICTURE,
PICTURE_TITLE,
LIKES 

我的代码是

public class UploadPhotoDao {
    public int insertPhoto(UploadPhotoBean uploadBean){
        Connection con = null;
        PreparedStatement ps = null;

        int index = 0;
        final String query = "INSERT INTO PHOTOS_DETAILS (PHOTO_ID,USERNAME,PICTURE,PICTURE_TITLE,LIKES) VALUES (PHOTO_ID_SEQUENCE.nextval,?,?,?,?)";
            try {
                con = ConnectionUtil.getConnection();
                ps = con.prepareStatement(query);


                ps.setString(1, uploadBean.getUsername());
                File file =new File(uploadBean.getPicture());
                FileInputStream fis = new FileInputStream(file);
                ps.setBinaryStream(2, fis, fis.available());
                ps.setString(3, uploadBean.getPictureTitle());
                ps.setInt(4, new Integer(0));
                index = ps.executeUpdate();

            }
            catch (SQLException e) {
                e.printStackTrace();
            } catch (FileNotFoundException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            } catch (IOException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            } 
            finally {
                    ConnectionUtil.closeQuitly(ps);
                    ConnectionUtil.closeQuitly(con);
            }
            return index;
    }
}

我收到错误:

java.sql.SQLException: ORA-01460: 请求未实现或不合理的转换
4

1 回答 1

0

InputStream.available()不返回流大小(Javadocs 中有明确记录)。

您将需要查询文件的大小,而不是输入流中的“可用字节”:

ps.setBinaryStream(2, fis, (int)file.length());

根据您的 JDBC 驱动程序的版本,您还可以使用

ps.setBinaryStream(2, fis, file.length());

setBinaryStream(int, InputStream, long)在 JDBC 4.0 中定义,因此并非由所有驱动程序版本实现。setBinaryStream(int, InputStream, int)是 JDBC 2.0(如果我没记错的话)并且应该在所有版本中都可用。

于 2013-01-07T10:45:30.563 回答