【问题标题】:Updating Oracle BLOBs with image files使用图像文件更新 Oracle BLOB
【发布时间】:2011-07-02 03:26:11
【问题描述】:

这就是我想要做的:

  1. 从 oracle BLOB 中读取图像
  2. 调整大小
  3. 将调整大小的图像写回到表中(更新 blob 本身)。

我的桌子是这样的:

TECHID NOT NULL NUMBER(12)

MEDIADATA NOT NULL BLOB()

INSERTEDDATE 非空日期

修改日期不是空日期

第 1 步和第 2 步完美运行。第 3 步的代码如下(这是 PoC 类型的尖峰解决方案 - 不是最终生产):

调整大小的文件 = 获取调整大小的图像 FileInputStream fis = new FileInputStream(resized) PreparedStatement p = db.connection.prepareStatement("update mymediadata set mediadata = ? where TECHID=142") 如果 (fis != null) { println("可用:${fis.available()}"); // 这有效 - 显示 117K 字节可用。 } p.setBinaryStream (1, fis, resized?.length()?.intValue()) 尝试 { p.executeUpdate() } 捕获(异常 e) { e.printStackTrace() } 最后 { p.close() fis.close() }

当我进入第 3 步时,我收到以下错误:

SQLException: ORA-01407: 无法将 ("OWNER"."MEDIADATA"."MEDIADATA") 更新为 NULL

我明确检查(在调试器中)FileInputStream (fis) 不为空。我还检查了resized?.length()?.intValue() 的值是否也 > 0。所以我很难知道我可能做错了什么。

技术栈:

Groovy GDK 1.7 Java 1.5 甲骨文10g

在 32 位 Windows XP 上运行。

【问题讨论】:

  • 这与您的问题无关,但您应该知道InputStream.available() 确实返回输入流的实际大小!它“返回一个估计可以读取的剩余字节数......而不阻塞”(来自javadocs)
  • 谢谢你,但是,我只使用该调用以某种方式确保我的流对象不为空。它没有其他用途!

标签: oracle10g blob fileinputstream


【解决方案1】:

好的,我终于设法解决了这个问题。事实证明是一个狡猾的 JDBC oracle 驱动程序(显然是早期版本)导致了错误。

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

【讨论】:

    猜你喜欢
    • 2020-12-14
    • 2019-06-08
    • 2018-10-05
    • 1970-01-01
    • 2016-04-19
    • 2013-12-04
    • 2020-01-14
    • 2017-06-10
    • 2018-10-29
    相关资源
    最近更新 更多