这是我用来将excel文件数据写入数据库的方法。
public static void executeSQLUpdate(String sql, List arguments) {
Connection con = null;
PreparedStatement pstmt = null;
try {
con = getConnection(); //a method that returns a java.sql.Connection to your database
System.out.println("
01)conection :"+con);
pstmt = con.prepareStatement(sql);
System.out.println("
02)pstn :"+pstmt);
System.out.println("
03)arguments size :"+arguments.size());
if (arguments != null) {
int i = 1;
System.out.println("
04)if :"+arguments);
for(Object o : arguments) {
System.out.println("
05)executeSQLUpdate");
System.out.println("
06)object."+o);
System.out.println("
07)................... :"+i + o);
pstmt.setObject(i, o);
System.out.println("
08)____________________"+i+o);
}
}
System.out.print("
09)errorchk........... :");
//method to execute insert, update, delete statements...
pstmt.executeUpdate();
System.out.print("
10)+++++++++++++++++ :");
} catch(SQLException e) {
System.out.println("
11)************* :"+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:INSERT INTO files_1 VALUES(**未指定,未指明,未指明**)
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秒)
不工作既不是有效的Java错误也不是有效的Excel错误。
除了我发现的错误之外,我还建议看一下输出是什么,因为我几乎可以肯定某种情况会被写入某处。 请通过编辑把它放在你的问题中!
我发布了我的输出。
我发布了我现在的输出。我做的错误是什么。??
作为一般性评论:请阅读有关JDBC和SQL的一般信息。 看起来你对这些技术缺乏一般性的了解。 找一个有效的例子,然后从那里开始。 对我来说,看起来整个for循环都是错误的。 基于INPUT语句和参数列表,看起来每个参数需要一个INSERT(每个参数有三个值)。 你现在这样做的方式永远不会奏效。
一个错误肯定是你增加i两次!
System.out.println("
07)..................."+i++ + o); // one
pstmt.setObject(i++, o); // two
这意味着你不设置偶数索引,只是奇数索引:1,3,5 ...
这应该纠正这个错误:
System.out.println("
07)..................."+i + o);
pstmt.setObject(i++, o); // only once, and after the evaluation!
编辑
*第二,但也是大错误*
} catch(SQLException e) {
System.out.println("
11)************* :"+e); //WTF?
//handle the error...
}
请原谅我,现在必须发生这种情况! sub>
对于我们和您(未来)同事的心理健康,请不要再这样做了!
打印例外必须以两种方式之一发生:
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("
11)************* :"+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(?,?,?)";
我纠正了这个错误。但同样的问题就在那里。
你修复了异常记录吗?完成后,您应该报告输出的内容。
我修复后发帖。
我不知怎的错过了。但是,看到这个,@ nwinkler发布的答案就是你所需要的!我不知道列表中存在哪些实例,您应该从中提取"基本类型"。
是的。我解决了这个问题。非常感谢。但之后又出现了另一个错误。请检查一下。我编辑了我的问题。
我发布了我现在的输出。我做的错误是什么。??
如您的错误所示
您正尝试使用此行中不可序列化的参数设置值:
pstmt.setObject(i++, o);
请确保所有值都是基本值或可以映射到数据库列的值,如String或Date。
您可以通过输入这样的行来找出您尝试设置的数据(使用日志框架或System.out.println:
System.out.println("setObject:" + o +", Class:" + o.getClass());
是的。我解决了这个问题。非常感谢。但之后又出现了另一个错误。请检查一下。我编辑了我的问题。
看起来您的SQL与表结构不匹配。如果不了解有关表或SQL的更多信息,就无法回答这个问题。请看这里类似的错误:stackoverflow.com/questions/5304613/
我的sql是String sql ="INSERT INTO files_1 VALUES(?)";在我的表中有3列。我应该改变什么?
@ user1705260你应该做到:String sql ="INSERT INTO files_1 VALUES(?,?,?)"; ?的数量应与你使用的参数相对应。
我做到了。但是它给出了这个错误now.com.mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorException:你的SQL语法有错误;检查与MySQL服务器版本对应的手册,以便在第1行的'?,?,?)'附近使用正确的语法
如何在插入查询中输入参数。
我发布了我现在的输出。我做的错误是什么。??
你没有递增i。正如您在调试语句07中看到的那样,您始终使用索引1设置值。