Oracle10g 使用图像文件更新Oracle Blob

Oracle10g 使用图像文件更新Oracle Blob,oracle10g,blob,fileinputstream,Oracle10g,Blob,Fileinputstream,这就是我想做的: 从oracle BLOB中读取图像 调整大小 将调整大小的图像写回到表中(更新blob本身) 我的桌子看起来像这样: TECHID非空编号(12) MEDIADATA非空BLOB() 插入日期不为空 MODIFIEDDATE非空日期 第1步和第2步非常有效。步骤3的代码如下所示(这是一种PoC型加标解决方案-非最终产品): File resized=获取调整大小的图像 FileInputStream fis=新的FileInputStream(已调整大小) PreparedSt

这就是我想做的:

  • 从oracle BLOB中读取图像
  • 调整大小
  • 将调整大小的图像写回到表中(更新blob本身)
  • 我的桌子看起来像这样:

    TECHID非空编号(12)

    MEDIADATA非空BLOB()

    插入日期不为空

    MODIFIEDDATE非空日期

    第1步和第2步非常有效。步骤3的代码如下所示(这是一种PoC型加标解决方案-非最终产品):

    File resized=获取调整大小的图像 FileInputStream fis=新的FileInputStream(已调整大小) PreparedStatement p=db.connection.prepareStatement(“更新mymediadata集mediadata=?其中TECHID=142”) 如果(fis!=null) { println(“Available:${fis.Available()}”);//这可以工作-显示117K字节可用。 } p、 setBinaryStream(1,fis,调整大小?.length()?.intValue()) 尝试 { p、 executeUpdate() } 捕获(例外e) { e、 printStackTrace() } 最后 { p、 关闭() 财政司司长(财政司司长) } 当我进入步骤3时,我得到以下错误:

    SQLException:ORA-01407:无法将(“所有者”、“MEDIADATA”、“MEDIADATA”)更新为NULL

    我(在调试器中)显式检查FileInputStream(fis)是否不为null。我还检查了
    resized?.length()?.intValue()
    值是否也大于0。所以我很难看出我可能做错了什么

    技术堆栈:

    Groovy GDK 1.7 Java 1.5 甲骨文10g


    在32位Windows XP上运行。

    好的,我终于解决了这个问题。原来是一个狡猾的JDBCOracle驱动程序(显然是早期版本)导致了这些错误


    我一切换到正确的版本,错误就消失了

    这与您的问题无关,但您应该知道,
    InputStream.available()
    不会返回输入流的实际大小!它“返回可以在不阻塞的情况下读取的剩余字节数的估计值”(来自javadocs),感谢这一点,但是,我仅使用该调用以某种方式确保我的流对象不为null。它没有其他用途! File resized = get the resized image FileInputStream fis = new FileInputStream(resized) PreparedStatement p = db.connection.prepareStatement("update mymediadata set mediadata = ? where TECHID=142") if (fis != null) { println("Available: ${fis.available()}"); // this works - shows 117K bytes available. } p.setBinaryStream (1, fis, resized?.length()?.intValue()) try { p.executeUpdate() } catch (Exception e) { e.printStackTrace() } finally { p.close() fis.close() }