这是我用来将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秒)
答案 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...
}
请原谅我,这必须现在发生!
请为了我们和您(未来)同事的心理健康,请不要再这样做了!
打印例外必须采用以下两种方式之一:
由于这些保留了堆栈跟踪,因此可以正确调试代码
但是永远,永远,永远,永远不会!以这些方式发生:
所以这应该是正确的:
} 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);
请确保您的所有值都是可以映射到String
或Date
等数据库列的基元或值。
您可以通过这样的行(使用日志记录框架或System.out.println
找出您尝试设置的数据:
System.out.println("setObject: " + o + ", Class: " + o.getClass());