2015-05-04 170 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在尝试使用它们之前未能检查命令行参数的数量,而更高版本修复了这个缺陷。

相关问题