1

Jackcess 2.1.5 を使用して、colA と colB に複数列のインデックスを持つ Access 2003 テーブルからデータを読み取ります。これは、colAcolB の値が与えられた場合に正常に機能します。

現在、理論的には、そのようなインデックスを使用して、 colA onlyの値に一致するすべての行を取得できます。しかし、Jackcess でこれを行うにはどうすればよいでしょうか。newEntryIterableまたはを使用して動作させることができませんEntryIterableBuilder

Table table = access.getTable("tbl");
Index index = table.getIndex("index"); //index spanning two columns
IndexCursor cursor = CursorBuilder.createCursor(index);
for (Row row : cursor.newEntryIterable(val)) { //error: missing argument
for (Row row : cursor.newEntryIterable(val, null)) { //returns rows where colB == null
    //some code
}

現在、colA のみをカバーする別のインデックスがあります。これが唯一の解決策ですか?

4

2 に答える 2

1

私はちょうど次のことを試してみましたが、うまくいきました。「People」という名前のテーブルの場合

ID  FirstName  LastName
--  ---------  --------
 1  Gord       Thompson
 2  Jimmy      Hoffa   
 3  Jimmy      Buffett 
 4  Bob        Loblaw  

上の「FirstLast」という名前のインデックスを使用して(FirstName, LastName)、コード

Table tbl = db.getTable("People");
IndexCursor cur = CursorBuilder.createCursor(tbl.getIndex("FirstLast"));
Map<String, String> criteria = Collections.singletonMap("FirstName", "Jimmy");
boolean found = cur.findFirstRow(criteria);
if (found) {
    boolean nextRowExists = true;
    do {
        Row r = cur.getCurrentRow();
        System.out.println(r.getString("LastName"));
        nextRowExists = cur.moveToNextRow();
    } while (nextRowExists && cur.currentRowMatches(criteria));
} else {
    System.out.println("(No matches found.)");
}

印刷された

Buffett
Hoffa

ただし、ネットワーク共有上の大きなファイルを使用したその後のテストでは、上記のアプローチは、個別のインデックスのみを使用するよりもはるかに効率が悪いことが示されました。パフォーマンスが重要な場合は、その追加のインデックスを..newEntryIterableFirstNamecolA

于 2017-01-02T20:45:23.827 に答える