我正在尝试使用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,则会引发以下错误:
线程“主”中的异常net.ucanaccess.jdbc.UcanaccessSQLException:转换中的数据类型不兼容:从SQL类型OTHER到java.lang.String,值:org.hsqldb.types.JavaObjectData的实例
我尝试查询的查询是存储在.accdb中,但这不起作用,因为它只会触发原始查询,并返回相同的ResultSet。
我是否缺少一些简单的东西,还是UCanAccess无法处理的事情?
这是我所见过的第一个问题。您可以在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()。包装类是:
rslt.getString(2)
rslt.getObject(2)
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()以获取包装的值。
net.ucanaccess.complex.SingleValue