【发布时间】:2015-09-30 21:54:56
【问题描述】:
我被困住了。我拒绝长时间停留,所以我寻求帮助。我想要做的是将我从另一个数据库的 select 语句中检索的 ResultSet 放入 ArrayList 中,然后将数组列表转换为 Java 中的插入准备语句。
** 更新 ** 问题是我收到“java.sql.SQLException:参数索引超出范围(6 > 参数数量,即 5)”。这意味着它正在接收 6 个参数而不是 5 个,我看不出这是如何发生的。由于在调试器中我正在观察值是否正确更新,但我的逻辑现在不正确。
我运行调试器,发现我只是将所有值转储到第一个参数中。我明白我需要做什么。这是将 ArrayList 结果拆分为插入语句的每个参数。我的大脑已经死了。这是一天的结束,这是我拼图的最后一块,所以我可以继续前进。我只是不知道该怎么做。感谢您的帮助!
这就是我的结果 ArrayList 所持有的。
[800-0022-08, 0025, 2015-09-30, 600040, 115]
[800-0022-08, 0024, 2015-09-30, 600040, 115]
[800-0022-08, 0008, 2015-09-30, 600040, 115]
[800-0022-08, 0036, 2015-09-30, 600040, 115]
[800-0022-08, 0035, 2015-09-30, 600040, 115]
[800-0022-08, 0034, 2015-09-30, 600040, 115]
代码如下。
ResultSet rs = (ResultSet) stmt.executeQuery(query);
ResultSetMetaData rsmd = (ResultSetMetaData) rs.getMetaData();
int numberOfColumns = rsmd.getColumnCount();
int rowCount = 1
ArrayList <String[]> result = new ArrayList<>();
while (rs.next()) {
System.out.println("Row " + rowCount + ": ");
String[] row = new String[numberOfColumns];
for (i = 1; i < numberOfColumns + 1; i++) {
System.out.print(" Column " + i + ": ");
System.out.println(rs.getString(i);
row[i - 1] = rs.getString(i);
}
result.add(row);
System.out.println("");
rowCount++;
}
String Connection = "CONNECTIONSTRING";
String UserName = "USERNAME";
String Password = "PASSWORD";
String MySQLQuery = "INSERT INTO serial (MTSER_CODE, MTSER_SERIAL, MTSER_RECDATE, MTSER_WO, MTSER_WOSUF)" + "VALUES (?,?,?,?,?)";
String Driver = "org.gjt.mm.mysql.Driver";
Class.forName(Driver);
java.sql.Connection MyConnection = (java.sql.Connection) DriverManager.getConnection(Connection, UserName, Password);
java.sql.PreparedStatement preparedStmt;
preparedStmt = MyConnection.prepareStatement(MySQLQuery);
// ** UPDATED FOR LOOP **
for (String[] arr : result) {
try (java.sql.PreparedStatement preparedStmt = MyConnection.prepareStatement(MySQLQuery)) {
for (int q = 0; q < arr.length; q++) {
preparedStmt.setString(q + 1, arr[0]);
preparedStmt.setString(q + 2, arr[1]);
preparedStmt.setString(q + 3, arr[2]);
preparedStmt.setString(q + 4, arr[3]);
preparedStmt.setString(q + 5, arr[4]);
}
preparedStmt.execute();
} catch (SQLException e) {
e.printStackTrace();
}
}
迭代后的插入语句如下所示:
INSERT INTO serial (MTSER_CODE, MTSER_SERIAL, MTSER_RECDATE, MTSER_WO, MTSER_WOSUF)" + "VALUES ([800-0022-08, 0025, 2015-09-30, 600040, 115],** Not Specified **,** Not Specified **,** Not Specified **,** Not Specified **)
【问题讨论】:
-
我没有阅读所有内容,但
for(int p = 1; p < result.size(); p++)看起来很可疑:您的意思是不是for(int p = 0 ; p < result.size(); p++)(然后在setString中使用p+1)? -
尝试将
preparedStmt.executeUpdate();语句放在循环之外,看看是否有帮助。就像现在一样,您在设置所有参数之前执行PreparedStatement,因此出现异常 -
Titus 我将您的建议添加到代码中,但现在它抛出此错误。 “java.sql.SQLException: 参数索引超出范围(6 > 参数个数,即 5)。”