简体   繁体   中英

getBytes() working with ResultSet but not CachedRowSet

I have a Derby SQL database in which I have a table containing a blob field that needs to contain a serialized object. I access it through JDBC. The problem is that when I de-serialize the object using a ResultSet all works fine, but if I use a CachedRowSet I get a "Data Type Mismatch" Exception.

Here is the bit of code that works:

ResultSet rs = stmt.executeQuery();
rs.next();
byte[] buf = rs.getBytes("albero");

Here is the alternative bit tha

CachedRowSet crs = null;
ResultSet rs = stmt.executeQuery();
crs = RowSetProvider.newFactory().createCachedRowSet();
crs.populate(rs);
crs.next();    
byte[] buf = crs.getBytes("albero"); 

Could anyone help me understand why this different behaviour? Thanks

The CachedRowSet (assuming the reference implementation com.sun.rowset.CachedRowSetImpl ) stores a copy of the data in the ResultSet within the cached rowset. It does this using the getObject method of the result set provided to populate .

As you indicate that the column is a blob, I assume that getObject will return a Blob and the column type in metadata is BLOB and not a byte array (type VARBINARY or LONGVARBINARY ). Therefor the cached rowset will only allow you to retrieve the column as a Blob , and not as a byte[] even if the original result set supports that.

The JDBC 4.2 specification (Appendix B.6) describes which methods are supported for which types, and for a BLOB , only getBlob (and getObject ) are to be supported. However contrary to requirements in the specification a lot of drivers are more lenient and also support getBytes and getBinaryStream for BLOB . In this regard, the CachedRowSetImpl is more strict in its interpretation of JDBC.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM