【问题标题】:nested loop wont execute queries in internal loop with length bigger than 1嵌套循环不会在长度大于 1 的内部循环中执行查询
【发布时间】:2011-11-02 09:46:10
【问题描述】:

抱歉,由于我的其他用户名和密码,我无法提供反馈,无论如何这里是问题:

我正在开发一个基于 SOAP 的 web 服务,其中一部分我必须使用嵌套循环对数据库执行一些查询,问题是内部循环只执行一次,然后就放弃了。这是代码:

for(int i=0; i<selec.length; i++){
  for(int j=0; j<sintom.length;j++){
    var[(i*sintom.length)+j] = 
      "INSERT INTO malattia (nome, eta,  descrizione, sesso, etnia, sintomi) "
      + "VALUES ('" + malattia + "','" + eta + "','" + descrizione + "','" 
      +  sexarra[0] + "','" + selec[i] + "','" + sintom[j] + "')";
  }
}

这是应该执行查询的地方:

if (errore.equals("")) {
  try {
    Statement st = conn.createStatement();
    for(int i=0; i<selec.length; i++){
      for(int j=0;j<sintom.length;j++){
        st.executeUpdate(var[(i*sintom.length)+j]);
      }
    }

发生的情况是,无论select 的大小如何,只要 sintom 的长度为 1,大于 1,它就可以正常工作,并且它不会工作。

更新
我只是使用了准备好的语句,但问题仍然存在,如果内部循环的长度大于1,它将不起作用!这是我所做更改的代码:

if (errore.equals("")) {
  try {
    /*  Statement st = conn.createStatement();
        Statement[] si=new Statement[selec.length];
        for(int i=0;i<selec.length;i++)
        si[i]=conn.createStatement();               */
   PreparedStatement ps = conn.prepareStatement(
     "INSERT INTO malattia (nome, eta, descrizione, sesso, etnia, sintomi) 
      values (?, ?, ?, ?, ?, ?)");


     for(int i=0; i<selec.length; i++){
       for(int j=0;j<sintom.length;j++){
         //  si[i].executeUpdate(var[(i*sintom.length)+j]);
         ps.setString(1, malattia);
         ps.setInt(2, eta);
         ps.setString(3, descrizione);
         ps.setString(4, sexarra[0] );
         ps.setString(5, selec[i]);
         ps.setString(6, sintom[j]);
         ps.executeUpdate();
       }
     }
   }  
   //st.executeUpdate(q);
   ps.close();
   conn.close();
   ris = "si";

完整的服务器代码:

             public String aggiungi_malattia(String malattia, int eta, String descrizione, String[] sexarra, String[] selec, String[] sintom) {
        String ris = "no";
         String errore = connetti();
         if (errore.equals("")) {
              try {
               PreparedStatement ps = conn.prepareStatement("INSERT INTO malattia (nome, eta, descrizione, sesso, etnia, sintomi) values (?, ?, ?, ?, ?, ?)");
          else {  
            for(int i=0; i<selec.length; i++){
                for(int j=0;j<sintom.length;j++){

                   //  si[i].executeUpdate(var[(i*sintom.length)+j]);
                   ps.setString(1, malattia);
                   ps.setInt(2, eta);
                   ps.setString(3, descrizione);
                   ps.setString(4, sexarra[0] );
                   ps.setString(5, selec[i]);
                   ps.setString(6, sintom[j]);

                   ps.executeUpdate();
                }
               }
            }



                   //st.executeUpdate(q);
                    ps.close();
                    conn.close();
                    ris = "si";
              } catch (SQLException e) {
                    System.out.println("Errore: " + e.getMessage());
                    return ris;
              }
        }
        return ris;
  }

服务器根据查询的成功返回 ris 或者 sino,这里我得到 si 如果 sintom 是内部循环的长度为 1 否则我得到 no 我不知道究竟是什么导致它以 响应>不此外,这是一个基于 SOAP 的 Web 服务,我可以调试系统的客户端部分而不是服务器部分

【问题讨论】:

  • 您是否遇到异常或您的程序是否干净地终止?
  • 实际上,因为它位于 Web 服务的服务器端,所以我无法准确看出是什么原因。假设内部循环的长度为 2,它将查询 Sintom[0],即第一个元素,但之后停止执行查询。
  • 如果您的代码在服务器上,那么您应该可以看到它。如果您看不到错误/输出,则很难提供帮助。我在你的代码中看不到任何明显的东西。
  • 当然这是我的代码 :) 我刚刚更新了问题,希望它能解决我的问题。感谢您的努力!
  • 我重新格式化了代码,很明显缺少一些东西——你有一个没有 if 的 else 等。请检查发布的代码。

标签: java mysql sql jdbc nested-loops


【解决方案1】:

经过数小时的努力,问题出现在了数据库中!!发生的事情是,由于列 sintomi 是一个 FK,它引用了一个多值的 Sintomi 表,因此它是表 malattia 的主键,所以我传递的值需要已经存在表 sintomi 所以列 sintomi 可以参考它!无论如何,从我提供的信息中无法理解,谢谢大家!一如既往地好,当事情失控时,你们会在那里。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-06-05
    • 2012-09-09
    • 1970-01-01
    相关资源
    最近更新 更多