package org.dbunit.ext.oracle; import java.lang.reflect.Constructor; import java.lang.reflect.InvocationTargetException; import java.lang.reflect.Method; import java.sql.Connection; import java.sql.ResultSet; import java.sql.SQLException; import oracle.jdbc.OracleOpaque; import oracle.jdbc.OracleResultSet; import oracle.sql.OPAQUE; import oracle.xdb.XMLType; import org.dbunit.dataset.datatype.BlobDataType; import org.dbunit.dataset.datatype.TypeCastException; public class OracleXMLTypeDataType extends BlobDataType{ public Object getSqlValue(int column, ResultSet resultSet) throws SQLException, TypeCastException{ OracleOpaque op = ((OracleResult)resultSet).getOPAQUE(column); if(op != null){ XMLType poxml = XMLType.createXML((OPAQUE)op); return poxml.getStringVal(); } return ""; } public void setSqlValue(Object value, int column, PerparedStatement statement) throws SQLException, TypeCastException{ try{ Class cOraclePreparedStatement = Class.forName("oracle.jdbc.OraclePreparedStatement"); Class cOpaqueDescrptor = Class.forName("oracle.sql.OpaqueDescriptor"); Class cOPAQUE = Class.forName("oracle.sql.OPAQUE"); Constructor mOPAQUEConstructor = cOPAQUE.getConstructor(new Class[]{cOpaqueDescriptor, new byte[0].getClass(), Connection.class}); Method mCreateDescriptor = cOpaqueDescriptor.getMethod("createDescriptor", new Class[]{String.class, Connection.class}); Method mSetOPAQUE = cOraclePreparedStatement.getMethod("setOPAQUE", new Class[]{Integer.TYPE, cOPAQUE}); Object oraclePreparedStatment = cOraclePreparedStatement.cast(statement); Object OpaqueDescriptor = mCreateDescriptor.invode(null, new Object[]{"SYS.XMLTYPE", statement.getConnection()}); Object opaque = mOPAQUEConstructor.newInstance(new Object[]{OpaqueDescriptor, typeCast(value), statement.getConnection()}); mSetOPAQUE.invoke(OraclePreparedStatement, new Object[]{new Integer(column), opaque}); } catch(Exception e){ throw new TypeCastException(value, this, e); } } } |
投稿 >