ДБУнит:Не найден столбец «MYCOL» для <schema.table> «MYSCHEMA.MYTABLE» в каталоге «MYDB», поскольку имена не совсем совпадают.

StackOverflow https://stackoverflow.com/questions/1060027

  •  21-08-2019
  •  | 
  •  

Вопрос

У меня возникли проблемы с экспортом моей базы данных с помощью org.dbunit.database.QueryDataSet.Когда я вызываю org.dbunit.dataset.xml.FlatXmlDataSet.write(IDataSet, OutputStream), я получаю следующую трассировку стека:

java.lang.IllegalStateException: Did not find column 'MYCOL' for <schema.table> 'MYSCHEMA  .MYTABLE' in catalog 'MYDB' because names do not exactly match.
    at org.dbunit.database.ResultSetTableMetaData.scrollTo(ResultSetTableMetaData.java:297)
    at org.dbunit.database.ResultSetTableMetaData.createColumnFromDbMetaData(ResultSetTableMetaData.java:262)
    at org.dbunit.database.ResultSetTableMetaData.createMetaData(ResultSetTableMetaData.java:154)
    at org.dbunit.database.ResultSetTableMetaData.createMetaData(ResultSetTableMetaData.java:131)
    at org.dbunit.database.ResultSetTableMetaData.<init>(ResultSetTableMetaData.java:97)
    at org.dbunit.database.AbstractResultSetTable.<init>(AbstractResultSetTable.java:84)
    at org.dbunit.database.AbstractResultSetTable.<init>(AbstractResultSetTable.java:63)
    at org.dbunit.database.ForwardOnlyResultSetTable.<init>(ForwardOnlyResultSetTable.java:65)
    at org.dbunit.database.CachedResultSetTableFactory.createTable(CachedResultSetTableFactory.java:52)
    at org.dbunit.database.AbstractDatabaseConnection.createQueryTable(AbstractDatabaseConnection.java:90)
    at org.dbunit.database.AbstractDatabaseConnection.createTable(AbstractDatabaseConnection.java:115)
    at org.dbunit.database.QueryTableIterator.getTable(QueryTableIterator.java:143)
    at org.dbunit.dataset.stream.DataSetProducerAdapter.produce(DataSetProducerAdapter.java:83)
    at org.dbunit.dataset.xml.FlatXmlWriter.write(FlatXmlWriter.java:124)
    at org.dbunit.dataset.xml.FlatXmlDataSet.write(FlatXmlDataSet.java:341)

Исследуя это, я увидел, что эта проблема возникла у кого-то еще в феврале, и исправил ее с помощью сборки моментального снимка 2.4.4.Я использую обычную сборку версии 2.4.4.

Есть идеи?

Это было полезно?

Решение

Похоже, это ошибка в драйвере DB2.

Если вы посмотрите свой журнал, у вас есть свободное место в имени схемы.Это имя схемы возвращается драйвером DB2.Исправление, реализованное для этой конкретной ошибки в последнем исходном коде dbunit (ошибка 2838922).

Как упоминалось в ошибке 2838922, это может не решить проблему полностью.

В этом случае обходным путем оставшейся проблемы является реализация собственного IMetadataHandler, взяв в качестве примера стандартный по умолчанию и изменив метод «соответствия» следующим образом:

    ...
    boolean areEqual =
            areEqualIgnoreBothNull(catalog, catalogName, caseSensitive) &&
            areEqualIgnoreNull(schema, schemaName, caseSensitive) &&
            areEqualIgnoreNull(table, tableName, caseSensitive) &&
            areEqualIgnoreNull(column, columnName, caseSensitive);

    return areEqual;


    private boolean areEqualIgnoreBothNull(String value1, String value2,
                                       boolean caseSensitive) {
            boolean areEqual = true;
            if (value1 != null && value2 != null) {
                if (value1.equals("") && value2.equals("")) {
                    if (caseSensitive) {
                        areEqual = value1.equals(value2);
                    } else {
                        areEqual = value1.equalsIgnoreCase(value2);
                    }
                }
            }
            return areEqual;
        }

(вы также можете решить первую проблему с именем схемы в своем собственном IMetadataHandler, обрезав имя схемы перед проверкой равенства)

Страница http://dbunit.sourceforge.net/properties.html показывает, как заменить реализацию IMetadataHandler.

Другие советы

Кажется, эта проблема возникает только при использовании DB2 и исправлено с помощью DBUnit 2.4.7.

Все, что вам нужно сделать, это:

IDatabaseConnection connection = ...

connection.getConfig().setProperty
(
    "http://www.dbunit.org/properties/metadataHandler",
    new Db2MetadataHandler()
);
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top