Как подключить базу данных MS Access к Java 8?

Что я пытаюсь сделать:

Я хочу подключить свою базу данных MS Access к Java 8. Поэтому я использую драйвер «UcanAccess» для подключения к моей базе данных.

Что я использую:

Eclipse, Java 8 и база данных MS Access

Путь к моей базе данных MS Access:

C:/Users/dave/My_WorkSpace/Eclipse_Workspaces/workspace-jsp/Database11.accdb"

В моем проекте есть следующие файлы JAR:

  • mysql-коннектор-java-5.1.35-bin.jar

  • ucanaccess-2.095.jar

  • jackcess-2.1.2.jar

  • hsqldb.jar

  • Commons-lang3-3.4.jar

  • Commons-logging-1.2.jar

Ошибка:

Exception in thread "main" java.lang.NoClassDefFoundError: org/apache/commons/lang/builder/CompareToBuilder
at com.healthmarketscience.jackcess.impl.RowIdImpl.compareTo(RowIdImpl.java:106)
at com.healthmarketscience.jackcess.impl.IndexData$Entry.compareTo(IndexData.java:2039)
at com.healthmarketscience.jackcess.impl.IndexData$Entry.compareTo(IndexData.java:1847)
at java.util.Collections.indexedBinarySearch(Unknown Source)
at java.util.Collections.binarySearch(Unknown Source)
at com.healthmarketscience.jackcess.impl.IndexData$DataPage.findEntry(IndexData.java:2570)
at com.healthmarketscience.jackcess.impl.IndexData.findEntryPosition(IndexData.java:844)
at com.healthmarketscience.jackcess.impl.IndexData.access$3700(IndexData.java:47)
at com.healthmarketscience.jackcess.impl.IndexData$EntryCursor.updatePosition(IndexData.java:2335)
at com.healthmarketscience.jackcess.impl.IndexData$EntryCursor.restorePosition(IndexData.java:2273)
at com.healthmarketscience.jackcess.impl.IndexData$EntryCursor.restorePosition(IndexData.java:2256)
at com.healthmarketscience.jackcess.impl.IndexData$EntryCursor.beforeEntry(IndexData.java:2218)
at com.healthmarketscience.jackcess.impl.IndexCursorImpl.findPotentialRow(IndexCursorImpl.java:376)
at com.healthmarketscience.jackcess.impl.IndexCursorImpl.findFirstRowByEntryImpl(IndexCursorImpl.java:282)
at com.healthmarketscience.jackcess.impl.IndexCursorImpl.findFirstRowByEntry(IndexCursorImpl.java:153)
at com.healthmarketscience.jackcess.impl.DatabaseImpl$DefaultTableFinder.findRow(DatabaseImpl.java:2074)
at com.healthmarketscience.jackcess.impl.DatabaseImpl$TableFinder.findObjectId(DatabaseImpl.java:1953)
at com.healthmarketscience.jackcess.impl.DatabaseImpl.readSystemCatalog(DatabaseImpl.java:858)
at com.healthmarketscience.jackcess.impl.DatabaseImpl.<init>(DatabaseImpl.java:518)
at com.healthmarketscience.jackcess.impl.DatabaseImpl.open(DatabaseImpl.java:389)
at com.healthmarketscience.jackcess.DatabaseBuilder.open(DatabaseBuilder.java:248)
at net.ucanaccess.jdbc.DefaultJackcessOpener.open(DefaultJackcessOpener.java:38)
at net.ucanaccess.jdbc.DBReference.<init>(DBReference.java:158)
at net.ucanaccess.jdbc.DBReferenceSingleton.loadReference(DBReferenceSingleton.java:57)
at net.ucanaccess.jdbc.UcanaccessDriver.connect(UcanaccessDriver.java:103)
at java.sql.DriverManager.getConnection(Unknown Source)
at java.sql.DriverManager.getConnection(Unknown Source)
at ex01.main(ex01.java:37)
Caused by: java.lang.ClassNotFoundException: org.apache.commons.lang.builder.CompareToBuilder
at java.net.URLClassLoader$1.run(Unknown Source)
at java.net.URLClassLoader$1.run(Unknown Source)
at java.security.AccessController.doPrivileged(Native Method)
at java.net.URLClassLoader.findClass(Unknown Source)
at java.lang.ClassLoader.loadClass(Unknown Source)
at sun.misc.Launcher$AppClassLoader.loadClass(Unknown Source)
at java.lang.ClassLoader.loadClass(Unknown Source)
... 28 more

код для подключения к базе данных:

public class ex01 {
public static void main(String[] args) {
    String url = "jdbc:ucanaccess://C:/Users/dave/My_WorkSpace/Eclipse_Workspaces/workspace-jsp/Database11.accdb";

    Connection con;

    Statement stmt;

    String query = "Select * from user";

    try {
        // Class.forName("sun.jdbc.odbc.JdbcOdbcDriver");
        Class.forName("net.ucanaccess.jdbc.UcanaccessDriver");

        con = DriverManager.getConnection(url, "", "");

        stmt = con.createStatement();

        // Returns a ResultSet that contains the data produced by the query;
        // never null
        ResultSet rs = stmt.executeQuery(query);

        System.out.println("User Data:");
        System.out.println("FirstName\tLastName\tAge");

        while (rs.next()) {
            String fName = rs.getString("FirstName");
            String lName = rs.getString("LastName");
            int age = rs.getInt("age");
            System.out.println(fName + "\t" + lName + "\t" + age);
        }

        stmt.close();

        con.close();
    } catch (SQLException ex) {
        System.err.println("SQLException: " + ex.getMessage());
    } catch (ClassNotFoundException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }
}

}


person user1924249    schedule 02.08.2015    source источник
comment
попробуйте версию 2.0 (commons-lang-2.0.jar) commons-lang jar.   -  person Amogh    schedule 02.08.2015
comment
Я предполагаю, что в ваших JAR-файлах есть несоответствие, ознакомьтесь с приведенной ниже статьей для получения полного примера с информацией о драйвере и зависимых JAR-файлах benchresources.net/   -  person BenchResources.Net    schedule 18.08.2017


Ответы (1)


Как вы можете видеть, jackcess 2.1.2 зависит от commons- язык 2.6. Используемая вами версия (3.4) не имеет обратной совместимости.

Зачем вам драйвер JDBC для MySQL и HSQLDB, если ваша цель — подключиться к MS Access?

person JB Nizet    schedule 02.08.2015
comment
Отличная ссылка. Старая версия предназначена для совместимости с обратными словами. - person Roman C; 02.08.2015
comment
Драйвер JDBC UCanAccess для баз данных Access использует HSQLDB в качестве резервной базы данных (обычно только в памяти). . - person Gord Thompson; 02.08.2015