2017-12-18 4 views
-2

Ich habe das folgende Problem mit der Ausführung von JDBC Oracle von der Befehlszeile. Wenn ich den folgenden Code in IntelliJ laufen, funktioniert es wie ein Zauber, aber wenn ich versuche es über Kommandozeile laufen mitAusführen eines JDBC Oracle Java-Programm aus cmd Zeile

java UserInterface filldb 

ich den follwing Fehler:

An error occured: oracle.jdbc.driver.OracleDriver

Wie führe ich dieses Programm von der Befehlszeile?

import java.sql.*; 
import java.util.List; 

import oracle.jdbc.driver.*; 

import javax.security.auth.callback.ConfirmationCallback; 


final public class DatabaseDAO implements DAO { 

    private String database; 
    private String user; 
    private String pass; 

    // establish connection to database 
    private Connection con; 
    private Statement stmt; 

    DatabaseDAO() throws ClassNotFoundException, SQLException{ 
     // load drivers and save user data 
     Class.forName("oracle.jdbc.driver.OracleDriver"); 
     database = "jdbc:oracle:thin:@oracle-lab.cs.univie.ac.at:1521:lab"; 
     user = "*****"; 
     pass = "*****"; 
    } 

    public void openConnection(String user, String database, String pass) throws SQLException{ 
      con = DriverManager.getConnection(database, user, pass); 
      stmt = con.createStatement(); 
    } 

    public void openConnection() throws SQLException{ 
     openConnection(user, database, pass); 
    } 

    public void closeConnection() { //local exception handling so method can be called in finally block, seems safer 
     try { 
      stmt.close(); 
      con.close(); 
     } 
     catch (Exception e) { 
      System.err.println("Fehler beim Verbindungsabbau in DatabaseDAO.closeConnection(): " + e.getMessage()); 
      System.exit(1); 
     } 

    } 

    private void printTableSize(String tablename) throws SQLException { 
     ResultSet rs = stmt.executeQuery("SELECT COUNT(*) FROM " + tablename); 
     if (rs.next()) { 
      int count = rs.getInt(1); 
      System.out.println("Number of datasets in table " + tablename + ": "+ count); 
     } 
     rs.close(); 
    } 

    private boolean insertSQL (String values, String tablename) throws SQLException { 
     String insertSql = "INSERT INTO " + tablename + " VALUES " + values; 
     stmt.executeUpdate(insertSql); 
     return true; 
    } 

    public void flushTable(String tablename) throws SQLException{ 
     stmt.executeQuery("DELETE FROM " + tablename); 
    } 

    public void flushDatabase() throws SQLException { 
     for (Relation r : Relation.values()) 
      flushTable(r.toString()); 
    } 
/* 
    public ArrayList<String> getDatabaseEntry(int type, List<String> key) throws ClassNotFoundException, SQLException, IllegalArgumentException { 

    } 
*/ 
/* 
    public boolean deleteDatabaseEntry(List<String> key) throws ClassNotFoundException, SQLException, IllegalArgumentException{} 
*/ 
    public boolean saveDatabaseEntry(Relation type, DatabaseObject entry){ 
     boolean success = false; 
     try{ 
      switch (type) { 
       case Firma: { 
        Firma e = (Firma)entry; 
        String values = "(" + e.getSteuerbuchummer() + "," + e.getName() + "," + e.getFirmenbuchnummer() + ")"; 
        printTableSize(Relation.Firma.toString()); 
        success = insertSQL(values, Relation.Firma.toString()); 
       } break; 
       case Template: { 
        Template e = (Template) entry; 
        String values = "(" + e.getUrl() + "," + e.getSprache() + "," + e.getIp() + ")"; 
        printTableSize(Relation.Template.toString()); 
        success = insertSQL(values, Relation.Template.toString()); 
       } break; 
       case verwendet: { 
        verwendet e = (verwendet) entry; 
        String values = "(" + e.getSteuerbuchummer() + "," + e.getUrl() + ")"; 
        printTableSize(Relation.verwendet.toString()); 
        success = insertSQL(values, Relation.verwendet.toString()); 
       } break; 
       case Unterseite: { 
        Unterseite e = (Unterseite) entry; 
        String values = "(" + e.getUrl() + "," + e.getPfad() + ")"; 
        printTableSize(Relation.Unterseite.toString()); 
        success = insertSQL(values, Relation.Unterseite.toString()); 
       } break; 
       case Verkaufsseite: { 
        Verkaufsseite e = (Verkaufsseite) entry; 
        String values = "(" + e.getUrl() + "," + e.getPfad() + ", " + e.getTitel() + ")"; 
        printTableSize(Relation.Verkaufsseite.toString()); 
        success = insertSQL(values, Relation.Verkaufsseite.toString()); 
       } break; 
       case UserAccount: { 
        UserAccount e = (UserAccount) entry; 
        String values = "(" + e.getEmail() + "," + e.getUserID() + ", " + e.getBankdaten() + ", " + e.getAdresse() + ")"; 
        printTableSize(Relation.UserAccount.toString()); 
        success = insertSQL(values, Relation.UserAccount.toString()); 
       } break; 
       case befreundet: { 
        befreundet e = (befreundet) entry; 
        String values = "(" + e.getUserID1() + "," + e.getUserID2() + ")"; 
        printTableSize(Relation.befreundet.toString()); 
        success = insertSQL(values, Relation.befreundet.toString()); 
       } break; 
       case Produkt: { 
        Produkt e = (Produkt) entry; 
        String values = "(" + e.getProduktID() + "," + e.getPreis() + "," + e.getProduktname() + ")"; 
        printTableSize(Relation.Produkt.toString()); 
        success = insertSQL(values, Relation.Produkt.toString()); 
       } break; 
       case kauftEin: { 
        kauftEin e = (kauftEin) entry; 
        String values = "(" + e.getUrl() + "," + e.getUserID() + "," + e.getPfad() + "," + e.getProduktID() + "," + e.getAnzahl() + ")"; 
        printTableSize(Relation.kauftEin.toString()); 
        success = insertSQL(values, Relation.kauftEin.toString()); 
       } break; 
       default: 
        throw new IllegalArgumentException("Parameter ungueltig in DatabaseDAO.saveDatabaseEntry(Relation type, DatabaseObject entry)."); 
      } 
     } 
     catch (Exception e) 
     { 
      System.err.println("Fehler beim Einfuegen des Datensatzes in DatabaseDAO.saveDatabaseEntry(Relation type, DatabaseObject entry): " + e.getMessage()); 
      success = false; 
     } 
     return success; 
    } 

    public Connection getCon() { 
     return con; 
    } 

    public Statement getStmt() { 
     return stmt; 
    } 
} 

Hier ist die Hauptklasse:

import java.sql.SQLException; 

public class UserInterface { 
    private enum Command { 
     filldb, flushdb 
    } 

    private static final Command checkInput(String s){ 
     Command[] command = Command.values(); 
     for(int i = 0; i < command.length; i++) if (command[i].toString().equals(s)) return command[i]; 
     throw new IllegalArgumentException("Commandline Parameter nicht erkannt. Kommandos: filldb, flushdb"); 
    } 

    public static void main(String args[]) { 
     DatabaseDAO db = null; 
     try { 
      Command command = checkInput(args[0]); 
      switch(command){ 
       case filldb: { 
        System.out.println("Initializing DB."); 

        db = new DatabaseDAO(); 
        db.openConnection(); 

        System.out.println("Done.\nGenerating data and filling DB (this may take a few minutes)."); 
        TestDataGenerator tdg = new TestDataGenerator(db); 
        tdg.testData(Relation.Firma, 2000); 
        tdg.testData(Relation.Template, 2000); 
        tdg.testData(Relation.verwendet, 500); 
        tdg.testData(Relation.Unterseite, 1000); 
        tdg.testData(Relation.Verkaufsseite, 1000); 
        tdg.testData(Relation.UserAccount, 3000); 
        tdg.testData(Relation.Produkt, 4000); 
        tdg.testData(Relation.befreundet, 500); 
        tdg.testData(Relation.kauftEin, 1000); 

        System.out.println("Done. DB is now filled with several thousand entries."); 
       } break; 
       case flushdb: { 
        System.out.println("Flushing DB"); 
        db.flushDatabase(); 
       } 
      } 
     } 
     catch (SQLException e) { 
      System.err.println("Ein Fehler ist bei der Kommunikation mit der Datenbank aufgetreten: "+ e.getMessage()); 
      System.exit(1); 
     } 
     catch (ClassNotFoundException e) { 
      System.out.println("Klasse nicht gefunden: " + e.getMessage()); 
      System.exit(1); 
     } 
     catch (Exception e) { 
      System.err.println("Ein Fehler ist aufgetreten: "+ e.getMessage()); 
      System.exit(1); 
     } 
     finally{ 
      if (!db.equals(null)) db.closeConnection(); 
      System.exit(0); 
     } 
    } 
} 
+4

Stellen Sie sicher, dass sich der JDBC-Treiber (und alle anderen abhängigen Bibliotheken) im Klassenpfad befinden. Wenn dieses Projekt in ein Jar exportiert wurde, müssen Sie sicherstellen, dass das Element 'class-path' in der Datei' META/manifiest.mf' existiert und dass die Jars an der angegebenen relativen Position – MadProgrammer

+2

verfügbar sind Vielleicht müssen Sie das Argument -cp in Ihrer Befehlszeile verwenden. – duffymo

Antwort

1

Sie benötigen einen Classpath angeben, die die Oracle-Treiber enthält, Java ist derzeit nur für die Klassen im aktuellen Verzeichnis und eine eigene Laufzeit suchen.

Für Fenster

java -cp .;C:\dummypath\ojdbc8.jar UserInterface filldb 

Für Linux

java -cp .:/dummypath/ojdbc8.jar UserInterface filldb 

Die . legt fest, stellt sicher, dass das aktuelle Verzeichnis nach wie vor auf dem Classpath ist, und C:\dummypath\ oder /dummypath/ Bedürfnisse mit der realen Lage ersetzt werden Ihre Oracle-Treiberglas.

Hinweis: Ich merke, dass Ihre Klasse UserInterface nicht in einem Paket ist, dies kann für triviale Programme ausreichen, aber Sie sollten sich wirklich angewöhnen, Pakete zu verwenden.

+0

Danke! Ich habe deinen Rat bezüglich der Kompilierung und Ausführung des Proramms von der Kommandozeile aus versucht, aber ich war noch nicht erfolgreich. Der Fehler sieht jetzt so aus: java -cp.:/Home/lorenz/Code/dbs_java_l/dbs_java_l/ojdbC4.jar UserInterface filldb Initialisierung der DB. Ein Fehler ist aufgetreten: oracle.jdbc.driver.OracleDriver Wenn ich versuche, mit Optionen zu kompilieren i erhalten: javac -cp:./Home/lorenz/Code/dbs_java_l/dbs_java_l/ojdbC4.jar UserInterface.java ./DatabaseDAO.java:4: Fehler: Paket oracle.jdbc.driver existiert nicht import oracle.jdbc.driver. *; ^ 1 Fehler –

+0

Danke für den Rat bezüglich der Pakete obwohl. Sie haben recht, größere Programme sollten mit Paketen bestellt werden. –

+0

Es gibt keine ojdbc4.jar (oder zumindest nicht in der Standardbenennung von Oracle), vielleicht meintest du ojdbc14.jar (was sehr alt ist, für Java 1.4)? Nicht relevant für dieses Problem, aber die Tatsache, dass Sie 'oracle.jdbc.driver importieren.* 'ist normalerweise ein schlechtes Zeichen, Sie sollten fast nie treiberspezifische Pakete importieren. –

0

Die Lösung der Frage ist eine Klasse Pfad angeben, wenn die Hauptklasse Ausführung:

java -cp./Home/lorenz/Code/dbs_java_l/dbs_java_l/ojdbc14.jar Userinterface filldb

Danke an alle für ihre Hilfe.