我正在尝试使用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无法处理的东西?
答案 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()以获取包装值。