Daten via JDBC-ODBC Brigde auslesen

Ich versuche gerade Daten aus einer MS Access-DB auszulesen. Geht unter Windows problemlos, unter Linux krieg ich folgende Exception beim Aufruf:

java.sql.SQLException: [unixODBC][Driver Manager]Data source name not found, and no default driver specified
at sun.jdbc.odbc.JdbcOdbc.createSQLException(JdbcOdbc.java:6957)
at sun.jdbc.odbc.JdbcOdbc.standardError(JdbcOdbc.java:7114)
at sun.jdbc.odbc.JdbcOdbc.SQLDriverConnect(JdbcOdbc.java:3073)
at sun.jdbc.odbc.JdbcOdbcConnection.initialize(JdbcOdbcConnection.java:323)
at sun.jdbc.odbc.JdbcOdbcDriver.connect(JdbcOdbcDriver.java:174)
at java.sql.DriverManager.getConnection(DriverManager.java:582)
at java.sql.DriverManager.getConnection(DriverManager.java:207)
at MyConnection.getConnection(JDBCapp.java:43)
at JDBCapp.main(JDBCapp.java:13)

Hab bereits etwas gegoogelt und ein paar Threads diesbezüglich im Sun Developer Forum gefunden, die konnten mir allerdings leider auch net weiterhelfen.

Hier der Code:

import java.sql.Connection;
import java.sql.Driver;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.Statement;

class JDBCapp  {
    static Connection theConn;
    
    public static void main (String args[]) {
        try {
            theConn = MyConnection.getConnection();
            
            ResultSet rs;
            Statement stmt;
            String sql;
            sql =  "SELECT * FROM Categories";
            stmt = theConn.createStatement();
            rs = stmt.executeQuery(sql);
            
            while (rs.next()) {
                System.out.println(rs.getString("CategoryName"));
            }
            rs.close();
            stmt.close();
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            try {
                if (theConn != null) theConn.close();
            } catch (Exception e) {}
        }
    }
}

class MyConnection {
  public static Connection getConnection() throws Exception {
	  String db = "./BugTypes.mdb";
	  DriverManager.registerDriver(new sun.jdbc.odbc.JdbcOdbcDriver());
	  Driver d = (Driver)Class.forName("sun.jdbc.odbc.JdbcOdbcDriver").newInstance();
      Connection c = DriverManager.getConnection("jdbc:odbc:Driver={Microsoft Access Driver (*.mdb)};DBQ="+db);
      return c;    
    }
}

hmm also das

 DriverManager.registerDriver(new sun.jdbc.odbc.JdbcOdbcDriver());
	  Driver d = (Driver)Class.forName("sun.jdbc.odbc.JdbcOdbcDriver").newInstance();

kannst du abkürzen zu

Class.forName("sun.jdbc.odbc.JdbcOdbcDriver");

und probier als Pfad mal nur BugTypes.mdb

geht leider auch nicht :frowning:

Ich habe mal für ein RMI-Projekt ein Applet mit einer Access-DB verbunden.
Allerdings war das auch ein Windows-System. Aber vielleicht funktioniert ja folgende Methode, die ich für die Verbindung geschrieben habe:

      throws RemoteException, SQLException, ClassNotFoundException {
      
      dbFile = new File(filename);
      
      String database = "jdbc:odbc:Driver={Microsoft Access Driver (*.mdb)};DBQ=";
      database += filename.trim() + ";DriverID=22;READONLY=false}";      

      Class.forName("sun.jdbc.odbc.JdbcOdbcDriver");
      con = DriverManager.getConnection(database, user, passwd);
      
      return true;
   }```

Für deine Zwecke umgewandelt könnte funktionieren:
```   public boolean connect(String filename, String user, String passwd)
      throws SQLException, ClassNotFoundException {
      
      String database = "jdbc:odbc:Driver={Microsoft Access Driver (*.mdb)};DBQ=";
      database += filename.trim() + ";DriverID=22;READONLY=false}";      

      Class.forName("sun.jdbc.odbc.JdbcOdbcDriver");
      con = DriverManager.getConnection(database, user, passwd);
      
      return true;
   }```

Geht leider auch nicht :frowning:

Mein jetztiger Code:


class JDBCapp  {
    static Connection theConn;
    
    public static void main (String args[]) {
        try {
            theConn = MyConnection.getConnection();
            
            ResultSet rs;
            Statement stmt;
            String sql;
            sql =  "SELECT * FROM Categories";
            stmt = theConn.createStatement();
            rs = stmt.executeQuery(sql);
            
            while (rs.next()) {
                System.out.println(rs.getString("CategoryName"));
            }
            rs.close();
            stmt.close();
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            try {
                if (theConn != null) theConn.close();
            } catch (Exception e) {}
        }
    }
}

class MyConnection {
  public static Connection getConnection() throws SQLException, ClassNotFoundException {
      //String db = "D:\\labor\\java\\database\\BugTypes.mdb";
	  String user = "";
	  String passwd = "";
	  String db = "BugTypes.mdb";
	  String database = "jdbc:odbc:Driver={Microsoft Access Driver (*.mdb)};DBQ=";
      database += db.trim()+";DriverID=22;READONLY=false}";     
      Class.forName("sun.jdbc.odbc.JdbcOdbcDriver");
      
      Connection con = DriverManager.getConnection(database, user, passwd);
      return con;    
    }
}```

Sobald ich mein Linux halbwegs wieder instand gesetzt habe, werde ich mal das RMI-Projekt darauf ausprobieren. Kann noch ein paar Tage dauern.

Ich habe heute mal meine RMI-Anwendung (Zugriff per Java-Applet über einen RMI-Server auf eine Access-Datenbank), die unter Windows problemlos läuft, mal auf mein Ubuntu kopiert. Die Anwendung (Server) ließ sich problemlos starten, das Applet erreichte auch den Server, meldete aber, dass kein Zugriff auf die Datenbank möglich wäre.

Hier mal die getMessage()-Ausgabe der SQLException:

[unixODBC][Driver Manager]Data source name not found, and no default driver specified

Es sieht also ganz so aus, als ob Access-Datenbanken wirklich nicht unter Linux funktionieren würden…

falls es dir nur darum geht eine DB zu haben sieh dir mal HSQLDB, H2 oder Derby an, wobei ich bisher nur HSQLDB gearbeitet hab.

Das Problem bei dieser Sache ist, dass ich das für mein Praktikum mache und deswegen mehr oder weniger an diese Access-DB gebunden bin. Ich persönlich würde niemals eine MDB verwenden!!
Ein weiteres Kriterium ist, dann keine extra Software installiert werden muss - Java 5 ist vorinstalliert.

hmm wird noch von wo anders auf die DB zugegriffen?

Bei den genannten DBs muss auch nichts installiert werden, einfach ansprechen und sie sind da (Ich will mich nicht festlegen, da ich nur HSQLDB kenn aber ich gehe davon aus dass die anderen ähnlich sind)

Nein, in diesem Fall wird keine multiuserfähige Datenbank benötigt! Die Mitarbeiterliste wird in der Regel nur von einer Person gewartet. Ich hab in der Zwischenzeit eine Übergangslösung mit ActiveX programmiert (JScript und HTML als HTML-Application), die braucht allerdings ungefähr 20 Sekunden für ~350 Mitarbeiter.
Da stellt sich die Frage um wieviel Java da schneller sein würde, und ob es sich jetzt überhaupt noch ausszahlt ein neues Programm zu schreiben, dass im Endeffekt nur wenige Sekunden schneller läuft? -_-

ne es geht nur darum ob die von einem anderen Programm noch geöffnet werden soll.
Du kannst davon ausgehen das Java schneller sein wird :wink:
Ich denke du hast das Programm schon fertig nur das mit der DB muckt unter Linux rum? Weil soweit ich weiß geht ActiveX unter Linux doch garnicht?
Wenn du das Programm auf HSQLDB oder so umstellst musst du nahezu nichts außer dem DB Treiber ändern.

Nun, es ist so, das ActiveX-Programm hab ich in der Arbeit programmiert (Win2000), dort habe ich allerdings keinen Java-Compiler zur Verfügung, dh ich müsste es zu Hause programmieren!
Da ich aber eigentlich ausschließlich unter Linux arbeite, möchte ich dazu nicht extra Windows booten müssen -_-

nimm eclipse da haste einen Compiler dabei :wink: