Исключение: преобразование из 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);

Ура христианская

Другие вопросы по тегам