【发布时间】:2011-07-02 03:26:11
【问题描述】:
这就是我想要做的:
- 从 oracle BLOB 中读取图像
- 调整大小
- 将调整大小的图像写回到表中(更新 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