gpt4 book ai didi

java - getBytes() 适用于 ResultSet 但不适用于 CachedRowSet

转载 作者:行者123 更新时间:2023-12-01 12:56:07 25 4
gpt4 key购买 nike

我有一个 Derby SQL 数据库,其中有一个表,其中包含需要包含序列化对象的 blob 字段。我通过 JDBC 访问它。问题是,当我使用 ResultSet 反序列化对象时,一切正常,但如果我使用 CachedRowSet,则会出现“数据类型不匹配”异常。

这是一段有效的代码:

ResultSet rs = stmt.executeQuery();
rs.next();
byte[] buf = rs.getBytes("albero");

这是替代方案

CachedRowSet crs = null;
ResultSet rs = stmt.executeQuery();
crs = RowSetProvider.newFactory().createCachedRowSet();
crs.populate(rs);
crs.next();
byte[] buf = crs.getBytes("albero");

有人可以帮助我理解为什么会出现这种不同的行为吗?谢谢

最佳答案

CachedRowSet(假设引用实现com.sun.rowset.CachedRowSetImpl)将数据的副本存储在ResultSet中缓存的行集。它使用提供给 populate 的结果集的 getObject 方法来执行此操作。

当您指示该列是一个 blob 时,我假设 getObject 将返回一个 Blob 并且元数据中的列类型是 BLOB而不是字节数组(类型 VARBINARYLONGVARBINARY)。因此,缓存的行集只允许您以 Blob 形式检索列,而不能以 byte[] 形式检索列,即使原始结果集支持这一点。

JDBC 4.2 规范(附录 B.6)描述了哪些类型支持哪些方法,对于 BLOB,仅 getBlob(和 getObject)将被支持。然而,与规范中的要求相反,许多驱动程序更加宽松,并且还支持 BLOBgetBytesgetBinaryStream。在这方面,CachedRowSetImpl 对 JDBC 的解释更加严格。

关于java - getBytes() 适用于 ResultSet 但不适用于 CachedRowSet,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23878099/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com