2015-01-12 32 views
5

voglio fare un piccolo cambiamento in una tabella di Access utilizzando UCanAccess tramite NetBeans, ma ho incontrato un problema alla lineadatabase di aggiornamento errore di accesso "non supportato ordine di collazione sorta" da Java

pst.executeUpdate(); 

dettagli del database:

database name : duruBistro.accdb 
table name : person 
field names: tc_no (text) 
      name  (text) 
      surname (text) 
      salary (number) 

Codice:

Connection conn = DriverManager.getConnection("jdbc:ucanaccess://C:\\Users\\ysnndr \\Documents\\accessDB\\duruBistro.accdb"); 
String query = "UPDATE PERSON SET SALARY = ? WHERE TC_NO = '189'"; 
PreparedStatement pst = conn.prepareStatement(query); 
pst.setInt(1, 2500);   
pst.executeUpdate(); 

Eccezione:

012.351.
run: 
java.lang.IllegalArgumentException: Given index [email protected][ 
    name: (PERSON) PrimaryKey 
    number: 0 
    isPrimaryKey: true 
    isForeignKey: false 
    data: [email protected][ 
    dataNumber: 0 
    pageNumber: 317 
    isBackingPrimaryKey: true 
    isUnique: true 
    ignoreNulls: false 
    columns: [ 
     [email protected][ 
     column: [email protected][ 
      name: (PERSON) TC_NO 
      type: 0xa (TEXT) 
      number: 17 
      length: 22 
      variableLength: true 
      compressedUnicode: true 
      textSortOrder: SortOrder[1055(0)] 
     ] 
     flags: 1 
     ] 
    ] 
    initialized: false 
    pageCache: [email protected][ 
     pages: (uninitialized) 
    ] 
    ] 
] is not usable for indexed lookups due to unsupported collating sort order SortOrder[1055(0)] for text index 
    at com.healthmarketscience.jackcess.impl.IndexCursorImpl.createCursor(IndexCursorImpl.java:111) 
net.ucanaccess.jdbc.UcanaccessSQLException: Given index [email protected][ 
    name: (PERSON) PrimaryKey 
    number: 0 
    isPrimaryKey: true 
    isForeignKey: false 
    data: [email protected][ 
    dataNumber: 0 
    pageNumber: 317 
    at com.healthmarketscience.jackcess.CursorBuilder.toCursor(CursorBuilder.java:302) 
    at net.ucanaccess.commands.IndexSelector.getCursor(IndexSelector.java:148) 
    isBackingPrimaryKey: true 
    isUnique: true 
    at net.ucanaccess.commands.CompositeCommand.persist(CompositeCommand.java:83) 
    ignoreNulls: false 
    columns: [ 
     [email protected][ 
     column: [email protected][ 
      name: (PERSON) TC_NO 
      type: 0xa (TEXT) 
      number: 17 
      length: 22 
      variableLength: true 
      compressedUnicode: true 
      textSortOrder: SortOrder[1055(0)] 
     ] 
     flags: 1 
     ] 
    ] 
    initialized: false 
    pageCache: [email protected][ 
     pages: (uninitialized) 
    ] 
    ] 
] is not usable for indexed lookups due to unsupported collating sort order SortOrder[1055(0)] for text index 
    at net.ucanaccess.jdbc.UcanaccessConnection.flushIO(UcanaccessConnection.java:312) 
    at net.ucanaccess.jdbc.UcanaccessConnection.commit(UcanaccessConnection.java:202) 
    at net.ucanaccess.jdbc.AbstractExecute.executeBase(AbstractExecute.java:143) 
    at net.ucanaccess.jdbc.ExecuteUpdate.execute(ExecuteUpdate.java:56) 
    at net.ucanaccess.jdbc.UcanaccessPreparedStatement.executeUpdate(UcanaccessPreparedStatement.java:248) 
    at com.ui.AccdbcConnection.main(AccdbcConnection.java:29) 
BUILD SUCCESSFUL (total time: 1 second) 
+0

formatta correttamente l'eccezione? – HaveNoDisplayName

+0

È possibile eseguire direttamente lo stesso lavoro SQL in Access? È possibile che il tuo driver JDBC non supporti il ​​textSortOrder che hai configurato sulla tua chiave primaria, ma non sono un esperto di Access. – Rup

+0

Perché non stai usando un parametro 'TC_NO' come lo sei per' SALARY'? – MadProgrammer

risposta

7

Parafrasando il messaggio di errore:

java.lang.IllegalArgumentException: Dato indice ... (persona) ChiavePrimaria ... non è utilizzabile per le ricerche indicizzati causa di ordinamento supportato collating

Questa è una limitazione nota di Jackcess, il gestore di record che UCanAccess utilizza per leggere e scrivere il file di database di Access. Per eseguire aggiornamenti sulle tabelle con chiavi primarie di tipo Text, Jackcess richiede che il database di Access utilizzi l'ordinamento "Generale" o "Generale - Legacy".

Per modificare l'ordinamento per il file di database di Access in questione:

  • Aprire il database in Access. Sotto File > Options cambia il "Nuovo ordinamento del database" in "Generale" (o "Generale - Legacy").

Options.png

  • eseguire una "Compatta e ripristina database" sul database. (In Access 2010+ si trova nella scheda "Strumenti database" della barra multifunzione.)

  • Accesso di uscita.

L'applicazione Java non deve più generare un'eccezione. Tuttavia, se il problema persiste, potrebbe verificarsi anche un problema con le impostazioni internazionali di Windows. Vedere this answer per un'altra possibile soluzione.

+0

Grazie per il suggerimento. L'ho appena notato. – ysnndr