DBUnit的:没有为“MYSCHEMA .MYTABLE”在目录“MYDB”找到列“MYCOL”,因为名称不完全匹配

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