tutorials.de Buch-Aktion 05/2012
ERLEDIGT
NEIN
ANTWORTEN
4
ZUGRIFFE
4701
EMPFEHLEN
  • An Twitter übertragen
  • An Facebook übertragen
AUF DIESES THEMA
ANTWORTEN
  1. #1
    nathaniells freak nathaniells freak ist offline Mitglied Silber
    Registriert seit
    Sep 2007
    Beiträge
    50
    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.

    Code java:
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    
    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:

    Code java:
    1
    2
    3
    4
    5
    
    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:

    Code java:
    1
    2
    
    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
     

  2. #2
    slotyman slotyman ist offline Mitglied
    Registriert seit
    Jul 2007
    Beiträge
    18
    Vielleicht hilft dir dies weiter

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

  3. #3
    kschmidt kschmidt ist offline Rookie
    Registriert seit
    Jan 2008
    Beiträge
    7
    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
     

  4. #4
    nathaniells freak nathaniells freak ist offline Mitglied Silber
    Registriert seit
    Sep 2007
    Beiträge
    50
    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
    Geändert von nathaniells freak (18.01.08 um 11:16 Uhr)
     

  5. #5
    langmar langmar ist offline Mitglied
    Registriert seit
    Apr 2007
    Beiträge
    12
    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
     

Ähnliche Themen

  1. Windows XP - MySQL- ODBC Verbindung herstellen. Kein Treiber im ODBC- Datenquellen-A
    Von Thomas_Jung im Forum Relationale Datenbanksysteme
    Antworten: 0
    Letzter Beitrag: 14.12.10, 14:57
  2. jdbc-treiber als odbc-Verbindung darstellen
    Von shutdown im Forum Java
    Antworten: 2
    Letzter Beitrag: 16.11.07, 10:34
  3. ODBC-Bridge erzeugen
    Von dadom110 im Forum Java
    Antworten: 3
    Letzter Beitrag: 08.03.06, 13:13
  4. JDBC / ODBC-Bridge
    Von tinella im Forum Java
    Antworten: 0
    Letzter Beitrag: 29.09.04, 17:23
  5. ODBC Verbindung ohne ODBC-Datenquellen-Administrator
    Von cyriacks im Forum VisualStudio & MFC
    Antworten: 3
    Letzter Beitrag: 06.06.04, 18:19