2015-05-04 167 views
1

我收到以下錯誤導入CSV文件到Oracle數據庫中使用Java

Java.lang.ArrayIndexOutOfBoundsException: 0 
    at oracle.jdbc.driver.OracleSql.main(OracleSql.java:1614) 

我使用的Eclipse靛藍和Oracle我10g.how可以解決此問題problem.can誰能幫助我?

我要加載CSV文件到Oracle數據庫.. 我已經創建了一個名爲ZT表有三列(ID,s_date,數據) CSV數據包含如下:

a1,2015-04-15 17:40:20.0,18.5786  
    a2,2015-04-15 16:20:59.0,16.7868 
    a3,2015-03-15 16:20:59.0,16.51689  
    a4,2015-04-16 16:20:55.0,24.789028 
    a5,2015-02-15 17:55:59.0,28.784145 

代碼

import java.io.FileReader;  
import java.sql.Connection;  
import java.sql.DriverManager;  
import java.sql.PreparedStatement; 
import java.sql.Statement; 
import au.com.bytecode.opencsv.CSVReader; 

public class ImportTest { 
    public static void main(String[] args) { 
     // TODO Auto-generated method stub 
     readCsv(); 
    } 

    public static void readCsv() { 
     try { 
      Class.forName("oracle.jdbc.driver.OracleDriver"); 
      Connection conn  =DriverManager.getConnection("jdbc:oracle:thin:@localhost:1521/xe","system","arry"); 
      PreparedStatement pstmt =conn.prepareStatement("Insert into zt values(?,?,?)"); 

      CSVReader reader = new CSVReader(new FileReader("D:\\zzzzzzzz.csv"), ','); 
      String[] nextLine; 
      int i = 0; 
      while((nextLine = reader.readNext()) != null) { 
       i++; 
       pstmt.setString(1,nextLine[0]); 
       pstmt.setString(2,nextLine[1]); 
       pstmt.setDouble(3,Double.parseDouble(nextLine[2])); 
      } 

      pstmt.close(); 
      conn.commit(); 
      conn.close(); 
     } catch(Exception e) { 
      e.printStackTrace();  
     } 
    } 
} 
+0

發佈完整的異常堆棧跟蹤。 – Aakash

+0

發佈完整的堆棧跟蹤。但有可能你正在訪問'nextLine'中不存在的索引。 – Shahzeb

回答

1

對於初學者來說,你有

pstmt.setString(1,nextLine[0]); 
pstmt.setString(1,nextLine[1]); 
pstmt.setDouble(2,Double.parseDouble(nextLine[2])) 

注意你重複參數的一個兩次,如果異常是從數據庫來那麼這很可能是原因。

更在Java中超過

IndexOutOfBoundsException是一個運行時異常。作爲在doc

拋出,表明說,有些排序索引(如陣列,以 一個字符串,或向量)超出範圍。應用程序可以繼承 這個類來表示類似的例外。

很明顯,您正在訪問數組的索引而不先檢查。永遠是一件危險的事情。

我也同意你的CSV文件似乎並不正確,但無論哪種方式,你的問題不僅限於此,你應該防範它。我已經添加代碼來顯示一個基本保障

只要把對長度的檢查在while循環像下面

while((nextLine = reader.readNext()) != null){ 
      i++; 
       // Remember length 3 = index 2 
       if (nextLine.length == 3){ 
        pstmt.setString(1,nextLine[0]); 
        //I have changed it to 2 from 1 
        pstmt.setString(2,nextLine[1]); 
        pstmt.setDouble(2,Double.parseDouble(nextLine[2])); 
      } 
    } 
+0

感謝您的解決方案。但得到一個更多的錯誤顯示...... java.sql.SQLException:ORA-01843:不是一個有效的月份.....創建表時s_date數據類型被視爲時間戳... pstmt.setString(2 ,nextLine [1]);我如何在表格中插入日期和時間? @shahzeb – ARoy

1

這很簡單。您正在使用CSVReader並將逗號(',')作爲字段分隔符,但是您向我們展示的4個示例行不包含任何逗號。

這樣一行'a1 2015-04-15 17:40:20.0 18.5786'拆分','將只是一個包含整行的字符串。

嚴格來說,您的文件不是CSV。

+0

抱歉..我在發佈時犯了一些錯誤,現在它已被修改。感謝 – ARoy

0

看來你想運行Oracle JDBC驅動程序JAR中的類,而不是你的代碼。

Oracle JDBC JAR確實包含一個類oracle.jdbc.driver.OracleSql,並且此類有一個main方法,因此可以運行此類,但我不認爲這就是您想要執行的操作。

下面是如何重現此錯誤,給予或採取不同的行號:

C:\>java -cp ojdbc14.jar oracle.jdbc.driver.OracleSql 
java.lang.ArrayIndexOutOfBoundsException: 0 
    at oracle.jdbc.driver.OracleSql.main(OracleSql.java:1717) 

這是完整的輸出:我還沒有被截斷的堆棧跟蹤。

我無法用比ojdbc14.jar更新版本的JDBC JAR重現此行爲:我得到了一條使用消息,而不是嘗試使用ojdbc5.jar,ojdbc6.jar和ojdbc7.jar來做同樣的事情。上面的異常堆棧跟蹤表明ojdbc14.jar在嘗試使用它們之前未能檢查命令行參數的數量,而更高版本修復了這個缺陷。

相關問題