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 而不是字节数组(类型 VARBINARYLONGVARBINARY) .因此,缓存的行集只允许您以Blob 检索列,而不是byte[],即使原始结果集支持。

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

【讨论】:

非常感谢您的详细回复。我已经使用 getBlob().getBytes() 解决了

以上是关于getBytes() 使用 ResultSet 但不使用 CachedRowSet的主要内容,如果未能解决你的问题,请参考以下文章

ResultSet 不为空,但 resultset.next() 返回 false

Java ResultSet 为空,但实际上它不应该是

Java 和 SQLite:抛出 ResultSet 已关闭但仍在继续

ResultSet 为空,尽管 sql 查询正常但事件

review11

java String.getBytes()编码问题——String.getBytes(charset)