我有一个Derby数据库,其中有一个表,其中包含需要包含序列化对象的blob字段。我通过JDBC访问它。问题是,当我使用ResultSet反序列化对象时,一切正常,但是如果我使用CachedRowSet,就会得到“DataType失配”异常。
下面是可以工作的代码:
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"); 有人能帮我理解一下为什么会有这种不同的行为吗?谢谢
发布于 2014-05-27 10:55:03
CachedRowSet (假设引用实现com.sun.rowset.CachedRowSetImpl)将数据副本存储在缓存行集中的ResultSet中。它使用提供给populate的结果集的getObject方法来实现这一点。
当您指出该列是blob时,我假设getObject将返回一个Blob,元数据中的列类型是BLOB,而不是字节数组(输入VARBINARY或LONGVARBINARY)。因此,缓存的行集只允许以Blob的形式检索列,而不允许以byte[]的形式检索列,即使原始结果集支持这一点。
JDBC4.2规范(附录B.6)描述了支持哪种类型的方法,对于BLOB,只支持getBlob (和getObject)。然而,与规范中的要求相反,许多驱动程序比较宽松,并且支持getBytes和getBinaryStream的BLOB。在这方面,CachedRowSetImpl对JDBC的解释更加严格。
https://stackoverflow.com/questions/23878099
复制相似问题