-1

这是我用来将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)连接:com.mysql.jdbc.JDBC4Connection@6e70c7

02)pstn:com.mysql.jdbc.JDBC4PreparedStatement@29428e:插入文件_1值(**未指定未指定未指定**)

03)参数大小:6

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

05)执行SQL更新:

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

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

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

05)执行SQL更新:

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

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

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

05)执行SQL更新:

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

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

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

05)执行SQL更新:

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

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

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

05)执行SQL更新:

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

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

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

05)执行SQL更新:

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 秒)

4

2 回答 2

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("消息", e);
  • e.printStackTrace();

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

但永远不应该,永远,永远,永远!以下列任何一种方式发生:

  • System.out.print(e)
  • System.out.print(e.getMessage)
  • System.out.print("消息" + e.getMessage)
  • logger.error(e.getMessage)

所以正确的应该是:

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

顺便说一句:使用像 log4j 这样的正确日志记录非常值得花时间!清理所有 System.out.* 比设置适当的日志级别要花费更多的时间......

编辑2

至于SQL错误:

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

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

String sql = "INSERT INTO files_1 VALUES(?,?,?)"; 
于 2013-02-19T08:57:29.347 回答
1

如您的错误所示

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

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

pstmt.setObject(i++, o);

请确保您的所有值都是可以映射到数据库列(如String或)的原语或值Date

您可以通过输入这样的一行来找出您要设置的数据(使用日志框架或System.out.println

System.out.println("setObject: " + o + ", Class: " + o.getClass());
于 2013-02-19T09:16:15.357 回答