2013-07-25 196 views
-1

我正在使用Oracle Express Edition在JAVA/SQL中使用項目。該代碼有沒有編譯錯誤,但是當我嘗試運行它,我得到一個錯誤,指出:數據庫連接錯誤JDBC

失敗call.XE.SYS.DBMS_FEATURE_TEST_PROC_1

這裏是我的代碼:

import java.sql.*; 
import javax.sql.*; 

public class StudentAverages { 
public static void main(String[] args) { 

    try { 
     Class.forName("sun.jdbc.odbc.JdbcOdbcDriver"); 
     Connection con = DriverManager.getConnection("jdbc:oracle:driver_type:[username/password]@//host_name:port_number:SID"); 
     Statement st = con.createStatement(); 
     ResultSet rs = st.executeQuery("Select * from [Sheet1$]"); 

     ResultSetMetaData rsmd = rs.getMetaData(); 
     int numberOfColumns = rsmd.getColumnCount(); 


     while (rs.next()) { 

      for (int i = 1; i <= numberOfColumns; i++) { 
       if (i > 1) 
        System.out.print(", "); 
       String columnValue = rs.getString(i); 
       System.out.print(columnValue); 
      } 
      System.out.println(""); 
     } 

     st.close(); 
     con.close(); 

    } catch (Exception ex) { 
     System.err.print("Exception: "); 
     System.err.println(ex.getMessage()); 
    } 



} 
     public void StudentMean(Connection con, Statement st, ResultSet rs) throws SQLException{ 

       try{ 
     Statement stOne, stTwo, stThree, stFour; 
     String SelectAverage = "SELECT MEAN FROM STUDENTS"; 
      ResultSet rsOne = stOne.executeQuery(SelectAverage); 

    String TotalAverage = "SELECT Avg(MEAN) AS averages FROM STUDENTS"; 
      ResultSet rsTwo = stTwo.executeQuery(TotalAverage);  

      String student_stan_dev = "SELECT STDEV(MEAN) AS standardDeviation FROM STUDENTS"; 
      ResultSet rsThree = stThree.executeQuery(student_stan_dev); 

      int onesdMean = 1; 


      //Loop Duration_Sec column 
      while(rsOne.next()){ 

      //Convert values into float values 
      allAvgs = rsOne.getFloat("MEAN"); 
      totalAvg = rsTwo.getFloat("averages"); 
      StDev = rsThree.getFloat("standardDeviation"); 
      } 

        //Calculate one standard deviation away from mean 
        theSD = allAvgs - (onesdMean * StDev); 


         //Create a new column 
     String flaggedStudents = "ALTER TABLE STUDENTS ADD FlaggedStudents INT"; 
     ResultSet rsFour = stFour.executeUpdate(flaggedStudents); 

      if(allAvgs >= theSD){ 

          //Flag students who meet the criteria 
       String FlagHint = "INSERT INTO STUDENTS.FlaggedStudents VALUES('1')"; 
       st.executeUpdate(FlagHint); 
      } 

        //Count the students who meet the criteria and add those students 
        //to a new table 

     String countInstances = "SELECT STUDENTS.NAME, STUDENTS.FlaggedStudents" + 
       "COUNT(*)OVER(PARTITION BY STUDENTS) AS cnt FROM STUDENTS"; 
      st.executeQuery(countInstances); 


     st.executeUpdate("CREATE TABLE IF NOT EXISTS StudentCount" + 
     "(NAME INT , cnt INT)"); 

     String insertVals = String.format("INSERT INTO StudentCount" + 
       "(NAME , cnt INT") + 
       " VALUES ('%s','%s')"); 

     st.execute(insertVals); 
} 
    catch(SQLException e){ 
    e.printStackTrace(); 
    } 

}

什麼是造成這個錯誤,我怎樣才能讓我的項目運行?我正在使用瘦驅動程序。任何幫助,將不勝感激。

enter image description here

Stack Trace: 
    java.lang.ClassNotFoundException: oracle.jdbc.OracleDriver 
     at java.net.URLClassLoader$1.run(Unknown Source) 
     at java.net.URLClassLoader$1.run(Unknown Source) 
     at java.security.AccessController.doPrivileged(Native Method) 
     at java.net.URLClassLoader.findClass(Unknown Source) 
     at java.lang.ClassLoader.loadClass(Unknown Source) 
     at sun.misc.Launcher$AppClassLoader.loadClass(Unknown Source) 
     at java.lang.ClassLoader.loadClass(Unknown Source) 
     at java.lang.Class.forName0(Native Method) 
     at java.lang.Class.forName(Unknown Source) 
     at StudentAverages.main(StudentAverages.java:23) 
exception : 
java.sql.SQLException: No suitable driver found for jdbc:oracle:driver_type:[username/password]@//host_name:port_number:SID 
     at java.sql.DriverManager.getConnection(Unknown Source) 
     at java.sql.DriverManager.getConnection(Unknown Source) 
     at StudentAverages.main(StudentAverages.java:31) 
+0

哪一行導致錯誤?請,我們不坐在你旁邊看着你的ide ... –

+0

請發佈堆棧跟蹤消息,以更好地理解問題。此外,這將有助於瞭解出現錯誤的行號。 –

+0

可能有多少地方可能會發生「例外」。我最好的猜測是'FlagHint'的'SQLException'。你應該在那裏提供'columname'。 – Smit

回答

1

ALTER TABLE將學生加入FlaggedStudents INT
CREATE TABLE IF NOT EXISTS StudentCount」 + 「(NAME INT,CNT INT
INSERT INTO StudentCount」 +「(NAME,cnt INT

上面的命令不會在Oracle上運行。 INT數據類型不受支持,IF NOT EXISTS子句是MySql語法。
首先正確的SQL命令,並檢查它們是否在像SQLDeveloper或Toad這樣的Oracle客戶端上工作,然後在您的java代碼中嘗試它們。

+0

我嘗試了你的建議並修復了不匹配的命令(我是數據庫編程的新手,並且不知道某些SQL語句不受特定數據庫支持),所以非常感謝!我使用@ Joev的建議(從命令提示符編譯)再次編譯我的程序。我仍然收到錯誤'異常:oracle.jdbc.OracleDriver'這是從我的主要方法中的catch語句打印。 – user2554121

+0

設置一個斷點並逐行執行代碼以查找哪個語句引發該異常。更好 - 圍繞try {{} catch(SQLException)中的每條語句並以某種方式記錄錯誤消息(例如記錄到日誌文件),使用log4j甚至java.itil.logger。現在你的代碼使用e.printStackTrace();打印堆棧跟蹤到控制檯,這不是很有用。爲了找到問題,我們必須知道哪個語句會拋出錯誤,錯誤編號/描述是什麼。例外:oracle.jdbc.OracleDriver告訴我們什麼都沒有。 – krokodilko

+0

謝謝。我嘗試了你的建議,現在發佈了堆棧跟蹤。 – user2554121

0

你應該嘗試這些步驟

  1. 檢查Oracle驅動程序(ojdbc6.jar或ojdbc14.jar)文件是在你的項目中可用,當您使用的是Oracle 10g或11g classpath.You應該使用ojdb6.jar。
  2. 改變這些線

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

    Class.forName("oracle.jdbc.driver.OracleDriver"); 
    
  3. 而且還要檢查數據庫URL模式見參考文獻link