java - 使用 Jackcess 库接收 java.lang.IllegalArgumentException : invalid fixed length size,

标签 java ms-access illegalargumentexception jackcess

我编写的例程需要帮助,以便将类的内容(代表数据库表)转储到 MS Access 中的新数据库表中。我的代码如下:

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)

数据类型是在使用我正在编写的相同数据库之前保存的(我基本上是在更新数据库),使用代码:

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

我做错了什么?

最佳答案

Jackcess forum thread 中,解决方案是将调用包装到 setMaxLength() 方法:

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

关于java - 使用 Jackcess 库接收 java.lang.IllegalArgumentException : invalid fixed length size,,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28217738/

相关文章:

java - 在 java/flex 之间保持字符串常量同步的策略?

java - 正则表达式选择下划线之间的所有字符

java - 通过 ReSTLet 删除带有有效负载的请求

sql - MS Access Form - 文本框中的字符串,用于 LIKE 查询以过滤报告结果

Java:MS Access 和 JDBC 连接

Java简单数字游戏当EditText为空时应用程序崩溃

c++ - MS Access 中 NZ 函数的 ADO 等价物?

java - J2ME 中的 Choice.IMPLICIT 和 Choice.EXCLUSIVE

android - java.lang.IllegalArgumentException 错误 : provider==null

java - 注入(inject)枚举作为依赖项失败并出现 IllegalArgumentException,可能是由于代理所致