DBUnit: لم تجد عمود "MYCOL" ل '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 الخاصة بك عن طريق triming اسم المخطط قبل الاختبار المساواة)

http://dbunit.sourceforge.net/properties.html يبين كيف ليحل محل تنفيذ IMetadataHandler.

نصائح أخرى

وهذه القضية يبدو أن يحدث بعد ذلك فقط باستخدام DB2 وهي href="http://sourceforge.net/p/dbunit/bugs/258/#0156" ثابتة مع DBUnit 2.4.7 .

وكل ما عليك القيام به هو:

IDatabaseConnection connection = ...

connection.getConfig().setProperty
(
    "http://www.dbunit.org/properties/metadataHandler",
    new Db2MetadataHandler()
);
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top