2

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

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,值:org.hsqldb.types.JavaObjectData 的实例

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

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

4

1 回答 1

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() 来获取包装的值。

于 2014-08-19T02:01:13.633 回答