DBUnit: не найден столбец 'MYCOL' для <schema.table> 'MYSCHEMA .MYTABLE' в каталоге 'MYDB', поскольку имена не полностью совпадают - PullRequest
2 голосов
/ 29 июня 2009

У меня проблемы с созданием экспорта моей базы данных с использованием 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.

Есть идеи?

Ответы [ 2 ]

3 голосов
/ 21 августа 2009

Кажется, это ошибка в драйвере 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.

1 голос
/ 08 июня 2015

Эта проблема возникает только тогда, когда используется DB2, и исправлено с помощью DBUnit 2.4.7 .

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

IDatabaseConnection connection = ...

connection.getConfig().setProperty
(
    "http://www.dbunit.org/properties/metadataHandler",
    new Db2MetadataHandler()
);
...