DBUnit:在目录'MYDB'中找不到<schema.table>'MYSCHEMA .MYTABLE'的列'MYCOL',因为名称不完全匹配</schema.table>

时间:2009-06-29 19:24:20

标签: java dbunit

我在使用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 个答案:

答案 0 :(得分:3)

这似乎是DB2驱动程序中的一个错误。

如果查看日志,架构名称中有一个备用空间。 DB2驱动程序返回此模式名称。在dbunit的最后一个源(bug 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 :(得分:1)

这个问题似乎只在使用DB2时发生,并且是fixed with DBUnit 2.4.7

您所要做的就是:

IDatabaseConnection connection = ...

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