Как изменить таблицу с помощью UCanAccess

Я использую JDBC-драйвер UCanAccess (версия 3.0.3.1) для подключения к mdb-файлу. И мне нужно добавить столбец в существующую таблицу. Проблема в том, что утверждение

ALTER TABLE TEmployee ADD COLUMN NotificationsEnabled BINARY

выдает исключение:

net.ucanaccess.jdbc.UcanaccessSQLException: UCAExc:::3.x.x Feature not supported yet.

И кажется, что нет более новых версий UCanAccess.

Что я могу сделать в такой ситуации? Я не хочу использовать драйвер ODBC по многим причинам (описано здесь - Управление базой данных Access из Java без ODBC)

Единственное решение, которое я вижу, - это создать копию таблицы (например, TEmployeeBackup) для сохранения данных, затем удалить и заново создать исходную таблицу с новым полем, а затем переместить данные обратно из TEmployeeBackup в TEmployee. Но это решение кажется мне ужасным.

3 ответа

Решение

UCanAccess версии 4.0.0 и выше теперь поддерживают ALTER TABLE, например,

Statement stmt = conn.createStatement();
stmt.execute("ALTER TABLE TableName ADD COLUMN newCol LONG");

Ucanaccess не может поддерживать эту очень запрашиваемую функцию, пока базовая библиотека jackcess не поддерживает ее. Мы (команда Ucanaccess) могли бы автоматизировать вышеупомянутые шаги, но по той же причине мы не можем создать fk и поэтому во многих случаях воспроизводим точную копию исходной таблицы. Изменяя таблицу, мы бы потеряли ограничения ссылочной целостности... так что пока лучше ничего не делать. Извините, пока нет решения.

Обновление: январь 2017

UCanAccess теперь поддерживает ALTER TABLE. Смотрите мой другой ответ на этот вопрос.


(Предыдущий устаревший ответ.)

Если ваше Java-приложение работает под Windows, вы можете использовать следующий обходной путь. Он создает небольшой VBScript и вызывает CSCRIPT.EXE для его запуска

String dbFileSpec = "C:\\Users\\Public\\mdbTest.mdb";

// write a temporary VBScript file ...
File vbsFile = File.createTempFile("AlterTable", ".vbs");
vbsFile.deleteOnExit();
PrintWriter pw = new PrintWriter(vbsFile);
pw.println("Set conn = CreateObject(\"ADODB.Connection\")");
pw.println("conn.Open \"Driver={Microsoft Access Driver (*.mdb)};Dbq=" + dbFileSpec + "\"");
pw.println("conn.Execute \"ALTER TABLE TEmployee ADD COLUMN NotificationsEnabled YESNO\"");
pw.println("conn.Close");
pw.println("Set conn = Nothing");
pw.close();

// ... and execute it
Process p = Runtime.getRuntime().exec("CSCRIPT.EXE \"" + vbsFile.getAbsolutePath() + "\"");
p.waitFor();
BufferedReader rdr = 
        new BufferedReader(new InputStreamReader(p.getErrorStream()));
int errorLines = 0;
String line = rdr.readLine();
while (line != null) {
    errorLines++;
    System.out.println(line);  // display error line(s), if any
    line = rdr.readLine();
}
if (errorLines == 0) {
    System.out.println("The operation completed successfully.");
}

Заметки:

  1. Приведенный выше код будет работать для обновления файла.mdb, если приложение Java работает под 32-разрядной JVM. Если вам нужно обновить файл.accdb или если приложение Java работает под 64-битной JVM, то должна быть установлена ​​соответствующая версия Microsoft Access Database Engine (32-битная или 64-битная, такая же, как JVM) и вам нужно будет использовать Driver={Microsoft Access Driver (*.mdb, *.accdb)},

  2. Этот обходной путь использует ODBC, но он не использует Java JDBC-ODBC Bridge, поэтому он будет работать с Java 8.

Другие вопросы по тегам