getBytes()使用ResultSet但不使用CachedRowSet

时间:2014-05-26 21:43:30

标签: java sql jdbc resultset cachedrowset

我有一个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"); 

有谁能帮助我理解为什么这种不同的行为? 感谢

1 个答案:

答案 0 :(得分:1)

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

当您指示该列是blob时,我假设getObject将返回Blob并且元数据中的列类型为BLOB而不是字节数组(类型{{ 1}}或VARBINARY)。因此,缓存的行集只允许您将列检索为LONGVARBINARY,而不是Blob,即使原始结果集支持该列。

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