2015-01-29 2 views
1

Мне нужна помощь в рутине, которую я написал, чтобы сбросить содержимое класса (представляющего таблицу базы данных) в новую таблицу базы данных в MS Access , Мой код выглядит следующим образом:Получение java.lang.IllegalArgumentException: недопустимый размер фиксированной длины, с использованием библиотеки Jackcess

public void dumpDB() throws IOException, Exception { 
    // for each table 
    for (String tableName : this.DB.getTablesNames()) { 
     System.out.println(tableName); 
     int nColumns = 0; 
     ModelDatabaseTable table = this.DB.getTable(tableName); 

     // create a tablebuilder 
     TableBuilder DBTableBuilder = new TableBuilder(tableName); 

     // get datatypes of columns 
     Map<String, DataType> columns = table.getColumns(); 

     // for each column 
     for (String columnName : columns.keySet()) { 
      System.out.println(columnName); 

      // get its datatype 
      DataType dt = columns.get(columnName); 

      // create a column with correspondent datatype and max length and add it 
      // to the table builder 
      ColumnBuilder cb = new ColumnBuilder(columnName).setType(dt).setMaxLength(); 
      DBTableBuilder.addColumn(cb); 
      nColumns += 1; 
     } 
     // if table has columns 
     if (nColumns > 0) { 

      // save it to the actual database: Exception rises here 
      Table DBTable = DBTableBuilder.toTable(this.DBConnection); 


      // copy all table's rows 
      for (ModelDatabaseRow row : table.getRows()) { 
       List<String> values = new ArrayList<String>(); 
       for (String columnName : columns.keySet()) { 
        String columnValue = row.getColumn(columnName); 
        values.add(columnValue); 
       } 
       DBTable.addRow(values.toArray()); 
      } 
     } 
    } 
} 

Когда я пытаюсь сохранить таблицу фактической базы данных, я получаю исключение:

java.lang.IllegalArgumentException: invalid fixed length size 
at com.healthmarketscience.jackcess.ColumnBuilder.validate(ColumnBuilder.java:361) 
at com.healthmarketscience.jackcess.impl.TableCreator.validate(TableCreator.java:207) 
at com.healthmarketscience.jackcess.impl.TableCreator.createTable(TableCreator.java:130) 
at com.healthmarketscience.jackcess.impl.DatabaseImpl.createTable(DatabaseImpl.java:954) 
at com.healthmarketscience.jackcess.TableBuilder.toTable(TableBuilder.java:223) 
at modelDatabase.AccessModelDatabaseBuilder.dumpDB(AccessModelDatabaseBuilder.java:153) 
at modelDatabase.AccessModelDatabaseBuilder.main(AccessModelDatabaseBuilder.java:37) 

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

for (Column column : DBTable.getColumns()) { 
    table.addColumn(column.getName(), column.getType(), ""); 
} 

Что я делаю неправильно?

ответ

1

С Jackcess forum thread, решение обернуть вызов setMaxLength() метода:

if(dt.isVariableLength()) { 
    cb.setMaxLength(); 
} 
+1

Спасибо, что пришли обратно, чтобы обновить это. После запуска некоторого тестового кода я только что пришел к такому же выводу. –

+0

Да :) Спасибо за усилие. – gc5

+1

Основная проблема будет исправлена ​​в следующей версии Jackcess (2.0.9). Ссылка: [здесь] (http://sourceforge.net/p/jackcess/bugs/116/). После того, как это было выпущено, вышеупомянутое обходное решение больше не потребуется. –