0

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

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

4

1 回答 1

1

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

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

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

于 2014-05-27T10:55:03.583 回答