# Windows: funzt -> Linux: Exceptions



## realzork (30. Okt 2005)

Also unter Windows funktioniert das Programm "einwandfrei".. jedoch unter Linux (Ubuntu und Damn Small Linux /je mit JRE 1.5) bekomm ich folgende exception:



> Exception in thread "main" java.lang.NullPointerException
> at sun.jdbc.odbc.JdbcOdbcDriver.initialize(JdbcOdbcDriver.java:436)
> at sun.jdbc.odbc.JdbcOdbcDriver.connect(JdbcOdbcDriver.java:153)
> at java.sql.DriverManager.getConnection(DriverManager.java:525)
> ...



Das Programm cddb ist ein Informatikprojekt (Schule) und ich bin daher gezwungen die Klasse Datenbankverbindung zu benutzen. Ich verstehe nur nicht warum ich unter Windows keine Fehlermeldung erhalte.

Datenbankverbindung sieht so aus:


```
/**
  * Die Klasse stellt Operationen zur Verwendung von Datenbanken mit Java zur
  * Verfügung.
  * Es handelt sich nicht um eine statische Klasse, es muss also eine Instanz
  * der Klasse erzeugt werden. Dies hat den Vorteil, dass man auch mehrere
  * Verbindungen erzeugen kann (was vor allem notwendig ist, wenn man mit
  * verschiedenen Datenbanken in einem Projekt arbeitet).
  * Neben der Herstellung einer Verbindung gibt es gegen Fehler abgesicherte
  * Methoden zur Übergabe von SQL-Statements an die Datenbank.
  * Nach der Erzeugung einer Datenbankverbindung mit {@link #createVerbindung}
  * bleibt die Verbindung zur Datenbank so lange geöffnet, bis die Verbindung
  * über {@link #closeVerbindung} geschlossen wird.
  * Treten Fehler auf, werden diese auf der Konsole ausgegeben.
  *
  * @author        Ehlert, Griep, Schilling, Blasek, Marwitz, Tischer, Krug
  * @version       1.5 / 15.08.2004 / OSZ Informations- und Medizintechnik
  */

import java.sql.*;

public class Datenbankverbindung {

  private Connection verbindung       = null;         // oder con
  private Statement  sqlSchnittstelle = null;         // oder stmt

  /**
    * Konstruktor: Aufbau der JDBC-ODBC-Bridge.
    */
  public Datenbankverbindung() {
    try {
      Class.forName("sun.jdbc.odbc.JdbcOdbcDriver");
    } // try
    catch (ClassNotFoundException e) {
      System.out.println("Fehler bei JDBC-ODBC-Bridge: " + e.getMessage());
    } // catch
  } // Konstruktor

  /**
    * Baut eine Datenbankverbindung zu einer konkreten Datenbank auf.
    *
    * @param treiberUndDatenbasis   In einem Wort, z.B.: "jdbc:odbc:vhsWedding"
    */
  public void createVerbindung(String treiberUndDatenbasis) {
    try {
      verbindung       = DriverManager.getConnection(treiberUndDatenbasis);
      sqlSchnittstelle = verbindung.createStatement();
    } // try
    catch (SQLException e) {
      System.out.println("Verbindungsfehler zur Datenbank: " + e.getMessage());
    } // catch
  } // createVerbindung

  /**
    * Baut eine Datenbankverbindung zu einer konkreten Datenbank auf.
    *
    * @param treiber     Treiber der Datenbank, z.B.: "jdbc:odbc"
    * @param datenbasis  Datenbasis, z.B. "vhsWedding"
    */
  public void createVerbindung(String treiber, String datenbasis) {
    try {
      verbindung       = DriverManager.getConnection(treiber + ":"+ datenbasis);
      sqlSchnittstelle = verbindung.createStatement();
    } // try
    catch (SQLException e) {
      System.out.println("Verbindungsfehler zur Datenbank: " + e.getMessage());
    } // catch
  } // createVerbindung



  /**
    * Prueft, ob eine Verbindung zur Datenbank vorhanden ist.
    *
    * @return true, wenn eine Verbindung steht, false wenn nicht.
    */
  public boolean isVerbindungAktiv() {
    return (verbindung != null) && (sqlSchnittstelle != null);
  } // isVerbindungAktiv

  /**
    * Beendet die Datenbankverbindung.
    */
  public void closeVerbindung() {
    try {
      sqlSchnittstelle.close();
      verbindung.close();
    } // try
    catch (SQLException e) {
      System.out.println("Fehler bei der DB-Schließung:" + e.getMessage());
    } // catch
  } // closeVerbindung

  /**
    * Führt das übergebende SQL-Statement auf der Datenbank aus.
    * Das Statement darf keine Datensätze zurückgeben, muss also ein
    * Update, Delete oder Insert-Statement sein (oder ein SQL-DDL-Statement).
    *
    * @param sqlStatement    das auszuführende SQL-Statement als String
    * @return die Anzahl der geaenderten Datensaetze.
    *         Bei DDL-Statements wird i.d.R. 0 zurückgegeben.
    */
  public int execDatenAenderung(String sqlStatement) {
    int anzahl = 0;
    try {
      anzahl = sqlSchnittstelle.executeUpdate(sqlStatement);
    } // try
    catch (SQLException e) {
      System.out.println("Fehler bei SQL-Statement: " + e.getMessage());
    } // catch
    return anzahl;
  } // execDatenAenderung

  /**
    * Führt das übergebende SELECT-Statement als Abfrage auf der Datenbank aus.
    * Das Statement muss Datensätze zurückgeben (muss also ein SELECT sein).
    *
    * @param sqlStatement    das auszuführende SQL-Statement als String
    * @return die Ergebnismenge der Abfrage {@link java.sql.ResultSet}
    */
  public ResultSet execDatenAbfrage(String sqlStatement) {
    ResultSet ergebnis = null;
    try {
      ergebnis = sqlSchnittstelle.executeQuery(sqlStatement);
    } // try
    catch (SQLException e) {
      System.out.println("Fehler bei SQL-Abfrage: " + e.getMessage());
    } // catch
    return ergebnis;
  } // execDatenAbfrage

} // Datenbankverbindung
```

Und die aktuelle Datenbank und den Treiber teile ich createVerbindung mit, indem ich 

```
String derTreiberUndDieDatenbasis = "jdbc:odbc:Driver={MicroSoft Access Driver (*.mdb)}; DBQ="
                                                      + System.getProperty("user.dir") + "/CDArchiv_DB.mdb";
```
übergebe. Ich denke hier liegt irgendwie der Fehler. Ich kann aber gern noch zusätzlich den Code von Datenverarbeitung posten. CDDB sollte hierbei unwichtig sein. Ich habe schon zwei andere Programme getestet, wo ich jeweils die selbe Exception erhalte.

Vielen Dank,
r


----------



## bronks (30. Okt 2005)

Das ist merkwürdig. Probier mal folgendes: Installier unter Linux MsAccess und schau nach, ob alle Tabellen in der MDB-Datei vorhanden sind.   

Das kann nicht funktionieren, weil Du auf Linux keinen AccessTreiber hast ...


----------



## realzork (30. Okt 2005)

danke bronks, hab mir auch schon überlegt ob es keinen treiber gibt, aber ich hab gedacht, sowas müsste doch in der jdbcdbc bridge von java drin sein?

und ja, access installieren wäre vielleicht ne möglichkeit.. nur wie? gibt doch kein office für linux oder irre ich mich? und mein normales office für windoof kann ich da ja kaum installieren.


----------



## Bleiglanz (30. Okt 2005)

nein, out-of-the box läuft das Teil nicht auf Linux, du brauchst da einen ODBC-Treiber ...


----------



## bronks (30. Okt 2005)

realzork hat gesagt.:
			
		

> ... und ja, access installieren wäre vielleicht ne möglichkeit.. nur wie? gibt doch kein office für linux oder irre ich mich? und mein normales office für windoof kann ich da ja kaum installieren.


Das war auch nur ein lustiggemeinter Spaß von mir   Ich meine: Das klappt mit Linux nicht.


----------

