getBytes() 使用 ResultSet 但不使用 CachedRowSet
Posted
技术标签:
【中文标题】getBytes() 使用 ResultSet 但不使用 CachedRowSet【英文标题】:getBytes() working with ResultSet but not CachedRowSet 【发布时间】:2014-05-26 21:43:30 【问题描述】:我有一个 Derby SQL 数据库,其中有一个表,其中包含一个需要包含序列化对象的 blob 字段。 我通过 JDBC 访问它。 问题是,当我使用 ResultSet 反序列化对象时一切正常,但如果我使用 CachedRowSet,我会收到“数据类型不匹配”异常。
下面是一些有效的代码:
ResultSet rs = stmt.executeQuery();
rs.next();
byte[] buf = rs.getBytes("albero");
这里是替代位 tha
CachedRowSet crs = null;
ResultSet rs = stmt.executeQuery();
crs = RowSetProvider.newFactory().createCachedRowSet();
crs.populate(rs);
crs.next();
byte[] buf = crs.getBytes("albero");
谁能帮我理解为什么会出现这种不同的行为? 谢谢
【问题讨论】:
crs.nextPage()
在crs.next()
之前?
【参考方案1】:
CachedRowSet
(假设参考实现com.sun.rowset.CachedRowSetImpl
)将数据的副本存储在缓存行集中的ResultSet
中。它使用提供给populate
的结果集的getObject
方法来执行此操作。
当您指出该列是一个 blob 时,我假设 getObject
将返回一个 Blob
并且元数据中的列类型是 BLOB
而不是字节数组(类型 VARBINARY
或 LONGVARBINARY
) .因此,缓存的行集只允许您以Blob
检索列,而不是byte[]
,即使原始结果集支持。
JDBC 4.2 规范(附录 B.6)描述了哪些类型支持哪些方法,对于 BLOB
,仅支持 getBlob
(和 getObject
)。然而,与规范中的要求相反,许多驱动程序更加宽松,并且还支持getBytes
和getBinaryStream
for BLOB
。对此,CachedRowSetImpl
对JDBC的解释更为严格。
【讨论】:
非常感谢您的详细回复。我已经使用 getBlob().getBytes() 解决了以上是关于getBytes() 使用 ResultSet 但不使用 CachedRowSet的主要内容,如果未能解决你的问题,请参考以下文章
ResultSet 不为空,但 resultset.next() 返回 false