【发布时间】:2015-07-28 03:29:03
【问题描述】:
我有一个表格,可以从 branchA 借股票到 branchB。用户可以输入多个产品,我通过使用 (",") 将文本区域分割并在其中放置一个数组来做到这一点。提交表单后,我将其插入一个表中,然后从另一个表中更新股票。这是我的代码(实际上是放在 JSP 文件中而不是普通的 Java 类中):
try {
for (int iCtr=0; iCtr<idsplit.length; iCtr++) {
sInsertQuery = "INSERT INTO PULLOUT_REPORTS (control_number, dateofpullout, item_des, item_size, item_qty, pullout_from, pullout_to) values ('"+cn+"','"+po+"','"+idsplit[iCtr]+"','"+issplit[iCtr]+"','"+qtsplit[iCtr]+"','"+fr+"','"+to+"')";
pInsertPullout = conn.prepareStatement(sInsertQuery);
pInsertPullout.executeUpdate();
if (fr.equals("Antipolo") && to.equals("Binangonan")) {
sUpdateRecord = "UPDATE maintable SET antip_qty = antip_qty - ? WHERE item_code = ? AND item_size = ?";
pUpdateFrom = conn.prepareStatement(sUpdateRecord);
pUpdateFrom.setString(1,qtsplit[iCtr]);
pUpdateFrom.setString(2,idsplit[iCtr]);
pUpdateFrom.setString(3,issplit[iCtr]);
pUpdateFrom.addBatch();
pUpdateFrom.executeBatch();
sUpdateRecord1 = "UPDATE maintable SET binang_qty = binang_qty + ? WHERE item_code = ? AND item_size = ?";
pUpdateTo = conn.prepareStatement(sUpdateRecord1);
pUpdateTo.setString(1,qtsplit[iCtr]);
pUpdateTo.setString(2,idsplit[iCtr]);
pUpdateTo.setString(3,issplit[iCtr]);
pUpdateTo.addBatch();
pUpdateTo.executeBatch();
} }
}
catch (Exception e) {
response.sendRedirect("error.jsp");
}
第一个查询成功地在表中插入了多行,但我的第二个查询只更新了数组中的第一个索引。我不知道我做错了什么,因为它们都在同一个循环中。
有什么帮助吗?
更新:我做了这个 .addBatch 和 .executeBatch 并且它工作了一段时间,现在它不再工作了。它只更新第一个索引。
【问题讨论】:
-
在“最佳实践”方面,在 JSP 中这样做是一个非常糟糕的主意。
-
@Santosh 有什么办法至少可以让它工作吗?
-
你能打印出 pUpdateFrom.executeUpdate 调用的结果吗?应该是更新影响的行数
-
能否请您粘贴完整的代码?这似乎是部分代码 sn-p。
-
这一切都很糟糕:您的第一条语句要求进行 SQL 注入,您为单个值执行批量插入更新,您没有错误日志记录,并且您说这是在 JSP 内部。但除此之外,如果输入值正确,它可以工作。 手动将其拆分:1/ 仅输出 idsplit、qtsplit 和 issplit 的值 2/ 在 mysql 控制台中手动使用这些值 3/ 在带有硬编码输入的小型 Java 程序中使用这些值和沉重的痕迹。第三步将是一个不错的 MVCE 发布在这里。