# DB Verbindung JDBC-ODBC Bridge



## nathaniells freak (15. Januar 2008)

Hallo alle zusammen.

Ich versuche ein Programm zu schreiben mit dem ich auf MS Access Datenbank Dateien zugreifen will. Sprich *.mdb .

Wenn ich den Code in Windows laufen lasse funktioniert er, aber wenn ich den Code auf Linux portiere bekomme ich in der Entwicklungsumgebung Netbeans eine Exception.

In Windows entwickle ich auch mit Netbeans.


```
try {
            String treiber=null, DbUrl=null ;
            //*** "Name des Datenbanktreibers eingeben
            treiber = "sun.jdbc.odbc.JdbcOdbcDriver";
            //*** "Url der Databank eingeben *********
            DbUrl = "jdbc:odbc:Driver={Microsoft Access Driver (*.mdb)};DBQ=C:\\Buecher.mdb";    
            
            Class.forName(treiber).newInstance();
            System.out.println("JDBC-ODBC driver loaded ok.");

            // Listet alle geladenen Treiber auf
            List drivers = Collections.list(DriverManager.getDrivers());
            for (int i=0; i<drivers.size(); i++) {
                Driver driver = (Driver)drivers.get(i);
                System.out.println("----------------------------");
                // Get name of driver
                String name = driver.getClass().getName();
                System.out.println("Driver Name = " + name);
    
                // Get version info
                int majorVersion = driver.getMajorVersion();
                System.out.println(" MajorVersion = " + majorVersion);
                int minorVersion = driver.getMinorVersion();
                System.out.println("minorVersion = " + minorVersion);
                boolean isJdbcCompliant = driver.jdbcCompliant();
                System.out.println("isJdbcCompliant = " + isJdbcCompliant);
                System.out.println("----------------------------");                
            }
            
            
            DriverManager.registerDriver(new sun.jdbc.odbc.JdbcOdbcDriver());
            System.out.println("Register JDBC-ODBC driver ok.");
            
            java.sql.Connection cn = DriverManager.getConnection(DbUrl,"","");             
            System.out.println("DB URL ok.");
            
        
            java.sql.Statement p = cn.createStatement(java.sql.ResultSet.TYPE_SCROLL_INSENSITIVE, java.sql.ResultSet.CONCUR_UPDATABLE);                        
            System.out.println("Statement Create ok.");
            
            
            String qry = "SELECT Tabelle.Spalte FROM Tabelle;";
        
            java.sql.ResultSet rss = p.executeQuery(qry);
            
            // auswerten kann ich ja nicht in linux deswegen entfällt der code
            // weil ich noch nicht einmal bis dahin im linux komme sondern er beim
            // connection create statement scheitert
            
        }
        catch(ClassNotFoundException cnfe) {
            System.out.println("Treiber kann nicht geladen werden: "+ cnfe.getMessage());
            System.out.println(cnfe.getMessage());
        }
        catch(SQLException sqle) {
            System.out.println("Verbindung ist fehlgeschlagen: " + sqle.getMessage());
            System.out.println("Kein Server vorhanden!");
        }
        catch (Exception e) {
            System.out.println(e.getMessage());
            e.printStackTrace();
            System.out.println(e.toString());
        }        
    }
```

Auf Basis von Linux habe ich das ganze versucht so umzusetzen:


```
DbUrl = "jdbc:odbc:Driver={Microsoft Access Driver (*.mdb)};DBQ=/Buecher.mdb";
// Oder mit "./Buecher.mdb"
// Oder mit "//Buecher.mdb"
// Oder mit "\\Buecher.mdb"
java.sql.Connection cn = DriverManager.getConnection(DbUrl,"","");
```

Aber alles hat nichts geholfen um das Problem zu lösen egal was ich mache er schmeisst mir immer diese Fehlermeldung raus:

JDBC-ODBC driver loaded ok.
----------------------------
Driver Name = sun.jdbc.odbc.JdbcOdbcDriver
 MajorVersion = 2
minorVersion = 1
isJdbcCompliant = true
----------------------------
Register JDBC-ODBC driver ok.
null
java.lang.NullPointerException
        at sun.jdbc.odbc.JdbcOdbcDriver.initialize(JdbcOdbcDriver.java:436)
java.lang.NullPointerException
        at sun.jdbc.odbc.JdbcOdbcDriver.connect(JdbcOdbcDriver.java:153)
        at java.sql.DriverManager.getConnection(DriverManager.java:582)
        at java.sql.DriverManager.getConnection(DriverManager.java:185)        
        at java.awt.AWTEventMulticaster.mouseClicked(AWTEventMulticaster.java:253)
        at java.awt.Component.processMouseEvent(Component.java:6041)
        at javax.swing.JComponent.processMouseEvent(JComponent.java:3265)
        at java.awt.Component.processEvent(Component.java:5803)
        at java.awt.Container.processEvent(Container.java:2058)
        at java.awt.Component.dispatchEventImpl(Component.java:4410)
        at java.awt.Container.dispatchEventImpl(Container.java:2116)
        at java.awt.Component.dispatchEvent(Component.java:4240)
        at java.awt.LightweightDispatcher.retargetMouseEvent(Container.java:4322)
        at java.awt.LightweightDispatcher.processMouseEvent(Container.java:3995)
        at java.awt.LightweightDispatcher.dispatchEvent(Container.java:3916)
        at java.awt.Container.dispatchEventImpl(Container.java:2102)
        at java.awt.Window.dispatchEventImpl(Window.java:2429)
        at java.awt.Component.dispatchEvent(Component.java:4240)
        at java.awt.EventQueue.dispatchEvent(EventQueue.java:599)
        at java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:273)
        at java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:183)
        at java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:173)
        at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:168)
        at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:160)
        at java.awt.EventDispatchThread.run(EventDispatchThread.java:121)

===========================================

Und wenn ich den Code umarbeite auf:


```
DbUrl = "/Buecher.mdb";
java.sql.Connection cn = DriverManager.getConnection(DbUrl,"","");
```

Dann sagt er mir folgendes:

JDBC-ODBC driver loaded ok.
----------------------------
Driver Name = sun.jdbc.odbc.JdbcOdbcDriver
 MajorVersion = 2
minorVersion = 1
isJdbcCompliant = true
----------------------------
Register JDBC-ODBC driver ok.
Verbindung ist fehlgeschlagen: No suitable driver found for /Buecher.mdb
Kein Server vorhanden!

===========================================

In Windows läuft das ganze nur mit Java und das OS startet auch kein MSACCESS oder so, sondern es läuft nur das Java Programm auch bei der Auslastung sieht man im Taskmanager das kein anderes Programm gestartet wird oder die CPU in Anspruch nimmt. In Linux dachte ich mir muss es ja dann ähnlich gehen ohne DB Server, da in Windows ja auch keiner läuft.

Weiss jemand etwas über das Problem Warum er mir einen Fehler anzeigt und/ oder Wie ich Ihn beheben kann!?

Ich habe schon ausgeschlossen das dass herüber kopieren der Buecher.mdb Datei die Datei beschädigt hat, in dem ich mir mit mdbtools diese Datei anzeigen lassen habe.

Über dass Problem findet man jede Menge Threads aber keines das eine Lösung beinhaltet. Teile dieser Threads sind von 2004 - 2005 und auch 2006 und 2007.

Aber niemand weiss bisher woran das liegen könnte denn nirgends habe ich dazu eine eindeutige Antwort finden können.

Ich hoffe Ihr könnt mir helfen aber das Problem scheint sich über Jahre hinweg als sehr hartnäckig erwiesen zu haben.


Wenn ihr einen Server kennt, unter Linux, der *.mdb Dateien laden kann, dann gebt mir bitte bescheid, denn das wäre eine Alternative.

CU Micha


----------



## slotyman (16. Januar 2008)

Vielleicht hilft dir dies weiter

http://rmijdbc.objectweb.org/Access/access.html


----------



## kschmidt (17. Januar 2008)

Versuche es doch mal mit Talend Open Studio(Open Source).
Dort kannst Du deinen Prozess direkt aufbauen und als Java-Quellcode exportieren.
Der Export umfasst gleich noch eine *.bat und ein *.sh.
Ich habe bis jetzt nur gute Erfahrungen gesammelt.

ks


----------



## nathaniells freak (18. Januar 2008)

Nach längerer Betrachtung dieses Problems sind mir einige Dinge aufgefallen und klar geworden.

Also als erstes Windows + Java:
- Warum es hier funktioniert ist ganz klar das Java eine Instanz von Access oder von (*.dll's) läd die nicht im Taskmanager auftauchen. Das kann man daran sehen das die Access Files ordentlich, wie zur Bearbeitung mit Access selber eine zusätzliche Verknüpfung angelegen um die Datensatz Sperrung zu signalisieren. 
==>  ERGO: IM Hintergrund befindet sich zumindestens eine Art Server der die SQL Anfragen verarbeitet.
==>  ERGO: Java verarbeitet diese Datei nicht allein sondern nur im Verbund mit einem Server.

Im Linux kann es daher nicht gehen, da Access oder dessen (dll's) nicht verfügbar sind.

Die Vermutung das der Zeichensatz sich geändert hat, damit die befindlichen Zeichen der Datei und somit ein Laden der Datei verhindert wird war falsch, weil die *.mdb Datei mit dem Linux Programm "mdbtools" geladen und ordentlich gelesen werden konnte.

Wenn jemand ein Linux Datenbank Server kennt der *.mdb Dateien lesen kann ohne Sie vorher zu konvertieren wäre ich sehr Dankbar dafür!

Wenn jemand einen Treiber kennt, für Java, der es ermöglicht von Linux auf einen MS SQL Server zu zugreifen würde ich auch darüber freuen.

CU Micha


----------



## langmar (9. Dezember 2008)

Hallo,

hast du hier inzwischen eine Lösung gefunden?
Ich muss von ner Sun auf eine im Netz liegende Access DB zugreifen. Von nem Windows-Rechner aus läuft das bereits...

gruss & danke
martin


----------

