【问题标题】:Cannot update multiple times using for loop无法使用 for 循环多次更新
【发布时间】: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 发布在这里。

标签: java mysql jdbc


【解决方案1】:

试试类似 sn-p 的东西(我可能弄乱了你的变量类型,因为我猜到了。

    try {
     sInsertQuery = "INSERT INTO PULLOUT_REPORTS " +
                    "(control_number, dateofpullout, item_des, item_size, item_qty, pullout_from, pullout_to)" +
                    " values " +
                    "(?,?,?,?,?,?,?)";
      pInsertPullout = conn.prepareStatement(sInsertQuery);
      sUpdateRecord = "UPDATE maintable SET antip_qty = antip_qty - ? WHERE item_code = ? AND item_size = ?";
      pUpdateFrom = conn.prepareStatement(sUpdateRecord);
      sUpdateRecord1 = "UPDATE maintable SET binang_qty = binang_qty + ? WHERE item_code = ? AND item_size = ?";
      pUpdateTo = conn.prepareStatement(sUpdateRecord1);

      for (int iCtr=0; iCtr<idsplit.length; iCtr++) {
          pInsertPullout.setLong(1, cn);
          pInsertPullout.setLong(2, po);
          pInsertPullout.setString(3, idsplit[iCtr]);
          pInsertPullout.setString(4, issplit[iCtr]);
          pInsertPullout.setString(5, qtsplit[iCtr]);
          pInsertPullout.setString(6, fr);
          pInsertPullout.setString(7, to);

          pInsertPullout.executeUpdate();
          pInsertPullout.clearParameters();

            if (fr.equals("Antipolo") && to.equals("Binangonan")) {
                      pUpdateFrom.setString(1,qtsplit[iCtr]);
                      pUpdateFrom.setString(2,idsplit[iCtr]);
                      pUpdateFrom.setString(3,issplit[iCtr]);
                      pUpdateFrom.addBatch();


                      pUpdateTo.setString(1,qtsplit[iCtr]);
                      pUpdateTo.setString(2,idsplit[iCtr]);
                      pUpdateTo.setString(3,issplit[iCtr]);
                      pUpdateTo.addBatch();

                  } 
      }
      pUpdateFrom.executeBatch();
      pUpdateTo.executeBatch();
  }

  catch (Exception e) {
     response.sendRedirect("error.jsp");
  }

之后不要忘记清理资源。在 finally{} 子句中关闭语句和连接。

【讨论】:

    猜你喜欢
    • 2016-08-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多