用Java编写Excel数据到数据库

时间:2013-02-19 08:54:47

标签: java database excel

这是我用来将excel文件数据写入数据库的方法。

public static void executeSQLUpdate(String sql, List<Object> arguments) {
    Connection con = null;
    PreparedStatement pstmt = null;
    try {
        con = getConnection(); //a method that returns a java.sql.Connection to your database
        System.out.println("\n01)conection :"+con);
        pstmt =  con.prepareStatement(sql);
        System.out.println("\n02)pstn :"+pstmt);
        System.out.println( "\n03)arguments size :"+arguments.size());
        if (arguments != null) {
            int i = 1;
            System.out.println( "\n04)if :"+arguments);
            for(Object o : arguments) {
                 System.out.println( "\n05)executeSQLUpdate");
                 System.out.println( "\n06)object."+o);                 
                 System.out.println("\n07)................... :"+i + o);
                 pstmt.setObject(i, o);
                 System.out.println("\n08)____________________"+i+o);

            }
        }
        System.out.print("\n09)errorchk........... :");
        //method to execute insert, update, delete statements...
        pstmt.executeUpdate();
        System.out.print("\n10)+++++++++++++++++ :");
    } catch(SQLException e) {
        System.out.println("\n11)************* :"+e);
        //handle the error...
    } finally {
        //closing the resources (always in finally block, not in the try!)
        try {
            if (pstmt != null) {
                pstmt.close();
            }
            if (con != null) {
                con.close();
            }
        } catch (SQLException e) {
        }
    }
}

最多没有07所有系统都正常工作。但在那之后,任何系统都无法运行。这是什么原因?这个中有错误吗?

这是我的出局:

run:
AAA     BBB     CCC     
DDD     EEE     FFF     
GGG     HHH     III     
JJJ     KKK     LLL     
MMM     NNN     OOO     
PPP     QQQ     RRR 

01)conection:com.mysql.jdbc.JDBC4Connection@6e70c7

02)pstn:com.mysql.jdbc.JDBC4PreparedStatement@29428e:INSERT INTO files_1 VALUES(**未指明未指明未指明**)< / p>

03)参数大小:6

04)如果:[[AAA,BBB,CCC],[DDD,EEE,FFF],[GGG,HHH,III],[JJJ,KKK,LLL],[MMM,NNN,OOO],[PPP ,QQQ,RRR]]

05)executeSQLUpdate:

06)对象:[AAA,BBB,CCC]

07)...................:1 [AAA,BBB,CCC]

08) _ __ _ __ _ ___ :1 [AAA,BBB,CCC]

05)executeSQLUpdate:

06)对象:[DDD,EEE,FFF]

07)...................:1 [DDD,EEE,FFF]

08) _ __ _ __ _ ___ :1 [DDD,EEE,FFF]

05)executeSQLUpdate:

06)对象:[GGG,HHH,III]

07)...................:1 [GGG,HHH,III]

08) _ __ _ __ _ ___ :1 [GGG,HHH,III]

05)executeSQLUpdate:

06)对象:[JJJ,KKK,LLL]

07)...................:1 [JJJ,KKK,LLL]

08) _ __ _ __ _ ___ :1 [JJJ,KKK,LLL]

05)executeSQLUpdate:

06)对象:[MMM,NNN,OOO]

07)...................:1 [MMM,NNN,OOO]

08) _ __ _ __ _ ___ :1 [MMM,NNN,OOO]

05)executeSQLUpdate:

06)对象:[PPP,QQQ,RRR]

07)...................:1 [PPP,QQQ,RRR]

08) _ __ _ __ _ ___ :1 [PPP,QQQ,RRR]

09)errorchk ...........: 11) * ** * * :没有为参数2指定值

java.sql.SQLException: No value specified for parameter 2
    at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:1075)
    at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:989)
    at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:984)
    at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:929)
    at com.mysql.jdbc.PreparedStatement.checkAllParametersSet(PreparedStatement.java:2560)
    at com.mysql.jdbc.PreparedStatement.fillSendPacket(PreparedStatement.java:2536)
    at com.mysql.jdbc.PreparedStatement.executeUpdate(PreparedStatement.java:2383)
    at com.mysql.jdbc.PreparedStatement.executeUpdate(PreparedStatement.java:2327)
    at com.mysql.jdbc.PreparedStatement.executeUpdate(PreparedStatement.java:2312)
    at com.project.bulk.ReadExcelFile.executeSQLUpdate(ReadExcelFile.java:112)
    at com.project.bulk.ReadExcelFile.MethodToData(ReadExcelFile.java:138)
    at com.project.bulk.ReadExcelFile.main(ReadExcelFile.java:39)

建立成功(总时间:3秒)

2 个答案:

答案 0 :(得分:3)

一个错误肯定是你增加i两次!!!

System.out.println("\n07)..................."+i++ + o); // one
pstmt.setObject(i++, o); // two

这意味着你不设置偶数索引,只设置奇数索引:1,3,5 ......

这应该纠正这个错误:

System.out.println("\n07)..................."+i + o); 
pstmt.setObject(i++, o); // only once, and after the evaluation!

修改 * 第二,但也是大错误 *

} catch(SQLException e) {
    System.out.println("\n11)************* :"+e); //WTF?
    //handle the error...    
}

请原谅我,这必须现在发生!

请为了我们和您(未来)同事的心理健康,请不要再这样做了!

打印例外必须采用以下两种方式之一:

  • logger.error(“message”,e);
  • e.printStackTrace();

由于这些保留了堆栈跟踪,因此可以正确调试代码

但是永远,永远,永远,永远不会!以这些方式发生:

  • System.out.print(e)
  • 是System.out.print(e.getMessage)
  • System.out.print(“message”+ e.getMessage)
  • logger.error(e.getMessage)

所以这应该是正确的:

} catch(SQLException e) {
    System.out.println("\n11)************* :"+e.getMessage()); 
    e.printStackTrace();
    //TODO: handle the error...    
}

顺便说一下:使用像log4j这样的正确日志记录非常值得时间!清理所有System.out。*需要花费更多的时间,而不是设置正确的loglevel ...

<强> EDIT2

至于SQL错误:

String sql = "INSERT INTO files_1 VALUES(?)"; 

此SQL行告诉DBMS它将有一个要处理的参数。该表有3列,因此您需要指定3个值。常量或参数(使用?)。所以你应该:

String sql = "INSERT INTO files_1 VALUES(?,?,?)"; 

答案 1 :(得分:1)

如错误所示

java.sql.SQLException: Invalid argument value: java.io.NotSerializableException

您正尝试使用此行中不可序列化的参数设置值:

pstmt.setObject(i++, o);

请确保您的所有值都是可以映射到StringDate等数据库列的基元或值。

您可以通过这样的行(使用日志记录框架或System.out.println找出您尝试设置的数据:

System.out.println("setObject: " + o + ", Class: " + o.getClass());