2017-12-18 446 views
-2

從命令行運行JDBC oracle時出現以下問題。當我運行中的IntelliJ下面的代碼,它就像一個魅力,但是當我嘗試通過命令行與從cmd行運行JDBC oracle java程序

java UserInterface filldb 

我得到follwing錯誤運行:

An error occured: oracle.jdbc.driver.OracleDriver

如何運行這個程序從命令行?

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; 
    } 
} 

這裏是主類:

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

確保JDBC驅動程序(以及任何其他相關庫)在類路徑中。如果此項目已導出到Jar,則需要確保META/manifiest.mf文件中的'class-path'元素存在,並且該罐子在指定的相對位置 – MadProgrammer

+2

處可用也許你需要在命令行中使用-cp參數。 – duffymo

回答

1

您需要指定包含Oracle驅動程序類路徑,爪哇目前只盯着當前目錄和它自己的運行時間類。

對於windows

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

對於Linux

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

.指定確保當前目錄仍然在類路徑中,C:\dummypath\/dummypath/需要與真正的位置被替換您的Oracle驅動程序jar。

旁註:我注意到你的課程UserInterface不在一個包中,這可能足夠用於微不足道的程序,但你應該養成使用包的習慣。

+0

謝謝!我試圖從命令行編譯和運行proramm,但我還沒有成功。現在的錯誤如下所示: java -cp。:/ home/lorenz/Code/dbs_java_l/dbs_java_l/ojdbC4.jar UserInterface filldb 初始化數據庫。 艾因Fehler IST aufgetreten:oracle.jdbc.driver.OracleDriver 當我嘗試用你的選擇來編譯我得到: 的javac -cp:/家庭/洛倫茨/代碼/ dbs_java_l/dbs_java_l/ojdbC4.jar UserInterface.java ./DatabaseDAO.java:4:錯誤:軟件包oracle.jdbc.driver不存在 import oracle.jdbc.driver。*; ^ 1錯誤 –

+0

感謝有關軟件包的建議。你是對的,更大的程序應該和包一起訂購。 –

+0

沒有ojdbc4.jar(或者至少不在Oracle的標準命名中),也許你的意思是ojdbc14.jar(對於Java 1.4來說這很舊)?與此問題無關,但是您正在導入'oracle.jdbc.driver。*'通常是一個不好的標誌,你應該幾乎不需要導入驅動程序特定的軟件包。 –

0

的解決問題的辦法是指定執行主類,在類路徑:

java命令:/家庭/洛倫茨/代碼/ dbs_java_l/dbs_java_l/ojdbc14.jar的的UserInterface filldb

謝謝大家的幫助。