2013-01-24 48 views
1

我想插入一個行插入一個jackcess表,它是這樣創建的;Jackcess得到一個排序表或最大索引

Table t = Database.open(new File(dbUrl)).getTable(tname);

通常情況下,如果我是使用SQL,這將是對它進行排序正確的時間。即使如此,我也查看了文檔,但沒有發現任何內容。

無論如何,獲取表後,我嘗試使用插入一行;

 int id = t.getRowCount() + 1; 

     try { 
      t.addRow(id, "MyName", "MyLastName"); 
     } catch (IOException ex) { 
      ex.printStackTrace(); 
     } 

但是,由於索引沒有排序,我得到以下異常;現在

java.io.IOException: New row [250, MyName, MyLastName, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null] violates uniqueness constraint for index 
Data number: 5 
Page number: 99 
Is Backing Primary Key: true 
Is Unique: true 
Ignore Nulls: false 
Columns: [ColumnDescriptor Name: (CLIENTES) ID_CLIENTE 
Type: 0x4 (LONG) 
Number: 0 
Length: 4 
Variable length: false flags: 1] 
Initialized: true 
EntryCount: 249 
    Cache: 
    LeafDataPage[99] 0, 0, (0), [RowId = 93:0, Bytes = 7F 80 00 00 00 , RowId = 6844:0, Bytes = 7F 80 00 01 5C] 

at com.healthmarketscience.jackcess.IndexData.addEntry(IndexData.java:571) 
at com.healthmarketscience.jackcess.IndexData.addRow(IndexData.java:537) 
... 

,我想,也許這是因爲缺乏其他列的失敗,但後來我試着用 t.getRowCount() + 100; ,並能插入。所以我的問題顯然是我不知道如何獲得索引或排序表。

顯然,計數行是一個糟糕的解決方案。無論如何,我只是嘗試過。

回答

2

要按排序順序檢索行,您可以遍歷一個已由索引支持的光標。以下代碼使用回答here中描述的技術,以主鍵順序遍歷表並檢索最大鍵值。然後它添加下一個最大鍵值的新行。

import java.io.File; 
import java.io.IOException; 
import com.healthmarketscience.jackcess.*; 

public class jackcessTest { 

    public static void main(String[] args) { 
     try { 
      Table table = DatabaseBuilder.open(new File("C:\\Users\\Public\\Database1.accdb")).getTable("JackcessTest"); 
      int LargestKey = 0; 
      // the following loop is modified from 
      //  https://stackoverflow.com/a/19304549/2144390 
      //  for Jackcess 2.0 
      for(Row row : CursorBuilder.createCursor(table.getPrimaryKeyIndex())) { 
       LargestKey = (int)row.get("ID"); 
      } 
      try { 
       table.addRow(LargestKey + 1, "MyName", "MyLastName"); 
      } catch (IOException e) { 
       e.printStackTrace(); 
      } 
     } catch (Exception e) { 
      e.printStackTrace(); 
     } 
     System.out.println("Done.");   
    } 
}