UCanAccess中多值字段的解决方法:“转换中的数据类型不兼容:来自SQL类型OTHER”?

时间:2014-08-18 22:38:18

标签: java ms-access jdbc hsqldb ucanaccess

我正在尝试使用UCanAccess来查询MS Access .accdb文件。一切都很好,除非我查询多值字段。例如,在MS Access的设计视图中的表字段的“查找”选项卡的“行来源”中具有条目的那些条目。当我尝试输出结果时,我的代码崩溃了:

ResultSet rslt = stmt.executeQuery("SELECT [singleValue], [multiValue] FROM [TableName];");
int count = 0;
while (rslt.next())
    System.out.println(count++ + "\t" + rslt.getString(1) + "\t" + rslt.getString(2));

ResultSet返回正常,singleValue打印正常,但如果我尝试从ResultSet打印multiValue,则抛出以下错误:

线程“main”中的异常net.ucanaccess.jdbc.UcanaccessSQLException:转换中不兼容的数据类型:从SQL类型OTHER到java.lang.String,value:org.hsqldb.types.JavaObjectData的实例

我尝试查询存储在.accdb中的查询,但这不起作用,因为它只是触发原始查询,并返回相同的ResultSet。

我错过了一些简单的东西,还是UCanAccess无法处理的东西?

1 个答案:

答案 0 :(得分:1)

这是我见过的关于它的第一个问题。 您可以在ucanaccess网站上找到UCanAccess复杂类型用法的示例,选项卡"入门" (在页面的末尾)。 这是一个junit测试用例: https://sourceforge.net/p/ucanaccess/code/HEAD/tree/ucanaccess/trunk/src/test/java/net/ucanaccess/test/ComplexTest.java (参见testComplex方法)。

特别是您无法呼叫rslt.getString(2),但必须使用rslt.getObject(2)。 您将获得数据的ucanaccess包装。 如果您想获取描述可以使用的数据内容的字符串 rslt.getObject(2).toString()。 包装类是:

net.ucanaccess.complex.Attachment,
net.ucanaccess.complex.SingleValue,
net.ucanaccess.complex.Version.

在您的示例中,rslt.getObject(2)应返回net.ucanaccess.complex.SingleValue的数组。 然后,您可以在每个数组元素上调用方法singleValue.getValue()以获取包装值。