2

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 が処理できないものですか?

4

1 に答える 1

1

これは私が今まで見た最初の質問です。ucanaccess の Web サイトの [Getting Started] タブ (ページの最後) で、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 に答える