# Connect zu ACCESS-DB mit Ucanaccess



## GuenniMo (2. Mai 2022)

Hallo,

ich administriere ein geografisches Informationssystem, für das u.a. eine eigene Skriptsprache auf der Basis von Java entwickelt wurde. Ein Bestandteil dieses Systems ist JRE7 (derzeit kein Update auf 8 möglich). Aus diesem System heraus muss ich eine ACCESS-Datenbank "befüllen" und wollte mich hierzu "Ucanaccess" bedienen. Dafür habe ich mir die neueste Version 5.0.1 heruntergeladen, die fünf jar-Dateien in den Classpath gesteckt und das Ganze getestet, musste jedoch feststellen, dass diese wohl JRE8 erfordert.

Folgende Fehlermeldung wird dabei ausgeworfen (Auszug aus dem Log):
*EXEC*sqlconnect
 [1]=net.ucanaccess.jdbc.UcanaccessDriver
 [2]=DriverManager.getConnection("jdbc:ucanaccess://C:/temp/Wincan.mdb")
 [3]=X
 [4]=X
Exception in thread "AWT-EventQueue-0" java.lang.UnsupportedClassVersionError: net/ucanaccess/jdbc/UcanaccessDriver : Unsupported major.minor version 52.0
    at java.lang.ClassLoader.defineClass1(Native Method)
    at java.lang.ClassLoader.defineClass(Unknown Source)
    at java.security.SecureClassLoader.defineClass(Unknown Source)
    at java.net.URLClassLoader.defineClass(Unknown Source)
    at java.net.URLClassLoader.access$100(Unknown Source)
.
.
.

Also habe ich die Version 4.0.4 herunter geladen und das Ganze erneut getestet in der Hoffnung, dass diese Version mit JRE7 klarkommt.

hierbei wird jedoch keine Datenbankverbindung erstellt, weil angeblich kein Treiber gefunden wird.

Error while connecting: sqlconnect:connect:No suitable driver found for DriverManager.getConnection("jdbc:ucanaccess://C:/temp/Wincan.mdb")
Error while closing connection: Fehlerhaftes Argument: DB-Verbindung ist null.

Hier die Java-Version (an der ich nicht vorbeikomme):



Mein Betriebssystem:



Nun meine Frage:

Welche Version von "Ucanaccess" muss ich verwenden, damit das Ganze mit der o.g. JRE7 funktioniert?

Gibt es ggf. Alternativen (Bitte OHNE ODBC)?

Vielen Dank im Voraus für Eure Mühe


----------



## KonradN (2. Mai 2022)

Das Problem hast Du vermutlich richtig erkannt: Die verwendete Version hat alles in Java 8 übersetzt (Version 52). Daher musst Du ältere Versionen ausprobieren in der Hoffnung, dass es z.B. mit der 3er Version funktioniert.


----------



## LimDul (2. Mai 2022)

Das 4er Release sollte laut Webseite reichen, weil bei 5.0.0 steht "Requires now Java 8".

Eigentlich sollte man folgendes nicht brauchen:

```
Class.forName("net.ucanaccess.jdbc.UcanaccessDriver");
```
Aber probieren würde ich es trotzdem mal, ob das vor dem Jdbc-Connect funktioniert.


----------



## GuenniMo (2. Mai 2022)

KonradN hat gesagt.:


> Das Problem hast Du vermutlich richtig erkannt: Die verwendete Version hat alles in Java 8 übersetzt (Version 52). Daher musst Du ältere Versionen ausprobieren in der Hoffnung, dass es z.B. mit der 3er Version funktioniert.


Für die Version 3.0.7 war die JRE7 warscheinlich zu neu. Da gab es auch einen Versionskonflikt, aber scheinbar in die andere Richtung.

*EXEC*sqlconnect
 [1]=net.ucanaccess.jdbc.UcanaccessDriver
 [2]=DriverManager.getConnection("jdbc:ucanaccess://C:/temp/Wincan.mdb")
 [3]=X
 [4]=X
Exception in thread "AWT-EventQueue-0" java.lang.UnsupportedClassVersionError: net/ucanaccess/jdbc/UcanaccessDriver : Unsupported major.minor version 52.0
    at java.lang.ClassLoader.defineClass1(Native Method)
    at java.lang.ClassLoader.defineClass(Unknown Source)
    at java.security.SecureClassLoader.defineClass(Unknown Source)
    at java.net.URLClassLoader.defineClass(Unknown Source)
    at java.net.URLClassLoader.access$100(Unknown Source)


----------



## KonradN (2. Mai 2022)

Prüfe bitte einmal den Classpath! Bist Du sicher, dass Du nicht die 5er Version im Classpath hast? Die Meldung besagt, dass die Klasse net.ucanaccess.jdbc.UcanaccessDriver in der Version 52.0 (= Java 8) vorliegt und daher nicht geladen werden kann. Java 7 wäre die Version 51.

Daher würde ich raten, das einmal zu prüfen. Nach dem, was @LimDul gefunden hat, wäre meine Erwartungshaltung, dass es mit der 4er Version klappen müsste.


----------



## GuenniMo (2. Mai 2022)

LimDul hat gesagt.:


> Das 4er Release sollte laut Webseite reichen, weil bei 5.0.0 steht "Requires now Java 8".
> 
> Eigentlich sollte man folgendes nicht brauchen:
> 
> ...


Das hatte ich auch gelesen, deswegen hatte ich mir ja die 4.0.4 herunter geladen. Die Tatsache, dass er da keine Verbindung zustande brachte lag daran, dass ich die 5 jar-Dateien der Version 4.0.4 aus Versehen im falschen Ordner abgelegt hatte. Das hatte ich eben korrigiert und das Ganze nochmal getestet.

Auch hier lag dann der gleiche Versionskonflikt vor wie bei 3.0.7. 

*EXEC*sqlconnect
[1]=net.ucanaccess.jdbc.UcanaccessDriver
[2]=DriverManager.getConnection("jdbc:ucanaccess://C:/temp/Wincan.mdb")
[3]=X
[4]=X
Exception in thread "AWT-EventQueue-0" java.lang.UnsupportedClassVersionError: net/ucanaccess/jdbc/UcanaccessDriver : Unsupported major.minor version 52.0
   at java.lang.ClassLoader.defineClass1(Native Method)
   at java.lang.ClassLoader.defineClass(Unknown Source)
   at java.security.SecureClassLoader.defineClass(Unknown Source)
   at java.net.URLClassLoader.defineClass(Unknown Source)
   at java.net.URLClassLoader.access$100(Unknown Source)

Version 5.0.1 ist zu neu und die beiden anderen scheinbar zu alt.


----------



## GuenniMo (2. Mai 2022)

KonradN hat gesagt.:


> Prüfe bitte einmal den Classpath! Bist Du sicher, dass Du nicht die 5er Version im Classpath hast? Die Meldung besagt, dass die Klasse net.ucanaccess.jdbc.UcanaccessDriver in der Version 52.0 (= Java 8) vorliegt und daher nicht geladen werden kann. Java 7 wäre die Version 51.
> 
> Daher würde ich raten, das einmal zu prüfen. Nach dem, was @LimDul gefunden hat, wäre meine Erwartungshaltung, dass es mit der 4er Version klappen müsste.


OK. Ich prüfe nochmal alles genau.

Vielen Dank euch beiden schon mal


----------



## GuenniMo (2. Mai 2022)

Ich hatte tatsächlich noch jar-Dateien der 5er-Version im Classpath. Nachdem ich nun alles bereinigt hatte, habe ich beginnend mit Version 3.0.7 alles nochmals getestet.

3.0.7:
Error while connecting: sqlconnect:connect:No suitable driver found for DriverManager.getConnection("jdbc:ucanaccess://C:/temp/Wincan.mdb")
Error while closing connection: Fehlerhaftes Argument: DB-Verbindung ist null.

4.04:
Error while connecting: sqlconnect:connect:No suitable driver found for DriverManager.getConnection("jdbc:ucanaccess://C:/temp/Wincan.mdb")
Error while closing connection: Fehlerhaftes Argument: DB-Verbindung ist null.

5.0.1
*EXEC*sqlconnect
[1]=net.ucanaccess.jdbc.UcanaccessDriver
[2]=DriverManager.getConnection("jdbc:ucanaccess://C:/temp/Wincan.mdb")
[3]=X
[4]=X
Exception in thread "AWT-EventQueue-0" java.lang.UnsupportedClassVersionError: net/ucanaccess/jdbc/UcanaccessDriver : Unsupported major.minor version 52.0

Ich bin da jetzt mit meinem Latein erst mal am Ende.


----------



## LimDul (2. Mai 2022)

Mit dem Class.forName mal probiert? (Auch wenn das notwendig sein sollte). Ansonsten mal mittels https://docs.oracle.com/javase/7/docs/api/java/sql/DriverManager.html#getDrivers() schauen, was den so an Drivern vorhanden ist.


----------



## GuenniMo (2. Mai 2022)

LimDul hat gesagt.:


> Mit dem Class.forName mal probiert? (Auch wenn das notwendig sein sollte). Ansonsten mal mittels https://docs.oracle.com/javase/7/docs/api/java/sql/DriverManager.html#getDrivers() schauen, was den so an Drivern vorhanden ist.


Ja, das hatte ich probiert. Ich werde mich mal nach Treibern auf der von dir vorgeschlagenen Seite umschauen. 
Danke für den Tipp


----------



## mihe7 (3. Mai 2022)

Hab das gerade mal getestet: funktioniert einwandfrei.


```
wget https://netcologne.dl.sourceforge.net/project/ucanaccess/archive/v4_archive/UCanAccess-4.0.4-bin.zip
mkdir mdb
cd mdb
tar -xzf ../jdk-7u45-linux-i586.tar.gz
unzip ../UCanAccess-4.0.4-bin.zip
```

Damit habe ich die beiden Verzeichnisse

```
jdk1.7.0_45
UCanAccess-4.0.4-bin
```

Jetzt noch `Test.java` erstellen:

```
import java.sql.*;

public class Test {
    public static void main(String[] args) throws Exception {
        Connection conn = DriverManager.getConnection("jdbc:ucanaccess://" + args[0]);
        conn.close();
    }
}
```

Übersetzen

```
jdk1.7.0_45/bin/javac Test.java
```

Und mit

```
jdk1.7.0_45/bin/java -cp UCanAccess-4.0.4-bin/lib/commons-lang-2.6.jar:UCanAccess-4.0.4-bin/lib/commons-logging-1.1.3.jar:UCanAccess-4.0.4-bin/lib/hsqldb.jar:UCanAccess-4.0.4-bin/lib/jackcess-2.1.11.jar:UCanAccess-4.0.4-bin/ucanaccess-4.0.4.jar:. Test ./example.mdb
```
ausführen. Die Verbindung wird dann ohne Mucken aufgebaut und geschlossen (die ./example.mdb muss natürlich existieren )


----------



## GuenniMo (4. Mai 2022)

Der Fehler ist gefunden. Das geografisches Informationssystem, mit dem ich da zugange bin, hatte ein Problem mit dem Doppelpunkt ("jdbc:ucanaccess*:*//C://...."). Ich habe mir den Connection-String dann zusammengebaut (Sonderzeichen über ASCII-Code) und das hat dann funktioniert. Die Ucanaccess-Version 4.0.4 ist die richtige.
Vielen, vielen Dank nochmal an alle, die sich meinem Problem angenommen haben


----------

