Как изменить SortOrder, чтобы избежать ошибки неподдерживаемого порядка сортировки?

Я работаю над программой с базой данных .mdb от стороннего клиента. Все было хорошо, пока я не попытался обновить элементы в базе данных. Поле sortOrder неверно. Я пытался изменить его на общий с помощью MS Access, и мне не повезло. Сообщение, которое я получаю, когда выполняю запрос на обновление:

java.lang.IllegalArgumentException: Given index Index@150ab4ed[
  name: (EXART) PrimaryKey
  number: 2
  isPrimaryKey: true
  isForeignKey: false
  data: IndexData@3c435123[
    dataNumber: 2
    pageNumber: 456
    isBackingPrimaryKey: true
    isUnique: true
    ignoreNulls: false
    columns: [
      ReadOnlyColumnDescriptor@50fe837a[
        column: Column@636e8cc[
          name: (EXART) ARCodArt
          type: 0xa (TEXT)
          number: 0
          length: 30
          variableLength: true
          compressedUnicode: true
          textSortOrder: SortOrder[3082(0)]
        ]
        flags: 1
      ]
    ]
    initialized: false
    pageCache: IndexPageCache@3a62c01e[
      pages: (uninitialized)
    ]
  ]
] is not usable for indexed lookups due to unsupported collating sort order SortOrder[3082(0)] for text index
    at com.healthmarketscience.jackcess.impl.IndexCursorImpl.createCursor(IndexCursorImpl.java:111)
    at com.healthmarketscience.jackcess.CursorBuilder.toCursor(CursorBuilder.java:302)
    at net.ucanaccess.commands.IndexSelector.getCursor(IndexSelector.java:150)
    at net.ucanaccess.commands.CompositeCommand.persist(CompositeCommand.java:83)
    at net.ucanaccess.jdbc.UcanaccessConnection.flushIO(UcanaccessConnection.java:268)
    at net.ucanaccess.jdbc.UcanaccessConnection.commit(UcanaccessConnection.java:169)
    at cultifortgestio.EntradaEixidaDades.Insercio(EntradaEixidaDades.java:76)

Как вы можете видеть, Access вообще не меняет sortOrder, я думаю, что он должен быть 1033, а он остается 3082. Есть ли способ это изменить? Как я уже сказал, изменение в Access и выполнение базы данных Compact and Repair не сработало для меня.


person Amnor    schedule 11.08.2015    source источник
comment
Я не могу воссоздать вашу проблему в Access 2010. После того, как я изменил порядок сортировки новой базы данных с испанского современного на общий - устаревший и выполнил сжатие и восстановление базы данных, порядок сортировки больше не равен 3082, и UCanAccess может обновить столбец. Вы уверены, что сжимаете и восстанавливаете нужный файл базы данных? Вы всегда можете попробовать удалить первичный ключ и воссоздать его, чтобы посмотреть, поможет ли это кому-нибудь.   -  person Gord Thompson    schedule 11.08.2015
comment
Я не могу удалить его и создать заново, потому что в клиентской среде к нему обращается другая программа. Вот шаги, которые я делаю, чтобы изменить SortOrder: я открываю de DB в доступе, я выбираю таблицу EXART, а затем меняю ее на общую. После этого я делаю базу данных Compact and Repair, я использую версию Access 2007. Может быть проблема в том, что дата создания базы 1998?   -  person Amnor    schedule 11.08.2015
comment
Я не уверен, что вы имеете в виду, когда я выбираю таблицу EXART, а затем меняю ее на общую, но вам нужно изменить порядок сортировки для всей базы данных, а не только для одной таблицы. Вам нужно зайти в «Параметры доступа» (скриншот здесь), изменить Новый порядок сортировки базы данных: «Общий — Устаревший», а затем выполните «Сжатие и восстановление базы данных».   -  person Gord Thompson    schedule 12.08.2015
comment
Тот же результат, sortOrder остается в 3082, не знаю почему, и начинает уставать от MDB.   -  person Amnor    schedule 12.08.2015
comment
Готово, с языком доступа на американском английском работало, спасибо, все было так, как вы сказали, я не знаю, что происходило на испанском варианте.   -  person Amnor    schedule 12.08.2015


Ответы (1)


Как и в других подобных ситуациях, решение состояло в том, чтобы изменить порядок сортировки затронутой базы данных. Обычно это делается

  • открытие базы данных в Access,
  • изменив «Новый порядок сортировки базы данных» (см. снимок экрана ниже) на «Общий — Устаревший», а затем
  • выполнение операции сжатия и восстановления базы данных.

AccessOptions.png

Однако проблема в этом случае заключалась в том, что языковой стандарт Windows был установлен на «испанский», поэтому параметры сортировки «Общие» в Access не сопоставляются со значением, которое UCanAccess (фактически Jackcess) может обновить. Решение для спрашивающего состояло в том, чтобы временно изменить свой языковой стандарт Windows на «английский ...», выполнить описанные выше шаги, чтобы изменить порядок сортировки базы данных, а затем снова изменить языковой стандарт Windows.

Для тех, кто предпочитает не возиться со своими настройками локали Windows, альтернативным решением будет создание UCanAccess нового пустого файла базы данных с помощью параметра newDatabaseVersion, например,

String connStr = "jdbc:ucanaccess://C:/someplace/new.accdb;newDatabaseVersion=V2010";
try (Connection conn = DriverManager.getConnection(connStr)) {
}

откройте новую базу данных в Access, а затем перенесите таблицы из файла старой базы данных в новый с помощью функции импорта. Файл базы данных, созданный UCanAccess, будет иметь порядок сортировки, совместимый с операциями обновления.

person Gord Thompson    schedule 12.08.2015
comment
Спасибо за вариант newDatabaseVersion - person TiyebM; 02.01.2018