Исключение: преобразование из UNKNOWN в UNKNOWN не поддерживается
Я конвертирую некоторый код jdbc из MySql в SQL Server. При попытке
query = "Update ReportSetup "
+ "set N_ID=?, "
+ "R_Default=?, "
+ "R_Name=?, "
+ "R_Module=? "
+ " where R_ID = ?";
}
PreparedStatement stmt =
(PreparedStatement) con.prepareStatement(query, Statement.RETURN_GENERATED_KEYS);
stmt.setInt(1, ri.getNodeID());
stmt.setInt(2, (ri.isDefault()) ? 1 : 0);
stmt.setString(3, ri.getName());
Object o = ri.getReportModule();
stmt.setObject(4, o);
Последнее утверждение stmt.setObject(4,o)
бросает исключение.
ri.getReportModule returns an instance of a class which implements Externalizable.
Метод writeExternal() этого класса реализован как
public final void writeExternal(final ObjectOutput objectOutput) throws IOException {
for (int i=0; i<pdV.size(); i++) {
PropertyDescriptor pd = pdV.elementAt(i);
try {
Method m = pd.getReadMethod();
Object val = pd.getReadMethod().invoke(this);
System.out.print("writing property " + i + ": " + pd.getName() + " = " + val);
objectOutput.writeObject(val);
} catch (Exception e) {
e.printStackTrace();
}
}
}
Рассматриваемый столбец базы данных определяется как varbinary(max), а не как NULL
Код хорошо работает с использованием MySql, но я не могу понять, что нужно сделать, чтобы он работал с Sql Server.
Любые предложения будут очень признательны
1 ответ
Проблема заключалась в том, что сервер sql не рад сохранить сериализацию (как это делается при реализации externalizable). .setObject() завершается ошибкой. Решением является использование setBinaryStream().
// Sql Server can't do an stmt.setObject(4,o) "Conversion from UNKNOWN to UNKNOWN not supported"
// Serialize the object to an output stream and then read it in again into the stmt.
Object o = ri.getReportModule();
ByteArrayOutputStream bos = new ByteArrayOutputStream();
ObjectOutputStream objectOutput = new ObjectOutputStream(bos);
objectOutput.writeObject(o);
objectOutput.flush();
InputStream objectInput = new ByteArrayInputStream(bos.toByteArray());
stmt.setBinaryStream(4, objectInput);
Ура христианская